1
我有一個GNU C程序下面的代碼:如何將64位指針移入RAX寄存器?
void *segment = malloc(1024);
asm volatile("mov $%0, %%rax" : : "r" (segment));
而且我得到以下錯誤:
Error: illegal immediate register operand %rax
有什麼不對%rax
?
我有一個GNU C程序下面的代碼:如何將64位指針移入RAX寄存器?
void *segment = malloc(1024);
asm volatile("mov $%0, %%rax" : : "r" (segment));
而且我得到以下錯誤:
Error: illegal immediate register operand %rax
有什麼不對%rax
?
雖然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的東西,你還需要提供更多的細節來獲得更有用的答案。
代碼有什麼問題......因爲你可以改爲'asm(「」::「a」(segment));' - 也就是說,不需要直接將任何東西直接移動到'%rax'中寄存器修飾符'「a」'說「我希望這個值在'[ER] AX'中傳遞/返回」。上面的程序集沒有意義 - 編譯器會拋出它。請澄清你想用'RAX'中的值做什麼。 –