Articles of inline assembly

如何在gcc内联汇编中使用全局variables

我正在尝试像这样使用内联汇编,对于全局variables,但编译器通过说明对saved_sp的未定义引用给出错误。 __asm__ __volatile__ ( "movq saved_sp, %rsp\n\t" ); saved_sp全局声明为static long saved_sp (对于一个文件)。 我在这里犯了什么错误?

Linux汇编错误“在'asm'中不可能的约束

我从Linux下的汇编开始。 我已经将下面的代码保存为testasm.c 并编译为:gcc testasm.c -otestasm 编译器回复:“asm'中不可能的约束”。 #include <stdio.h> int main(void) { int foo=10,bar=15; __asm__ __volatile__ ("addl %%ebx,%%eax" : "=eax"(foo) : "eax"(foo), "ebx"(bar) : "eax" ); printf("foo = %d", foo); return 0; } 我该如何解决这个问题? (我从这里复制了这个例子。) Debian Lenny,内核2.6.26-2-amd64 gcc版本4.3.2(Debian 4.3.2-1.1) 分辨率 : 看到接受的答案 – 看起来“修改”的条款不再支持。

系统调用从GCC内联汇编

是否有可能使用内联汇编块内的系统调用编写单个字符? 如果是的话,怎么样? 它应该看起来像这样的东西: __asm__ __volatile__ ( " movl $1, %%edx \n\t" " movl $80, %%ecx \n\t" " movl $0, %%ebx \n\t" " movl $4, %%eax \n\t" " int $0x80 \n\t" ::: "%eax", "%ebx", "%ecx", "%edx" ); $ 80是ascii中的“P”,但是不会返回任何结果。 任何build议非常感谢!

如何在内联程序集(x86 / amd64 linux)中通过sysenter调用系统调用?

我们如何直接在x86 Linux中使用sysenter / syscall实现系统调用? 任何人都可以提供帮助吗? 如果你也可以显示amd64平台的代码,那将会更好。 我知道在x86中,我们可以使用 __asm__( " movl $1, %eax \n" " movl $0, %ebx \n" " call *%gs:0x10 \n" ); 间接路由到sysenter。 但是我们如何直接使用sysenter / syscall来编写系统调用? 我find一些材料http://damocles.blogbus.com/tag/sysenter/ 。 但仍然觉得很难弄清楚。

如何在C中find函数的返回地址?

我正在尝试在C和GCC中使用less量的AT&T风格的内联汇编,在这里阅读一篇关于CodeProject的文章。 我希望这样做的主要原因是findEIP寄存器的旧值,以便能够在我的代码中拥有可靠的指令地址。 我已经写了一个简单的示例程序来展示我对这个概念迄今为止的理解: #include <stdio.h> #include <stdlib.h> int mainReturnAddress = 0; int main() { asm volatile ( "popl %%eax;" "pushl %%eax;" "movl %%eax, %0;" : "=r" ( mainReturnAddress ) ); printf( "Address : %d\n", mainReturnAddress ); return 0; } 这个例子的目的是从堆栈顶部popup4个字节,表示从EIP寄存器保存的32位返回地址,然后将其推回堆栈。 之后,我将其存储在全局mainReturnAddressvariables中。 最后,我打印存储在mainReturnAddress中的值。 我从这个代码4200560收到的输出。 这段代码是否达到上述目的,是Windows平台32位上的交叉处理器吗?