簡體   English   中英

我可以在x86中編碼64位負立即數嗎?

[英]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.

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