[英]executing assembly code in c
我想知道是否有调用 .c 汇编代码的方法? 我想将此代码放在我的 .c 文件中
我想在 .c 文件中执行以返回地址的汇编代码
1. mov eax, 0x2d
2. mov ebx, 0
3. int 0x80
我知道答案是 put eax。
这是 .c 文件的一部分:
1. void function(void)
2. {
3. void *sp;
4. sp = eax;
5. fprintf(stderr, "system break: %p\n", sp);
6. }
我该怎么做?
这样做的能力是特定于编译器的。 Gcc 允许使用它的asm
关键字扩展名,而 Visual Studio 实现了一个不同的扩展名。
请注意,除了不可移植到其他架构的明显问题外,包括任何内联汇编都会降低性能,因为编译器无法分析汇编以确定它是否无副作用、内联是否安全、是否访问全局资源, 等等。
一些编译器将__asm__
或asm
关键字实现为 C 语言的扩展:
__asm__(
"mov eax, 0x2d\n"
"mov ebx, 0\n"
"int 0x80\n"
);
括号中的代码将被逐字复制到汇编器的输入中。 例如,可以在此处找到有关 GCC 如何实现此功能的更多文档。
顺便说一句,如果你想改变堆栈指针的值(为什么? ),你可以在一行中完成:
__asm__("mov esp, eax");
如果使用 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 重命名为其他内容)
从那个特定的函数可以观察到,编译器把结果放在哪里,以及编译器把第一个和第二个参数放在哪个地址或寄存器中。
它比学习带有读、写、clobber 列表的 asm-templates 稍微快一点。
您真的需要将 Nasm 语法中的 asm 源代码“放入”您的 C 源程序中吗? 弗格编辑。 lcc 也许......如果你想从你的 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
组装nasm -f elf getbrk.asm
,放入sp=getbrk();
在你的 C 文件中,编译gcc -m32 -O3 -o myprog myprog.c getbrk.o
或者只是sp=sbrk(0);
在你的 C 程序中并跳过 asm... 不会比使用 int 80h 更便携。 (但那会有什么乐趣呢?):)
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);
}
这是我的答案:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.