[英]Can I encode a 64-bit negative immediate in x86?
我正在嘗試自學x86,並且遇到了返回立即數,負數的需求:
.text
.align 4,0x90
.globl _scheme_entry
_scheme_entry:
movl $-42, %eax
ret
當我打印此函數的返回值時( printf("%" PRIdPTR "\\n", scheme_entry())
,我得到了一個無意義的數字:
$ ./neg
4294967254
我猜這是因為它是32位負數00000000FFFFFFFF,而不是64位負數FFFFFFFFFFFFFFFF。
如何直接在匯編器函數中存儲恆定的64位值? 我是否必須將其編碼為兩個單獨的指令?
32位指令(如movl
)的32位立即數按原樣使用,並且將EAX的高32位寫入EAX零 。 您不會胡說八道,得到2^32 - 42
,這正是您應該期望的,因為x86使用2的補碼有符號整數。
具有64位操作數大小的指令的32位立即數被符號擴展為64位。
使用mov $-42, %rax
返回負64位值,而不是正好略低於2 ^ 32的正64位值。 (將%rax
用作目的地意味着64位操作數大小,即movq
。)
使用調試器查看寄存器中的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.