来自intel instruction reference:
68 id PUSH imm32
这意味着推送dword大小的immediates在64位程序中有效。
所以我写了以下程序:
section .text
global _start
_start:
call _foo
mov rax, 60
syscall
_foo:
push word 0xFFFF ;ok
pop ax ;ok
push dword 0xFFFFFFFF ; warning: signed dword value exceeds bounds
pop rax
call _bar
ret
_bar:
ret
为什么我会收到此警告?来自英特尔参考:
操作数大小(16,32或64位)决定了数量 堆栈指针递减(2,4或8)。如果源操作数是 一个小于操作数大小的立即数,一个符号扩展值 被推到堆栈上。
在我的例子中,操作数大小是32位。它不小于操作数大小。所以我预计一切都会好起来的。但是,在push dword 0xFFFFFFFF
之后执行程序时,实际推送了它的64位符号扩展名。
此外,我们还不清楚为什么我们在64位模式下有push imm32
指令。如果我们尝试
pop eax ;instruction not supported in 64-bit mode
因此即使我们可以将32位压入堆栈,我们也无法将其压入32位寄存器。