繁体   English   中英

在c中执行汇编代码

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM