assembly - 原始 MS-DOS 源代码中的 DI、EI 和 UP 指令(?)是什么?
问题描述
我正在经历一个操作系统的汇编语言项目。为此,我通过初始操作系统获得知识。在此过程中,我尝试了解 MS-DOS 1.25。但是当我运行这个文件 IO.ASM 时,我从下面给出的某些行的代码中得到了四个错误,这里我用“<-----this”符号标记了这些行。请指导我。
INIT:
XOR BP,BP ; Set up
;stack just below I/O
;system.
MOV SS,BP
MOV SP,BIOSSEG*16
IF INTINP-1
MOV AL,0FFH ; Mask all
;interrupts.
OUTB BASE+3 <------this
ENDIF
IF INTINP
DI ; Set up <------ this
;keyboard interrupt vector.
MOV [BP+64H],KBINT
MOV [BP+66H],CS
EI <-----this
ENDIF
MOV [BP+4*38H],PRNFCB
MOV [BP+4*38H+2],CS
PUSH CS
POP DS
;
; Initialize time-of-day
;clock.
;
MOV SI,STCTAB
MOV CX,4 ;Initialize
;4 registers
UP <------this
INITSTC:
LODB
OUT STCCOM ;Select
;register to initialize
LODB
OUT STCDATA
LODB
OUT STCDATA
LOOP INITSTC
IF SERIAL
MOV CX,4
我知道上面给出的错误是显而易见的。但请告诉我应该如何修改我的代码。提前致谢。
解决方案
MS-DOS 代码最初是西雅图计算机产品86-DOS的一个端口。IO.ASM
需要用 86-DOS 的汇编器 ( ASM.COM
) 来汇编。汇编器的代码在其中,ASM.ASM
但需要使用自身进行汇编。1970 年代和 1980 年代生产的 86-DOS 汇编器的编译版本仍然可以在线获得1。86-DOS 的汇编器起源于那个时代的 Z80/8080 汇编器,例如Digital Research 的CP/M 汇编器。
在某些情况下,86-DOS 汇编器使用的指令助记符和语法与 MASM 略有不同:
EI
是启用中断。与STI
MASM相同DI
是禁用中断。与CLI
MASM相同UP
是方向向上(向前)的字符串操作。与CLD
MASM相同DOWN
是字符串操作的方向向下(向后)。与STD
MASM相同
关于AL/AXIN
作为源操作数和目标操作数是唯一有效选择的OUT
指令,86-DOS 汇编器不希望它们存在。
OUTB imm
相当于 MASM 的OUT imm, al
OUTW imm
相当于 MASM 的OUT imm, ax
INB imm
相当于 MASM 的IN al, imm
INW imm
相当于 MASM 的IN ax, imm
其他信息
1您可以从本文ASM.COM
中的链接获得预构建。有一个构建磁盘可用于模拟器和虚拟机,如 QEMU/DOSBox/BOCHS/VirtualBox,其中包含构建 MS-DOS v1.25 主要组件所需的一切。
开发人员应该注意的一些警告是 GitHub 上的所有文件都是 Unix 文本格式。86-DOS 汇编器在 Unix 行尾标记上阻塞。您可以使用unix2dos
将文件转换IO.ASM
为 DOS 格式。使用 86-DOS 汇编器处理的文本文件需要以 Control-Z 文件结束标记 (0x1A) 结束,否则汇编器将永远找不到文件的结尾。
IO.ASM
, TRANS.ASM
, ASM.ASM
,HEX2BIN.ASM
是 MS-DOS 1.25 存储库中唯一需要 86-DOS 汇编程序来处理它们的文件。
IO.ASM
汇编到IBMBIO.COM
/IO.SYS
并包含默认设备驱动程序代码和设备初始化代码。ASM.ASM
是 86-DOS 汇编器TRANS.ASM
是帮助将 8080 汇编代码迁移到 8086 汇编代码的翻译工具HEX2BIN.ASM
是一个将 86-DOS 汇编器输出的 HEX 文件转换为 DOS COM 文件的工具。
MS-DOS v1.25 存储库中与 MASM 组装的其他文件是:
STDDOS.ASM
简单地设置目标信息,然后包括MSDOS.ASM
用于产生IBMDOS.COM
/的 ( )MSDOS.SYS
。这实际上是 DOS 内核COMMAND.ASM
组装成COMMAND.COM
命令处理器(实际上是 DOS 命令提示符和程序加载器)
正如另一个答案所指出的,这些文件本身不能简单地放在磁盘上。您需要创建一个引导加载程序以进入软盘映像的第一个扇区。对于不同的 OEM,如 IBM/Zenith/Compaq/SCP 等,引导加载程序是不同的。通常,尽管引导加载程序将读取IBMBIO.COM
/ IO.SYS
(或 OEM 使用的任何名称)和IBMDOS.COM
/ MSDOS.SYS
(或 OEM 使用的任何名称)。然后引导加载程序通常会跳转到IBMBIO.COM
/中的说明IO.SYS
来安装和初始化默认的 DOS 设备驱动程序。IBMDOS.COM
然后调用/中的初始化代码MSDOS.SYS
来设置 DOS 内核和 DOS 中断。作为最后一步COMMAND.COM
加载到内存并启动以提供 DOS 命令提示符。
IO.ASM
源代码中包含的文件适用于与 IBM-PC 不兼容的基于 8086/8088 的 SCP S-100 总线系统。每个 OEM 都必须生产自己的产品IO.ASM
,该产品是针对其 DOS 版本将在其上运行的操作环境和硬件量身定制的。
此过程可能因 OEM 不同而异。有些人走捷径,有些人不走捷径。随着 DOS 的发展,加载 DOS 内核以及最终的命令处理器的过程也在发展。如果您要为 DOS 反汇编引导加载程序,您会发现 OEM 的做法有所不同,并且随着新版本 DOS 的发布,他们会对其进行更改。
推荐阅读
- html - 为什么我的侧边导航栏与网页上的文字重叠
- json - 使用 pyspark 读取 Json 文件
- html - 如何在第一列中有标题
- java - Spring @ComponentScan 不扫描
- google-apps-script - 你如何创建一个下拉列表,以便某些用户只能从谷歌表中的某些数据集中进行选择
- c++ - 未找到重载函数
- python - ModbusTcpClient 操作返回什么对象?
- python - 根据重复的列值提取数据帧行并将它们存储在新的数据帧中
- html - 为什么会出现此错误 label 元素的 for 属性的值必须是非隐藏表单控件的 ID
- javascript - Android 上的 React Native/Expo 中没有匹配的活动错误