2014-04-11 115 views
1

我有一個GNU C程序下面的代碼:如何將64位指針移入RAX寄存器?

void *segment = malloc(1024); 
asm volatile("mov $%0, %%rax" : : "r" (segment)); 

而且我得到以下錯誤:

Error: illegal immediate register operand %rax 

有什麼不對%rax

+0

代碼有什麼問題......因爲你可以改爲'asm(「」::「a」(segment));' - 也就是說,不需要直接將任何東西直接移動到'%rax'中寄存器修飾符'「a」'說「我希望這個值在'[ER] AX'中傳遞/返回」。上面的程序集沒有意義 - 編譯器會拋出它。請澄清你想用'RAX'中的值做什麼。 –

回答

0

雖然FrankH的觀點是有效的,但嚴格來說這個錯誤的原因是美元符號。彙編程序中的美元符號用於表示常量。所以「mov $ 1,%% eax」可以工作。但是,您的代碼會生成:

mov $%rax, %rax 

$%rax是無意義的並會生成錯誤。這將解決該錯誤:

void *segment = malloc(1024); 
asm volatile("mov %0, %%rax" : : "r" (segment)); 

由於malloc的將RAX返回它的價值,這將(最有可能)產生 「MOV%RAX,RAX%」。

換句話說,它仍然是無意義的,不安全的和低效率的,但它會編譯沒有錯誤。

假設這段代碼不僅僅是一個實驗來教你一些關於使用asm的東西,你還需要提供更多的細節來獲得更有用的答案。