2011-11-01 79 views
2

在x86的gcc內聯程序集中,如何移動標籤在寄存器中的地址。它應該是什麼,而不是$標籤在這裏,因爲彙編程序錯誤未定義的參考標籤如何在寄存器中移動標籤的地址

請注意,該標籤在asm塊之外,即在正常的C代碼內。

 __asm__ __volatile__ ("movl $label, %eax;"); 
label: 
     ..... 
+1

是什麼錯誤? – ughoavgfhw

+1

你在用什麼彙編語言? gcc內聯彙編?加油站 ? nasm? –

回答

0

我得到了它,標籤也應被包裹在一個組裝塊,像這樣...

__asm__ __volatile__ ("label:"); 
2

你可以這樣做:

register unsigned long eax __asm__("eax"); // See [1] 
eax = &&label; // See [2] 

label: 
    // some code 

但是,請注意:GCC可以在優化條件下自由地重新訂購代碼,因此C label可能並不完全符合您的預期。

如果您需要精確放置label(例如,因爲某些彙編代碼會跳轉到該代碼),您最好在彙編中編寫整個代碼。

[1] http://gcc.gnu.org/onlinedocs/gcc/Local-Reg-Vars.html#Local-Reg-Vars

[2] http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html