【发布时间】:2020-11-27 12:43:15
【问题描述】:
我想用 SysV ABI x86_64 程序集编写程序,到目前为止,我已经非常随机地在寄存器中传递了参数。
但我刚刚在这个论坛上看到,有一个标准。我们必须通过 RDI、RSI、RDX 和 RCX(按照确切的顺序)。
现在我问自己两个问题。
首先,ESI 和 EDI 不应该只在字符串操作期间使用吗?如果我想将整数作为参数而不是字符串传递会发生什么?
其次,如果我需要传递 32 位参数而不是 64 位参数怎么办?例如,如果我想为系统调用write 创建一个标识符,我会这样写:
;; void write(int fd, const void *buf, size_t count);
;; Inputs : ESI = offset string, EDX = number of characters to write, EBX = file descriptor
;; Outputs : <none>
;; Clobbers : <none>
write:
mov ecx, esi
mov eax, 4
int 0x80
ret
但是使用标准,如何将值从 64 位寄存器移动到 32 位寄存器?因为我做不到:
mov ecx, rdi ; impossible
【问题讨论】:
-
相关:What happens if you use the 32-bit int 0x80 Linux ABI in 64-bit code? - 正常的写入包装器将是
mov eax, 1/syscall,因为 x86-64 Linux 系统调用约定接近 x86-64 System V 函数调用约定,匹配前 3 个参数。
标签: assembly x86-64 calling-convention