如何找出哪些寄存器用于系统调用?

如何找出哪些寄存器用于系统调用?

您如何知道系统调用需要使用哪些寄存器?每台机器的情况都不同吗?那么为什么是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 规范,然后使用函数参数的顺序和大小来确定它们进入哪个寄存器。

https://stackoverflow.com/questions/2535989/what-are-the-calling-conventions-for-unix-linux-system-calls-on-x86-64

您将需要为您想要定位的每个平台生成不同的程序集。但是,您可以合理地确定所有“Linux x86_64”平台都是二进制兼容的,对于 x86、ARM、PowerPC 等也是如此。但是还有 BSD :-)

这是 x86 和 x86_64 的一些备忘单(快速谷歌搜索)

但也要注意的是系统调用编号本身因平台而异,因此 x86_64 上的“open”为 3,但在 x86 上为 5。

相关内容