最近在优化一段代码的过程中,用到了gcc的内联汇编。代码中有用到了许多全局变量,比如:charmi[10]={...};开始的时候,我对全局变量的取址是这样的:__asm__("movq (%2, %1, 1 ), %0":"=r"(cookie):"r"(index),"r"(mi));在一个函数中使用这段代码,一条指令完成了对mi数组的访问,但同时也存在问题,即mi的地址会占用一个寄存器,mi的地址要在早先的时间内被装载到寄存器中(指令由编译器自动生成),同时,被mi占用的寄存器有些情况下不能被其他手工内联的汇编指令随便写入,编译器还没有那么智能帮你讲寄存器的内容保存好。综上,使用这种方法会存在两方面问题:1、使用至少两条指令来读取全局变量2、正确性要小心呵护。但是,在gcc的O2选项下访问mi变量的时候,因为全局变量的地址在编译时是可以确定的,所以这样的代码inttmp=mi[3];反汇编出来是mov0x405600(%eax),%ebx;其中,eax中存的是index,也就是3,ebx是tmp。0x405600是全局变量mi的地址,在编译时就确定了这个地址,所以直接写在指令中了。由于没系统的学过内联汇编的语法,所以不知道怎么在C语言中直接嵌入全
...
继续阅读
(18)