您如何知道系统调用需要使用哪些寄存器?每台机器的情况都不同吗?那么为什么是eax、ebx等呢?我怎样才能找到我的机器?每个处理器都会有不同吗,我的意思是i586和i386会有区别吗?
_start: ; entry point for commands
; use the write syscall to print 'Hello world!' to stdout
mov eax, 4 ; move syscall 4(write) to the eax register
mov ebx, 1 ; move field descriptor for stdout to ebx
mov ecx, msg ; move the memory address of our string to ecx
mov edx, 13 ; move the length of the string to edx
int 0x80 ; execute the syscall
section .data
msg: db “Hello world!”, 0x0a ; the string, followed by a new line character
答案1
每个架构都定义了一个“ABI”(应用程序二进制接口),它基本上表示“第一个参数放在这里,第二个参数放在这里,第三个参数放在这里......返回值返回这里”。您阅读 ABI 规范,然后使用函数参数的顺序和大小来确定它们进入哪个寄存器。
您将需要为您想要定位的每个平台生成不同的程序集。但是,您可以合理地确定所有“Linux x86_64”平台都是二进制兼容的,对于 x86、ARM、PowerPC 等也是如此。但是还有 BSD :-)
这是 x86 和 x86_64 的一些备忘单(快速谷歌搜索)
但也要注意的是系统调用编号本身因平台而异,因此 x86_64 上的“open”为 3,但在 x86 上为 5。