【问题标题】:Does NASM include the segment registers in the generated machine instructions in 32-bit x86?NASM 是否在 32 位 x86 生成的机器指令中包含段寄存器?
【发布时间】:2019-12-04 18:43:05
【问题描述】:

我读到 32 位 x86 CPU 在访问内存时使用段寄存器,但是当我在 NASM 中编写汇编代码时,我不必指定任何段寄存器。

这是否意味着 NASM 在生成的机器指令中包含段寄存器,还是我遗漏了什么?

【问题讨论】:

  • 使用的段寄存器是隐式的,大部分指令使用ds。当地址中使用ebp/esp 时,隐式使用ss。一些特定用途的指令使用固定段(例如stosb)。如果程序员需要,可以显式覆盖加载和存储中使用的段(例如,NASM 中的mov [cs:label], eax)。在使用主流操作系统的 32 位汇编中,很少需要这样做(只有 Windows 中的 TLS 和 PEB/TEB 除外)。
  • 为了清楚起见,“used”指的是cpu,而不是nasm。

标签: assembly x86 nasm 32-bit


【解决方案1】:

除非被段覆盖前缀显式覆盖,否则使用的段寄存器来自寻址模式:

  • cs 用于获取代码
  • ss 用于使用espebp 作为基址寄存器的内存访问(任何寻址模式)
  • 使用字符串指令时,es 用作edi 的段
  • ds 用于任何其他情况。

有关详细信息,请参阅英特尔手册。

【讨论】:

    猜你喜欢
    • 2016-11-13
    • 1970-01-01
    • 2012-02-26
    • 2019-01-02
    • 2011-01-14
    • 2015-12-26
    • 2015-06-25
    • 2012-06-25
    相关资源
    最近更新 更多