一、实验目的
- 掌握Debug常见指令的使用,以及跟踪程序的运行。
- 掌握待执行指令地址的形成方法。
- 掌握物理地址的形成方法。
- 掌握数据段段基址的设置方法。
二、实验过程和结果
- 1:用“
d 段寄存器:偏移地址
”的格式查看内存单元。 能不能用另外的格式查看呢,例如:
d ds:偏移地址
d es:偏移地址
d ds:ax
d cs:偏移地址
d cs:ip
d cs:ax
d ss:偏移地址
d ss:ip
d ss:ax
d ax:偏移地址
dds:bp
思考1:请总结,那种类型可以实现,哪种类型不能实现
d ds:偏移地址 ——可以实现
d es:偏移地址 ——可以实现
d ds:ax ——不可以实现
d cs:偏移地址 ——可以实现
d cs:ip ——不可以实现
d cs:ax ——不可以实现
d ss:偏移地址 ——可以实现
d ss:ip ——不可以实现
d ss:ax ——不可以实现
d ax:偏移地址 ——不可以实现
d ds:bp ——不可以实现
2: 尝试e命令、a命令、u命令后加上“段寄存器:偏移地址”的形式执行。
可执行
3:在内存中15F0:0120处写入如下汇编指令,并执行。
- 思考2:用T命令执行指令前,需要完成什么设置?
R 命令修改CS和IP的值为15F0:0120
A命令写入汇编指令
4:完成上题后,输入q命令,退出debug,再进入。在内存中15F0:0120处写入如下汇编指令:
- 思考3:用T命令执行上图中第一条
(mov ax,1234h)、第三条(mov cx,12h)和第四条(mov dx,34h)指令,不执行第二条(mov bx,5678h)指令,如何操作?(能用jmp吗)
用T 命令执行完第一条指令之后,强行修改IP的值为0126,
在接着用T命令执行后面的汇编指令
5:在内存14F0:0110处中写入如下数据:
- 思考4:可以将这些数据当作指令执行吗,怎么做?(可截图,也可以文字描述)
先用e 命令修改内存数据,在14F0:0110 处写入数据
再用 r 命令修改CS和IP的值为14f0:0110
再用 t 命令执行
6: 修改段寄存器的值
- r命令修改ds太暴力了,请尝试用mov指令修改ds的值。执行指令后,看看ds的值是否变成了想要的样子。
- 思考5:请写下你的思考过程。
先用 a 命令写两条mov 指令
再用 r 命令修改CS和IP的值
最后用 t 命令执行
7:用E命令在内存16F0:0110处写入如下十六进制数据:
00123456789ABCDE
在自己指定的位置输入如下汇编指令,先不要执行
mov ax, 16f0
mov ds, ax
mov ax, [0110]
mov bx, [0112]
mov cx, [0114]
mov dx, [0116]
mov [0110], dh
mov [0112], ch
mov [0114], bh
mov [0116], ah
- 思考6:猜测执行上述指令后内存16F0:0110处的数据是:
-
0012
- 思考7:猜测执行上述指令后四个通用寄存器数据如下:
低地址对应低位,高地址对应高位
AX=1200 BX=5634 CX=9A78 DX=DEBC
执行上述指令,查看自己的猜测是否跟结果一致
- 思考8:请总结自己出错的原因或者嘚瑟一下自己没有出错(出错不可怕,可怕的是不思考)
在另外的位置,DS的值被修改了,修改成了16f0,
然后用t命令执行了汇编指令,那么在16F0:0110
处的数据也跟着另外位置的指令的执行修改了内存
数据,换句话说,可能在我指定的位置执行的指令
就是要改变16f0:0110处的数据(我的个人看法仅此而已)
8:上题的改版。请用q退出debug后执行以下操作:
用E命令在内存16F0:0110处写入如下十六进制数据:
00123456789ABCDE
在自己指定的位置输入如下汇编指令
mov ax, [0110]
mov bx, [0112]
mov cx, [0114]
mov dx, [0116]
mov [0110], dh
mov [0112], ch
mov [0114], bh
mov [0116], ah
执行上述指令
- 思考9:改版后的结果跟原来的结果一致吗?为什么会出现这种情况?
不一样,因为原版中用了两条MOV 指令修改了ds 的值,
[0110]对应DS
mov ax, 16f0
mov ds, ax
而改版之后的汇编指令没有修改ds 的值,所以t 命令
执行不影响四个通用寄存器的值,也不影响16f0:0110处的数据
9:再玩一次自己的生日数字。
①用e命令请将自己的生日年月日(BCD码或者ASCII码)写入地址是16ff:0210开始的内存中。
②在内存中写入(将ds寄存器设置成16ff的)mov指令。
思考10:需要写入几条mov指令,这些指令是什么?
写两条指令
MOV ax,16ff
MOV ds,ax
- 思考11:这些mov指令写在哪里比较合适?请给出地址和理由。
写在16ff:0210之外的其他地址 我指定的位置:12f0:0000
如果写在这个16ff:0210地址下,会把原先写的数据覆盖
③在内存中写入(将内存中地址是16ff:0210的两个字类型数据或者四个字节类型数据传送给寄存器AX和BX的)mov指令。
- 思考12:需要写入几条mov指令,这些指令是什么?
需要写四条指令
MOV ax,16ff
MOV ds,ax
MOV ax,[0210]
MOV bx,[0212]
④执行上述写入的指令,并查看运行结果。
- 思考13:你的这些mov指令写在了哪里?执行指令前,需要进行哪些设置?
我写在:12ff:0000
首先,我们用a命令在12ff:0000处写入MOV指令
然后,我们用r命令修改CS和IP的值为12FF:0000
最后,用t命令执行
10:逆序存放数值。(这个题目有难度)
①用e命令请将 47 4F 4F 44 20 53 54 55 44 59 写入地址是17ff:0110开始的内存中。
②用t命令写入几条指令。这些指令实现的功能如下:将17ff:0110开始的内存中的数据逆序放入地址是13ff:0110开始的内存中。提示:不能使用mov指令将内存中的数据传送到内存中,需要用寄存器当做中间媒介。每次转送的数据应设置多大呢?数据段寄存器是一直不变还是中途要修改?
③用d命令查看内存,看看结果是否如下图所示。
- 思考14:请将你的指令写在下方,不要截图哦。
Mov ax,17ff
Mov ds,ax
Mov ah,[0119]
Mov al,[0118]
Mov bh,[0117]
Mov bl,[0116]
Mov ch,[0115]
Mov cl,[0114]
Mov dx,13ff
Mov ds,dx
Mov [0110],ah
Mov [0111],al
Mov [0112],bh
Mov [0113],bl
Mov [0114],ch
Mov [0115],cl
Mov ax,17ff
Mov ds,ax
Mov ah,[0113]
Mov al,[0112]
Mov bh,[0111]
Mov bl,[0110]
Mov cx,13ff
Mov ds,cx
Mov [0116],ah
Mov [0117],al
Mov [0118],bh
Mov [0119],bl