在进入介绍之前首先给大家说一下简单介绍一下DOSBox及DOSBox的使用
DOSBox 是一个 DOS 模拟程序,由于它采用的是 SDL 库,所以可以很方便的移植到其他的平台。目前,DOSBox 已经支持在 Windows、Linux、Mac OS X、BeOS 、palmOS、Android 、webOS、os/2等系统中运行。
如需要DOSBox,可到一下链接获取
链接:https://pan.baidu.com/s/1rGNR_VoAM6dZG_quwTMW-A
提取码:7ww1
操作DOSBox的步骤:
- 首先将DOSBox文件放入C盘或D盘
- 安装DOSBox
- 若放在C盘,打开界面输入mount c c:\masm,若是D盘将c换成d即可
- 输入c:->输入debug进入debug环境,即可进行相关操作
debug环境下的几条常用指令(debug中指令一般不区分大小写)
- — U 反汇编命令
- — D 查看内存单元neir
- — R 查看寄存器
- — A 编写指令
- — E 修改内存单元
- — T 执行命令
- — Q 退出debug环境
一、与数据有关的寻址方式
1、立即寻址方式(直接找数据本身,不用通过地址)
- 操作数直接存放在指令中,紧跟在操作码之后,它作为指令的一部分存在代码段里,这种操作数称为立即数。
- 立即数寻址用来表示常数,它经常用于给寄存器赋初值,并且只能用于源操作数字段,不能用于目标操作数字段,且源操作数字与目标操作数字长度一致。
- 举几个栗子并在Dosbox上演示一下
(1) MOV AL,5 执行后AL里的值为05H
(2) MOV AX,3064H 执行之后AX里的值为3064H
(3) MOV EAX,12345678H 执行之后EAX里的值为12345678H
2、寄存器寻址方式
- 操作数存在寄存器中,指令指定寄存器号。
- 对于16位操作数,寄存器可以是AX,BX,和CX,DX,SI,DI,SP,BP;
- 对于8位操作数,寄存器可以是AL,AH,BL,BH,CL,CH,DL,DH;
- 对于32位操作数,寄存器可以是EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP;
- 举个栗子并在Dosbox上演示一下
MOV AX,BX
执行指令前(AX) = 3064H,(BX) = 1234H,执行指令后(AX) = 1234H,BX保持不变
有效地址
在80x86系统中,我们将操作数的偏移地址称为有效地址(effective address,EA),寻址方式其实就是为求得有效地址的不同途径。
有效地址由四个成分组成:
- 位移量是存放在指令中的一个8位,16位或32位的数,但它不是一个立即数,是一个地址。
- 基址是存在基址寄存器中的内容。它是有效地址中的基址部分,通常用来指向数据段中的数组或是字符串的首地址。
- 变址是存放在变址寄存器中的内容。它通常用来访问数组中的某个元素或是字符串中的某个字符。
- 比例因子386及其后继机型新增加的寻址方式中的一个术语,其值可为1,2,4,8。
有效地址的计算公式
- EA = 基址+(变址 * 比例因子) + 位移量
3、直接寻址方式
- 操作数的有效地址只包含位移量一种成分,其值就放在代码段中指令的操作码之后
- 位移量及操作数的有效地址。
- 举个栗子并在Dosbox上演示一下
MOV AX,[2000H]
若是(DS) = 3000H,执行后(AX) = 3050H
4、寄存器间接寻址方式
- 操作数的有效地址只包含基址寄存器内容或变址寄存器内容的成分。
- 16位寻址可用寄存器BX,BP,SI,DI;
- 32位寻址可用寄存器EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP;
- 举个栗子并在Dosbox上演示一下
MOV AX,[BX]
若(DS) = 2000H,(BX) = 1000H
则物理地址 = 20000+1000 = 21000H
执行结束(AX) = 50A0H
5、寄存器相对寻址方式
- 操作数的有效地址为基址寄存器或变址寄存器的内容和指令中指定的位移量之和,所以有效地址由两部分组成。
- 举个栗子
MOV AX,COUNT[SI]
COUNT为16位位移量的符号地址,若(DS) = 3000H,(SI) = 2000H,COUNT = 3000H
则物理地址 = 30000 + 2000 + 3000 = 35000h
执行结果(AX) = 1234H
6、基址变址寻址方式
- 操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和,所以有效地址由两部分组成。
- 举个栗子
MOV AX,[BX][DI]
若(DS) = 2100H,(BX) = 0158H,(DI) = 10A5H
则EA = 0158 + 10A5 = 11FDH
物理地址 = 21000 + 11FD = 221FDH
7、相对基址变址寻址方式
- 操作数的有效地址是基址寄存器和变址寄存器的内容加上指令中指定位置位移量之和,所有有效地址由三部分组成。
- 举个栗子
MOV AX,MASK[BX][SI](或者可以写成MOV AX,[MASK+BX+AX])
若(DS) = 3000H (BX) = 2000H,(SI) = 1000H, MASK = 0250H
则物理地址 = 30000 +2000 + 1000 + 0250 = 33250H
执行之后 (AX) = 1234H
后三种寻址方式不经常使用,这里简单介绍一下
8、比例变址寻址方式
- 有效地址由三部分组成:变址寄存器内容乘以指令中指定的比例因子加上位移量之和
9、基址比例变址寻址方式
- 有效地址有三部分组成:变址寄存器内容乘以比例因子加上基址寄存器内容之和
10、相对基址比例变址寻址方式
- 有效地址由四部分组成:变址寄存器内容乘以比例因子加上基址寄存器内容,再加上位移量之和。