深入探索C与C++中的内联汇编及调用汇编库
1. 内联汇编基础操作
在C和C++程序中运用内联汇编代码,能让我们把汇编语言函数嵌入到程序里,将程序变量传递给汇编代码,并把汇编代码的输出存于C程序变量中。下面详细介绍内联汇编的几种常见操作。
1.1 寄存器使用与更改寄存器列表
在 changedtest.c 程序里,内联汇编代码借助EAX寄存器作为中间位置来存储数据值。由于该寄存器未被声明为输入或输出值,所以必须把它列入更改寄存器列表。编译器知晓EAX寄存器不可用后,会进行相应处理。输入和输出值使用 r 约束声明,这样编译器就能自行选择要使用的寄存器。生成的汇编代码如下:
movl $10, -4(%ebp)
movl $20, -8(%ebp)
movl -4(%ebp), %ecx
movl -8(%ebp), %edx
#APP
movl %ecx, %eax
addl %eax, %edx
#NO_APP
movl %edx, %eax
此代码把C变量移入寄存器时使用了ECX和EDX寄存器,编译器特意避开使用EAX寄存器,因为它已在内联汇编代码中被声明使用。
1.2 使用内存位置
尽管在内联汇编代码中使用寄存器速度更快,但也能直接使用C变量的内存位置。 m 约束可用于在输入和输出值中引用内存位置。不过,对于需要寄存器的汇编指令,仍需使用寄存器,可能要定义中间寄存器来保存数据。 mem
超级会员免费看
订阅专栏 解锁全文
1030

被折叠的 条评论
为什么被折叠?



