【问题标题】:msdos source code/why we push ss register in stack and after that we pop into ds registermsdos 源代码/为什么我们将 ss 寄存器压入堆栈,然后弹出到 ds 寄存器
【发布时间】:2018-03-08 14:33:45
【问题描述】:

我在浏览 msdos 源代码文件时发现了一些令人惊奇的汇编指令 为什么我们将 ss 寄存器压入堆栈,然后弹出 ds 寄存器。

实际上更多的代码在这里: 为了更方便,我正在编写“save_world”程序。

Start procedure save_world:
    Push ax
    Push bx
    Push cx
    Push dx
    Push si
    Push di
    Push cs
    Push es
    Push ds
    End procedure,

Invoke save_world:
    pop ds
    push ss
    pop es
    push ss
    pop ds
    ASSUME DS:DOSGROUP

更多代码如下。为了清楚起见,我想说我正在浏览 msdos 源代码文件。

【问题讨论】:

  • 在没有更多上下文的情况下很难说。无论出于何种原因,它只是将ds 设置为与ss 相同。请注意,mov ds, ss 不存在,因此会通过堆栈。
  • push/pop 都是 1 个字节,所以这是最紧凑的写法,不需要像 mov ax, ss / mov ds, ax 那样的临时寄存器。 IDK 为什么您正在查看的代码会重复该序列两次,但它显然超级奇怪,因为它使用pop cs!!! pop cs isn't supported,但可能在某些版本的 8086 上far jmp 的替代品。这是这一系列指令中最令人惊奇的部分。
  • 这是What does PUSH SS / POP DS do?的转贴;我把它作为这个的副本关闭了。
  • @PeterCordes pop cs 是原始 8086 上未记录的操作码。它在操作码表上使用了明显的编码,现在是 0x0F 前缀。
  • 当您说 MSDOS 源代码时,您是指在 DOS 下运行的程序的源代码,还是可以构建 DOS 本身的操作系统的实际源代码 ?我试图解决您缺少代码格式的问题,但它与您尝试编写的内容不匹配。

标签: assembly x86 push dos x86-16


【解决方案1】:

见 Jester 的评论。 x86-16 中没有 mov ds, ss 指令。他们本可以使用中间寄存器:

mov ax, ss
mov ds, ax

但是他们要么是想节省空间,要么是没有要破坏的寄存器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-27
    • 2019-12-23
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    相关资源
    最近更新 更多