推动imm32最终推动imm64?

时间:2018-02-09 12:22:34

标签: assembly nasm x86-64 instruction-set

来自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位寄存器。

0 个答案:

没有答案