虚拟机安装MS-DOS环境
安装Vmware,并下载MS-DOS镜像。(AMD要启用SVM)
安装MS-DOS镜像
一路Next,重装完毕后会报错
这是BIOS启动设置的问题,按CTRL+ALT+INSERT重启虚拟机,在vm出现logo时按F2(把握好时间,多试几次),进入BIOS设置,向右键(→)切换到Boot栏,向下键(↓)选择到CD-ROM Drive(变白即为选中),然后按SHIFT和加号(+),将其移动到最顶端。向右键(→)切换到Exit栏,选中“Exit Saving Changes”,按两次回车,保存设置并重启。
继续一路Next,然后这一步不选择“Install Add-Ons”(在选项上按空格即可取消选择),“Next”
这一步选择“Enable both UMB and EMS”
选择“Load both”
选择“Use default”
选择“Continue”
然后会提示你是否重启,在重启之前,将连接改为使用物理驱动器,然后重启,不然会一直重装。
重启成功
masm和link编译文件
DOS本身并没有自带这两个软件,需要我们将masm这个文件夹放到DOS里面。先关闭DOS,然后右键进入设置,选择“硬盘”,在右面的“硬盘实用工具中”,点击“映射”。去掉“以只读模式打开文件”的选择,点击确定。
这时会自动打开该磁盘(如果没打开在我的电脑中可以找到该磁盘),把masm文件夹复制进去。
返回虚拟机,点击“断开连接”,确定。
使用dir命令可以看到
环境搭建完成。
WIN10下DOSBox安装
环境
下载DOSBOX和debug.exe
微软的masm5.0汇编编译器,文件名为masm.exe
微软的Overlay Linker3.60 连接器,文件名为link.exe
安装DOSBOX,并在F盘下新建目录TASM,把debug.exe、masm.exe、link.exe放入其中。
配置DOSBox
把DOSBOX安装之后打开安装文件夹,找到DOSBox 0.74 Options.bat,然后双击运行,找到conf文件最后最后一行,改成如下形式:
[autoexec] # Lines in this section will be run at startup. # You can put your MOUNT lines here. MOUNT C F:TASM C: debug
运行
运行DOSBox,输入-r查看。
Debug使用
Debug功能
Debug是DOS、Windows 都提供的实模式(8086 方式)程序的调试工具。使用它,可以查看CPU 各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行。
- 用Debug 的R 命令查看、改变CPU 寄存器的内容;
- 用Debug 的D 命令查看内存中的内容;
- 用Debug 的E 命令改写内存中的内容;
- 用Debug 的U 命令将内存中的机器指令翻译成汇编指令;
- 用Debug 的T 命令执行一条机器指令;
- 用Debug 的A 命令以汇编指令的格式在内存中写入一条机器指令。
Debug 的命令比较多,共有20 多个,但这6 个命令是和汇编学习密切相关的。
进入Debug
进入dos,运行debug程序,输入r查看所有寄存器的内容
R命令修改寄存器中的值
输入“r ax" 后按Enter 键,将出现“:”作为输入提示,在后面输入要写入的数据后按Enter 键,即完成了对AX中内容的修改。
修改cs/ip中的值
D命令查看内存中的内容
方式一:d 段地址:偏移地址。Debug将列出从指定内存单元开始的128 个内存单元的内容。例如:d 1000:0
方式二:d 段地址:起始偏移地址 结尾偏移地址。DEBUG从起始位置开始一直显示到结束位置。例如:d 1000:0 9。
方式三:d 段地址:起始偏移地址 L长度,长度以L参数为标识。DEBUG从起始位置开始显示指定长度的内容。例如:d 1000:0 L9。
E命令改写内存
e 段地址:偏移地址 数据 数据 数据……
输入e 1000:10, 按Enter 键。
e 段地址:偏移地址,逐个修改
Debug 显示起始地址1000:0010, 和第一单元(即1000:0010 单元)的原始内容,然后光标停在“.”的后面提示输入想要写入的数据,此时可以有两个选择: 其一为输入数据, 然后按空格键,即用输入的数据改写当前的内存单元; 其二为不输入数据,直接按空格键,则不对当前内存单元进行改写。
当前单元处理完成后(不论是改写或没有改写,只要按了空格键,就表示处理完成), Debug 将接着显示下一个内存单元的原始内容,并提示进行修改,读者可以用同样的方法处理。所有希望改写的内存单元改写完毕后,按Enter 键, E 命令操作结束。
用E命令写入字符
用E命令从内存1000:0 开始写入数值1、字符“a"、数值2、字符"b"、数值3、字符“C"'。字符“a"、“b"、"C"的ASCII码十六进制值:61H、62H、63H。
用E命令将机器码写入内存
机器码也是数据,可以用E命令将机器码写入内存。
U命令将内存单元中的内容翻译为汇编指令
T命令执行CS:IP指向的指令
首先6个存储单元的机器码写入内存1000:0000,并查看机器码对应的汇编指令。
修改cs和ip中存储的段地址和偏移量,并查看CS、IP寄存器中的地址。以及AX、CX寄存器中的值。
T指令运行CS:IP指向的指令数据,执行完后IP偏移量会自动移动到下一个。
A命令以汇编指令的形式在内存中写入机器指令
debug指令总结
- 查看、修改CPU 中寄存器的内容: R 命令
- 查看内存中的内容: D 命令
- 修改内存中的内容: E 命令(可以写入数据、指令,在内存中,它们实际上没有区别)
- 将内存中的内容解释为机器指令和对应的汇编指令: U 命令
- 执行CS:IP 指向的内存单元处的指令: T 命令
- 以汇编指令的形式向内存中写入指令: A 命令
参考链接: