【问题标题】:"push BYTE 0x80" and "warning: signed byte value exceeds bounds" in NASMNASM 中的“push BYTE 0x80”和“警告:有符号字节值超出范围”
【发布时间】:2015-03-13 11:18:10
【问题描述】:

当我尝试汇编以下代码时:

push BYTE 0x80

NASM 显示以下警告:

warning: signed byte value exceeds bounds

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

【问题讨论】:

  • 试试这个,看看会发生什么,没有承诺push BYTE -128
  • 哦,再想一想;你看过生成的操作码吗?你得到正确的十六进制值了吗?

标签: assembly x86 nasm


【解决方案1】:

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

这在Intel's manual中有描述:

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

【讨论】:

    猜你喜欢
    • 2010-09-06
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 2018-11-11
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多