2011-04-25 51 views
1

我在一個C程序中遇到了一段彙編代碼,我試圖在FreeBSD 64位上運行。gcc中彙編語句問題

void *curbrk; 
__asm__ __volatile__(
     "movl .curbrk, %%eax;" 
     "movl %%eax, %0" 
      : "=r" (curbrk) 
      :: "%eax" 
    ); 

我得到這樣的「MOV缺少後綴或操作數」(上面的代碼如下AT & T語法)什麼決定了語法,我應該在代碼中使用了錯誤 - 編譯器(GCC如下AT & T語法)或處理器(我正在使用英特爾處理器)。問題是由於代碼位於AT & T語法還是還有其他遺漏?

回答

4

如果您有64位GCC,除非使用-m32開關輸出32位目標代碼,否則上述代碼將無法完成,因爲64位指針值不適合32位EAX寄存器。使用-m32生成32位輸出,或者使用rax替換eax並將movl的值更改爲mov(不包含'l')

+0

您是否知道在GCC內聯中選擇「mov」而不是'movq'的基本原理amd64指令的彙編語法? – 2011-04-25 11:18:03

+1

@Pascal:您可以同時使用'mov'和'movq':'mov'指示彙編器「猜測」目標數據大小,而'movq'表示我們正在談論64位值。例如,'mov 0,foo'不會被編譯,因爲彙編器不知道變量'foo'的大小,而'mov 0,%% rax'會被隱式理解爲'movq',因爲'%rax '是一個64位寄存器。請注意,GCC不理解以上任何內容:使用內聯彙編,GCC只是將字符串轉儲到生成的程序集中(在替換'%'-things之後):_assembler_處理它。 – 2011-04-25 14:58:25