NASM 中的“push BYTE 0x80”和“警告:有符号字节值超出范围”

6 x86 assembly nasm

当我尝试组装以下代码时:

push BYTE 0x80
Run Code Online (Sandbox Code Playgroud)

NASM 显示以下警告:

warning: signed byte value exceeds bounds
Run Code Online (Sandbox Code Playgroud)

这是什么意思?请注意,低于 0x80 的值不会导致警告。

Mic*_*ael 5

PUSH imm8实际上并没有将一个字节压入堆栈。它至少压入一个字,该字将从字节操作数进行符号扩展。因此,使用0x80您的操作数实际上最终会推送0xff80,0xffffff800xffffffffffffff80,这很可能是 NASM 警告您的内容。

这在英特尔的手册中有描述:

当前代码段描述符中的 D 标志决定了默认操作数的大小;它可能会被指令前缀 (66HREX.W)覆盖。
操作数大小(16、32 或 64 位)决定了堆栈指针的递减量(2、4 或 8)。
如果源操作数是立即数并且其大小小于操作数大小,则将符号扩展值压入堆栈。