测试平台为Linux 32位。 (但也欢迎 Windows 32 位上的某些解决方案)
这是一个c代码片段:
int a = 0;
printf("%d\n", a);
如果我使用 gcc 生成汇编代码
gcc -S test.c
然后我会得到:
movl $0, 28(%esp)
movl 28(%esp), %eax
movl %eax, 4(%esp)
movl $.LC0, (%esp)
call printf
leave
ret
此汇编代码需要链接到 libc 才能工作(因为调用 printf)
我的问题是:
是否可以仅将 C 转换为 asmexplicit using 系统自动调用,不使用libc?
像这样:
pop ecx
add ecx,host_msg-host_reloc
mov eax,4
mov ebx,1
mov edx,host_msg_len
int 80h
mov eax,1
xor ebx,ebx
int 80h
直接调用int 80h软件中断。
是否可以?如果是这样,有没有解决这个问题的工具?
谢谢你!
不是来自该源代码。致电printf()
编译器无法将其转换为对write
系统调用——printf()
库函数包含系统调用中不存在的大量逻辑(例如处理格式字符串以及将整数和浮点数转换为字符串)。
可以直接生成系统调用,但只能使用内联汇编。例如,要生成对_exit(0)
(与exit()
!),你会写:
#include <asm/unistd.h>
...
int retval;
asm("int $0x80" : "=a" (retval) : "a" (__NR_exit_group), "b" (0) : "memory");
有关 GCC 内联汇编的更多信息,特别是关于我在这里使用的将变量映射到寄存器的约束,请阅读GCC 内联组装 HOWTO http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html。它相当旧,但仍然完全相关。
请注意,这样做是不建议。系统调用的确切调用约定(例如,哪些寄存器用于调用号和参数,如何返回错误,etc)在不同的体系结构、操作系统,甚至 32 位和 64 位 x86 之间都有所不同。以这种方式编写代码将使其非常难以维护。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)