在c中执行汇编代码

在c中执行汇编代码,c,assembly,nasm,C,Assembly,Nasm,我想知道是否有方法调用.c汇编代码? 我想把这个代码放在我的.c文件中 我希望在.c文件中执行以返回地址的汇编代码 1. mov eax, 0x2d 2. mov ebx, 0 3. int 0x80 我知道答案是肯定的 这是.c文件的一部分: 1. void function(void) 2. { 3. void *sp; 4. sp = eax; 5. fprintf(stderr, "system break: %p\n", sp); 6. } 我怎样才能做到这一点?实现这一点的能

我想知道是否有方法调用.c汇编代码? 我想把这个代码放在我的.c文件中

我希望在.c文件中执行以返回地址的汇编代码

1. mov eax, 0x2d
2. mov ebx, 0
3. int 0x80
我知道答案是肯定的

这是.c文件的一部分:

1. void function(void)
2. {
3. void *sp;
4. sp = eax;
5. fprintf(stderr, "system break:   %p\n", sp);
6. }

我怎样才能做到这一点?

实现这一点的能力取决于编译器。Gcc允许这样做,而VisualStudio实现了


请注意,除了不可移植到其他体系结构的明显问题之外,包括任何内联程序集都会降低性能,因为编译器无法分析程序集以确定其是否无副作用、内联是否安全、是否访问全局资源,等等。

一些编译器实现了
\uuuasm\uuuu
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);
}
intfoo(inta,intb){
返回a+(b如果您想从C程序“执行”asm程序,您确实需要在“您的C源程序?Fergedit.lcc”中使用Nasm语法“放置”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

或者在你的C程序中只使用
sp=sbrk(0);
跳过asm…不会比使用int 80h更方便(但那会有什么乐趣呢?)


这是我的答案:)

您使用的是哪种C编译器?C代码应该做什么,eax中的值是什么,sp是什么?@hyde我使用的是gcc,sp只是一个变量,并且想要这样做,fprintf(stderr,“系统中断:%p\n”,sp);当我有sp,sp有eax值时,eax中的值类似于0x99AE000。我认为sp在这里只是C变量名,与堆栈指针无关。@hyde很可能:)但是,当上下文为“内联汇编”和“void*sp=eax;”,那么请原谅我的假设:)我现在如何调用该函数,使sp=return?sp=asm(“asm code”);?@WeigelGram否,但如果您在我提供的链接处阅读了文档,您就会知道。@WeigelGram我相信您必须编写
u asm(“mov%%eax,0x222”):“+r”(sp))这是一个很好的建议,但OP非常明确地表示希望将程序集放在他们的C源文件中。我现在不担心性能,只担心打印输出。所以我可以在我的.C文件中说asm(“代码素材”);我认为这个网站是一个更好的例子我想我想知道的关于内联汇编的一切我现在都知道了。问题的症结在于我没有/或者可能没有使用sp=sbrk(0)在我的c程序中;但无论如何谢谢。我认为您的解决方案也会起作用。您通常希望使用输入约束让编译器在
“int$0x80”
模板周围的寄存器中设置正确的值,但这是安全的。对于一些系统调用,您需要
内存
clobber,但这个不传递任何指针,因此不需要内存同步。无论如何,
asm volatile(“int$0x80”:“=a”(sp):“a”((n$NR\u brk),“b”(0));
将是一个不错的选择。另请参阅
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);
   }