为什么不能从一个寄存器sys_write?

; NASM push 30 ; '0' mov rax, 4 ; write mov rbx, 1 ; stdout mov rcx, rsp ; ptr to character on stack mov rdx, 1 ; length of string = 1 int 80h 

上面的代码不打印任何东西到标准输出。 它在我给它一个字节的section .data 。 我究竟做错了什么?

amd64使用不同的方法进行系统调用,而不是int 0x80 ,尽管这可能仍然适用于32位库的安装等。而在x86可以这样做:

 mov eax, SYSCALL_NUMBER mov ebx, param1 mov ecx, param2 mov edx, param3 int 0x80 

amd64人们会这样做:

 mov rax, SYSCALL_NUMBER_64 ; different from the x86 equivalent, usually mov rdi, param1 mov rsi, param2 mov rdx, param3 syscall 

对于你想要做的,考虑下面的例子:

  bits 64 global _start section .text _start: push 0x0a424242 mov rdx, 04h lea rsi, [rsp] call write call exit exit: mov rax, 60 ; exit() xor rdi, rdi ; errno syscall write: mov rax, 1 ; write() mov rdi, 1 ; stdout syscall ret 

十进制30是ASCII“记录分隔符”的代码。 无论如何,这可能不是一个可打印的字符。

另一方面,30个十六进制(NASM术语中的30h或0x30)是ASCII“0”的代码。

另外,您需要使用64位ABI。