在c中执行汇编代码

时间:2012-11-03 08:33:48

标签: c assembly nasm

我想知道是否有办法调用.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. }

我该怎么做?

5 个答案:

答案 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);
   }

这是我的答案:)