实验任务
(1)使用Debug,将下面程序段写入内存,逐条执行,观察每条指令执行后CPU中相关寄存器中内容的变化。
机器码 | 汇编指令 |
b8 20 4e | mov ax,4e20 |
05 16 14 | add ax,1416 |
bb 00 20 | mov bx,2000 |
01 d8 | add ax,bx |
89 c3 | mov bx,ax |
01 d8 | add ax,bx |
b8 1a 00 | mov ax,001a |
bb 26 00 | mov bx,0026 |
00 d8 | add al,bl |
00 dc | add ah,bl |
00 c7 | add bh,al |
b4 00 | mov ah,0 |
00 d8 | add al,bl |
04 9c | add al,9c |
提示:可用E命令和A命令以两种方式将指令写入内存。注意用T命令执行时,CS:IP指向。
使用【A命令】
使用【E命令】
【U命令】返汇编
【T命令】单步调试
(2)将下面3条指令写入到2000:0开始的内存单元中,利用这3条指令计算2的8次方。
mov ax,1
add ax,ax
jmp 2000:0003
使用【A命令】将命令写入
这三条命令是一个循环,中间省略部分执行过程
结论:最后可得2的8次方为100H
(3)查看内存中的内容
PC机主板上的ROM中写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到这个生产日期并试图改变它。
提示:如果读者对实验结果感到疑惑,请仔细阅读第1章中的1.15节。
首先使用【D命令】查看从 FFF0:0 起的 ff 个地址,发现最后一行为生产日期,再使用【E代码】试图进行改写日期的值,修改完毕后,再次用【D命令】查看从 FFF0:0 起的 ff 个地址,发现值并未发生改变,修改失败,所以无法对其进行修改
总结:个人无法通过debug环境对内存中的内容进行修改
(4)向内存从B810:0H开始的单元填写数据,如:
-e B810:0000 01 01 02 02 03 03 04 04
请读者先填写不同的数据,观察产生的现象;再改变填写的地址,观察产生的现象。
提示,如果读者对实验结果感到疑惑,请仔细阅读第1章中的1.15节。
将原代码写入,得:
输出的图形为:
修改代码前面的四个值
输出的图形为:
修改代码后面的四个值
输出的图形为:
修改代起始地址的值
图形与之前相比,并未发生变化
总结:修改后面的数值,会对出现的图形产生影响,不同的数字对应不同的图形。修改地址后,将不再发生变化,说明在b810:0这个地址下才会显示这类图形
实验总结与体会
(1)进入debug环境的方法
补充说明:debug中默认16进制,不区分的小写
打开dosbox,输入以下内容进入debug环境
输入【?】查看帮助
(注意一些命令的书写格式)
输入【D】查看内存单元
1.直接输入D,则查看CS:IP为首地址的128个值
2.d 0:200,则查看以0:200为首地址的128个值
3.d 0:200 203,则查看以0:200为首地址到0:203结束的所有值
4.d 0:200 l4,则查看以0:200为首地址的4个值(‘l’是‘L’的小写)
输入【R】查看寄存器
输入【E】修改内存单元
1.e 0:200 10 20 30 40 50 ,则修改从0:200开始的五个值
2.e 0:200,回车后会显示1 10._ ,输入新的值对其进行修改,当想继续修改下一个值的时候则摁“ ”(空格),修改完毕则回车
3.e 0:200 ‘a’ ‘b’ ‘c’,则会修改从0:200起,三个值,显示的时候只会显示其对应的16进制:61 62 63(单个用单引号引起来)
4.e 0:200 “def”,则会修改则会修改从0:200起,三个值,显示的时候只会显示其对应的16进制:64 65 66(多个用双引号引起来)
输入【A】编写汇编命令
1.a 则直接以CS:IP为首地址
2.a 0:200 则从0:200开始,不再根据CS:IP的值
输入【T】进行调试
1.t,单步调试
2.t = 0:200,则从0:200开始单步调试
3.t 2,则执行从当前位置起的条语句
4.t = 0:200 3,则从0:200起执行3条语句
输入【G】进行调试
1.g 0112,则执行到0112之前
2.g 0:200 0:208,则执行0:200至0:208,显示最后的结果
3.g 则从当前IP运行至程序结束
输入【P】进行调试
当有语句如:int 21 时
输入【U】返汇编
补充说明:(T/P/G 比较)
1.T命令,单步执行,遇到子程序后会进入子程序逐条执行指令
2.P命令,与T命令类似,遇到子程序后会直接执行完子程序的全部指令,遇到循环命令时,会直接执行至CX递减至0
3.G命令,多步执行,可以跟地址和断点,运行到制定位置的指令后暂停,若不加参数则从当前IP运行到程序结束