int 80 没有出现在汇编代码中
int 80 doesn't appear in assembly code
问题
让我们考虑一下:
int main(){
write(1, "hello", 5);
return 0;
}
我正在阅读一本书,建议上述代码的汇编输出应该是:
main:
mov , %eax
mov %ebx
mov %string, %ecx
mov $len, %edx
int [=11=]x80
(上面的代码是用32位架构编译的。寄存器传递参数不是由'64位寄存器传递参数约定'引起的,而是我们进行系统调用引起的。)
我的 64 位 Ubuntu 机器上的输出是:gcc -S main.c -m32
是:
pushl
pushl $string
pushl
call write
我的疑惑
所以这让我很困惑。为什么 gcc 将其编译为 "normal" 调用,而不是系统调用。
在这种情况下,有什么方法可以让处理器使用内核函数(如write)?
I am reading a book that suggests the assembly output for the above code should be ...
你不应该相信你读到的一切:-)
没有要求将 C 代码转换为特定的汇编代码,C 标准强制要求的唯一要求是生成的代码以某种方式运行。
是否通过直接使用int
(或sysenter
)调用OS系统调用来完成,或者是否通过调用来完成 最终 以类似方式调用 OS 的库例程 write()
在很大程度上是无关紧要的。
如果您找到并反汇编 write()
代码,您可能会发现它只是将这些值从堆栈中读取到寄存器中,然后调用 OS 的方式与您显示的代码包含 int
.
顺便说一句,如果您想将 gcc
移植到使用 call 5
执行 OS 级系统调用的完全不同的体系结构怎么办?如果 gcc
将特定的 int
调用注入汇编流,那将不会很好地工作。
但是,如果它正在注入对 write()
函数的调用,您所要做的就是确保 link 它使用包含修改后的 write()
函数的正确库(一个 call 5
而不是 int
).
问题
让我们考虑一下:
int main(){
write(1, "hello", 5);
return 0;
}
我正在阅读一本书,建议上述代码的汇编输出应该是:
main:
mov , %eax
mov %ebx
mov %string, %ecx
mov $len, %edx
int [=11=]x80
(上面的代码是用32位架构编译的。寄存器传递参数不是由'64位寄存器传递参数约定'引起的,而是我们进行系统调用引起的。)
我的 64 位 Ubuntu 机器上的输出是:gcc -S main.c -m32
是:
pushl
pushl $string
pushl
call write
我的疑惑
所以这让我很困惑。为什么 gcc 将其编译为 "normal" 调用,而不是系统调用。 在这种情况下,有什么方法可以让处理器使用内核函数(如write)?
I am reading a book that suggests the assembly output for the above code should be ...
你不应该相信你读到的一切:-)
没有要求将 C 代码转换为特定的汇编代码,C 标准强制要求的唯一要求是生成的代码以某种方式运行。
是否通过直接使用int
(或sysenter
)调用OS系统调用来完成,或者是否通过调用来完成 最终 以类似方式调用 OS 的库例程 write()
在很大程度上是无关紧要的。
如果您找到并反汇编 write()
代码,您可能会发现它只是将这些值从堆栈中读取到寄存器中,然后调用 OS 的方式与您显示的代码包含 int
.
顺便说一句,如果您想将 gcc
移植到使用 call 5
执行 OS 级系统调用的完全不同的体系结构怎么办?如果 gcc
将特定的 int
调用注入汇编流,那将不会很好地工作。
但是,如果它正在注入对 write()
函数的调用,您所要做的就是确保 link 它使用包含修改后的 write()
函数的正确库(一个 call 5
而不是 int
).