簡體   English   中英

錯誤:“ movq”的操作數大小不匹配

[英]Error: operand size mismatch for `movq'

我正在嘗試編譯以下程序集...

movq $0x3534373536383235, 0x000000000055638f8
movq $0x55638f8, %rdi
retq

第一行拋出錯誤Error: operand size mismatch for 'movq'

這對我來說沒有意義,因為它們都是8字節數字。

我做了一些研究,並推薦movabsq ,就像這樣...

movabsq $0x3534373536383235, 0x000000000055638f8
movq $0x55638f8, %rdi
retq

但這會引發錯誤: Error: operand size mismatch for 'movabs'

我想念什么?

這是我的Mac的全部錯誤

level3.s:1:27: error: invalid operand for instruction
movq $0x3534373536383235, 0x000000000055638f8
                          ^~~~~~~~~~~~~~~~~~~

如果您在引理MOV下查看手冊(這有點令人生畏),您會發現沒有mov r/m64, imm64

有一種方法可以將完整的64位常量加載到寄存器中,也可以將符號擴展的32位常量加載到64位內存位置中,但是沒有一條指令可以立即使用64位並將其寫入內存。

因此,您必須分兩步執行操作,例如使用臨時寄存器或將兩個雙字分別直接寫入內存。

一種方法是:

movabsq  $0x3534373536383235, %rax
movabsq  %rax, 0x000000000055638f8

正如另一條評論所述,您無法將64位立即數移動到64位內存地址,因為沒有指令允許您執行此操作。 缺少此操作碼,因為操作碼當前不能超過15個字節,並且兩個64位值本身就是16個字節,因此必須成為操作碼的一部分。 此限制適用於較小的操作碼,這些操作碼的前綴也將變得太大。 因為您要移至絕對的64位內存地址,所以您將希望使用movabs或movabsq,無論您的匯編程序喜歡什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM