我正在尝试使用面向x86 GNU / Linux体系结构的 NASM 打印单个字符或数字。
这是我正在使用的代码:
section .text
global _start
_start:
; Linux printing preparation
mov eax,4
mov ebx,1
; Print 'A' character
mov ecx,'A' ; ecx should contain the value to print
mov edx,1 ; edx should contain how many characters to print
int 80h
; System exit
mov eax,1
mov ebx,0
int 80h
但是,运行此代码不会打印任何内容。我究竟做错了什么?
ecx
应该包含一个指向char缓冲区开始的指针。因此,您必须将缓冲区存储在内存中。您可以执行以下操作:
; Print 'A' character
mov eax, 4 ; __NR_write from asm/unistd_32.h (32-bit int 0x80 ABI)
mov ebx, 1 ; stdout fileno
push 'A'
mov ecx, esp ; esp now points to your char
mov edx, 1 ; edx should contain how many characters to print
int 80h ; sys_write(1, "A", 1)
; return value in EAX = 1 (byte written), or error (-errno)
add esp, 4 ; restore esp if necessary
您可以mov byte [esp], 'A'
或其他任何地址(如果可以的话)覆盖堆栈中的所有内容。
或者,您可以使用一个字符数组来section .rodata
代替即时存储。
制作一个write()
系统调用与const void *buf
ARG是些小号(像'A'
)将使其返回-EFAULT
,不打印任何东西。内核仍然必须检查指针,并且系统调用将返回错误,而不是在错误的指针上引发SIGSEGV。
使用strace ./my_program
跟踪你的系统调用 实际上 做,包括返回值进行解码。
问题内容: 当我有一个字符串,如: 使用时,如何让Java打印实际的转义字符(而不将其解释为转义字符)? 例如,打电话时 我想看看: 并不是: 我希望看到用于调试目的的实际转义符。 问题答案: 一种方法是: 然后你跑了。
我想打印一个字符串作为valuei尝试遵循宏[2]和“set”[1]选项,但仍然没有运气; [1] 我怎样才能使我的速度测试版打印像;?
问题内容: 我曾尝试打印它,但由于它是转义字符,因此只是通过而已。例如,输出应如下。 提前致谢 问题答案: 为此以及将来的参考:
我对Java相当陌生,我想打印字符串中字符的频率(“过滤”)。我将输入过滤到只剩下“az”数组中的字符的位置。在我看来,这应该行得通,但我显然做错了什么,因为我要么收到错误消息(“超出范围”),要么就是打印的值不正确。
问题内容: 假设我在寄存器中有一个整数,该如何打印?您可以显示一个简单的示例代码吗? 我已经知道如何打印一个字符串,例如“ hello,world”。 我正在Linux上进行开发。 问题答案: 如果您已经在Linux上,则无需自己进行转换。只需使用printf即可: 请注意,由于使用了cdecl调用约定,因此我们需要在此之后恢复堆栈指针,即,将每个传递给函数的参数添加4个字节。
问题内容: 这是字典 使用这个 它打印以下内容: 但是我希望程序像这样打印它: 我刚刚开始学习字典,所以不确定如何执行此操作。 问题答案: 输出: