正确使用GCC inline assemble 中的 clobber
2010-12-05 19:15
323 查看
clobber的正确使用方法是:如果inline assemble代码使用了没有被初始化地声明为输入值或者输出值的任何其他寄存器,则要通知编译器,编译器必须知道这些寄存器,以便避免使用它们。
看一个例子:
#include <stdio.h>
int main(int argc, char **argv)
{
int data = 10;
int result = 20;
__asm__ __volatile__ ( ".text /n/t"
"movl %1, %%eax /n/t"
"addl %%eax, %0 /n/t"
: "+r" (result)
: "r" (data)
: "eax");
printf("data = %d/nresult = result + data = %d/n", data, result);
return 0;
}
在这个例子中,inline assemble代码将%eax用作存储中间数据。因为这个寄存器没有被声明为输入值或者输出值,所以必须在clobber中包含它。
现在编译器知道%eax不可用,它会避免使用这个寄存器。使用constraint "r"声明输入值,"+r"声明输出值,这使编译器能够选择要使用的寄存器。查看生成的汇编语言代码,可以发现选择了哪些寄存器:
movl $10, 24(%esp)
movl $20, 28(%esp)
movl 24(%esp), %ecx /* data使用%ecx */
movl 28(%esp), %eax /* 编译器正确地避免使用%eax,因为在inline assemble代码中声明了要使用它 */
movl %eax, %edx /* result使用%edx寄存器 */
#APP
# 9 "clobber_test.c" 1
.text
movl %ecx, %eax
addl %eax, %edx
# 0 "" 2
#NO_APP
movl %edx, 28(%esp)
*NOTE*
CLOBBER有个奇怪的地方:如果在inline assemble之内使用了没有在输入值或者输出值中定义的任何内存位置,那它必须被标记为
“被迫坏的“。在clobber中使用"memory"这个词通知编译器这个内存位置在inline assemble代码中被破坏!!!!!!
看一个例子:
#include <stdio.h>
int main(int argc, char **argv)
{
int data = 10;
int result = 20;
__asm__ __volatile__ ( ".text /n/t"
"movl %1, %%eax /n/t"
"addl %%eax, %0 /n/t"
: "+r" (result)
: "r" (data)
: "eax");
printf("data = %d/nresult = result + data = %d/n", data, result);
return 0;
}
在这个例子中,inline assemble代码将%eax用作存储中间数据。因为这个寄存器没有被声明为输入值或者输出值,所以必须在clobber中包含它。
现在编译器知道%eax不可用,它会避免使用这个寄存器。使用constraint "r"声明输入值,"+r"声明输出值,这使编译器能够选择要使用的寄存器。查看生成的汇编语言代码,可以发现选择了哪些寄存器:
movl $10, 24(%esp)
movl $20, 28(%esp)
movl 24(%esp), %ecx /* data使用%ecx */
movl 28(%esp), %eax /* 编译器正确地避免使用%eax,因为在inline assemble代码中声明了要使用它 */
movl %eax, %edx /* result使用%edx寄存器 */
#APP
# 9 "clobber_test.c" 1
.text
movl %ecx, %eax
addl %eax, %edx
# 0 "" 2
#NO_APP
movl %edx, 28(%esp)
*NOTE*
CLOBBER有个奇怪的地方:如果在inline assemble之内使用了没有在输入值或者输出值中定义的任何内存位置,那它必须被标记为
“被迫坏的“。在clobber中使用"memory"这个词通知编译器这个内存位置在inline assemble代码中被破坏!!!!!!
相关文章推荐
- CSS 中 display:inline-block 属性使用详解
- gcc2.95下 使用ns2.1b8a-allinone 然后配合ns2.30中的ns外其他组件进行安装 ns2.1b8a 同时使得nam中文字得以显示
- Scanner.findInLine()与while的使用莫名其妙的导致NoSuchElementException: No line found
- Flex AIR: 使用透明 NativeWindow 窗体呈现 Line Chart 的一个 bug (Exception in CartesianChart/updateMultipleAxesStyles)
- 关于正确使用PHP的in_array数组
- CSS 中 display:inline-block 属性使用详解
- Line-in和Mic-in的区别和使用及Line-out
- ansible 下lineinfile详细使用
- GCC Inline Assembly 实现互斥锁
- I hate GCC inline Assembly
- 使用CodeWarrior编译时出现Warning:C12056 SP debug info incorrect because of optimization or inline assembler
- 【Linux学习笔记】Linux C中内联汇编的语法格式及使用方法(Inline Assembly in Linux C)
- GCC内联汇编(inline assembly)
- Linux C中内联汇编的语法格式及使用方法(Inline Assembly in Linux C)
- gcc inline
- SH4 inline assemble
- error C2027: 使用了未定义类型“T” template < typename T > inline T min(T a, T b)
- DIV横排/竖排滚动(white-space/::-webkit-scrollbar的使用技巧以及display: inline-block的选择)支持手势
- 如何正确的使用Lerp In Unity
- ARM GCC Inline Assembler Cookbook