2017-02-14 80 views
0

我試圖掩蓋ASM與gcc爲十六進制(GCC -c -masm =英特爾code.s)通過將其錯誤:code.s:1:錯誤:`MOV」太多存儲器的引用。 code.s asm:JS指令 - 十六進制代碼

mov rax , 0x00000000004007E6 
js rax 

發生了什麼事?你能教我蓋嗎?

+2

您在使用英特爾的語法? NASM可能更適合這一任務,因爲它支持英特爾語法並可以生成原始二進制文件。 * -masm = intel *是一個輸出選項AFAIK。 –

+2

'js rax'看起來像使用'rax'作爲標籤,但它當然也是一個註冊表。如果它*被用作標籤,那麼'mov'就有兩個內存引用。 –

+0

是的,我使用英特爾代碼。 –

回答

2

正如瑪格麗特·布魯姆說,-masm=intel只是一個代碼生成選項,這意味着它會影響什麼樣的程序集的編譯器從C代碼生成。它完全不影響組裝。

您需要在程序集文件中添加.intel_syntax noprefix指令來切換語法,或使用複雜的gcc -Wa,--msyntax=intel,-mnaked-reg方法將參數傳遞給彙編程序。

完成上述操作後,下一個問題將是js rax無效,因爲x86中沒有條件間接跳轉。最簡單的可能是使用反轉條件jns跳過jmp rax