【发布时间】: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 csisn'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