我想知道是否有办法调用.c汇编代码? 我想把这段代码放在我的.c文件中
我想在.c文件中执行汇编代码以返回地址
1. mov eax, 0x2d
2. mov ebx, 0
3. int 0x80
我知道答案是eax。
这是.c文件的一部分:
1. void function(void)
2. {
3. void *sp;
4. sp = eax;
5. fprintf(stderr, "system break: %p\n", sp);
6. }
我该怎么做?
答案 0 :(得分:6)
执行此操作的能力是特定于编译器的。 Gcc允许这个using its asm
keyword extension,而Visual studio实现different extension。
请注意,除了对其他体系结构不可移植的明显问题之外,包括任何内联汇编都会降低性能,因为编译器无法分析程序集以确定它是否无副作用,是否可以安全内联,是否访问全局资源,等等。
答案 1 :(得分:2)
有些编译器将__asm__
或asm
个关键字实现为C语言的扩展:
__asm__(
"mov eax, 0x2d\n"
"mov ebx, 0\n"
"int 0x80\n"
);
括号中的代码将逐字复制到汇编程序的输入。有关如何(例如,GCC实现此功能)的更多文档可以找到here。
顺便说一句,如果你想改变堆栈指针的值(为什么?),你可以在一行中完成:
__asm__("mov esp, eax");
答案 2 :(得分:1)
另一种方法,例如,使用gcc,首先要编译一些非常简单的函数而不进行优化:
int foo(int a, int b) {
return a+(b<<3);
}
gcc -S foo.c
并使用foo.s作为模板。之后可以编译并链接这些文件
gcc main.c foo.s
(并确保删除foo.c文件/将foo.s重命名为其他内容)
从那个特定的函数可以观察到,编译器放置结果,编译器放置第一个和第二个参数的地址或寄存器。
这比使用read,write,clobber list学习asm-templates要快一些。
答案 3 :(得分:1)
你真的需要&#34;把&#34;在Nasm语法中的asm源&#34;在&#34;你的C源程序? Fergedit。 lcc也许......如果你想&#34;执行&#34;你的C程序中的asm程序......
global getbrk
section .text
getbrk:
push ebx ; C likes it saved
mov eax, 45 ; __NR_brk
xor ebx, ebx ; get current break
int 80h
pop ebx
ret
global getbrk
section .text
getbrk:
push ebx ; C likes it saved
mov eax, 45 ; __NR_brk
xor ebx, ebx ; get current break
int 80h
pop ebx
ret
汇编,将
nasm -f elf getbrk.asm
放入C档,编译sp=getbrk();
或者只是你的C程序中的gcc -m32 -O3 -o myprog myprog.c getbrk.o
并且跳过asm ...不会比使用int 80h更便携。 (但那有什么乐趣?):)
答案 4 :(得分:1)
void function(void){
void *sp
__asm__ volatile(
"movl $0x2d, %%eax;"
"movl $0, %%ebx;"
"int $0x80"
:"=a"(sp)
:
:"%ebx"
);
fprintf(stderr, "system break: %p\n",sp);
}
这是我的答案:)