assembly 为什么64位NASM坚持使用RSI寄存器?为什么我不能把“hello world”放到RCX寄存器中并使用SYSCALL?

ovfsdjhp  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(152)

我有一个“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编译。

dojqjjoe

dojqjjoe1#

  • x86使用的调用约定与x64* 不同。

在x86中,第一个参数是EBX,它包含描述符,ECX包含缓冲区,EDX包含长度,EAX包含系统调用序号。
在x64中,第一个参数包含在RDI中,第二个参数包含在RSI中,第三个参数包含在RDX中,第四个参数包含在RCX中,而RAX包含系统调用的序数。
这就是为什么您的呼叫可以在x86上工作,但需要进行调整以在x64上也能工作。

相关问题