我有一个“hello world”程序的x86汇编代码。
global _start
section .text
_start:
mov eax, 1 ; system call for write
mov ebx, 1 ; file handle 1 is stdout
mov ecx, message ; address of string to output
mov edx, message_len ; length of the string
syscall ; invoke operating system to do the write
mov eax, 60 ; system call for exit
mov ebx, 0 ; exit code 0
syscall ; invoke operating system to ex
section .data
message: db "Hello, World!!!!", 10 ; newline at the end
message_len equ $-message ; length of the string
在64位Linux机器上,nasm -felf64 hello.asm && ld hello.o && ./a.out
无法编译。
但是如果我把第三行mov ecx, message
改为mov rsi, message
,它就可以工作了!
我的问题是为什么64位NASM坚持RSI寄存器?
因为我见过有人在32位Arch Linux上用ECX编译。
1条答案
按热度按时间dojqjjoe1#
在x86中,第一个参数是EBX,它包含描述符,ECX包含缓冲区,EDX包含长度,EAX包含系统调用序号。
在x64中,第一个参数包含在RDI中,第二个参数包含在RSI中,第三个参数包含在RDX中,第四个参数包含在RCX中,而RAX包含系统调用的序数。
这就是为什么您的呼叫可以在x86上工作,但需要进行调整以在x64上也能工作。