閱讀273 返回首頁    go 阿裏雲 go 技術社區[雲棲]


[原創]gcc內聯匯編語法的一個缺陷



首先要說的是,這個所謂的"缺陷"可能早已有官方的處理辦法,可能我還不知
道罷了-_-b,如果哪位知道請告知,感謝!

gcc的at&t 中關於間接尋址的語法和intel語法有些不同,比如:

intel:        mov [offset str + ebx * 4 + 20],011223344h

at&t:         movl $0x11223344,20[str,ebx,4]

注意在這裏at&t語法有個例外,即一般的在at&t中立即數前要加字符$,比如上麵
的$0x11223344,但在disp和scale中的立即數中一定不能加$!

就是條給了gcc中的嵌入匯編帶來點小麻煩。對於(i)(4)類型的輸入形變量,會
在生成的asm中加上一個$,即變成$4。這在一般的情形是對的,但在上麵
談到的情況下就會導致錯誤。

還是采用變通的方法吧:

    char str[BUFSIZE]={0};
    int index=100,scale=4;
   
    //sim movl $0x11223344,disp(base,index,scale)
    __asm__ __volatile__("addl %0,%1;"
                        "addl %2,%1;"
                        "movl $0x11223344,(%1)"
                        ::"i"(11)/*disp*/,"D"(str)/*base*/,"b"(index*scale)/
                        /*sim index,scale*/);



最後更新:2017-04-02 00:06:29

  上一篇:go 悼念
  下一篇:go 現代社會