( 前期准备)Debug状态
在Windows10 以下Windows系统中,可以按WIN+R(+指同时按两个键),输入cmd进入,输入debug,下一行前出现 - 则进入debug状态。
在Windows10系统下,需要安装DOS模拟器,安装好,创建虚拟盘,再转到虚拟盘,输入debug,出现 - 则进入debug状态。
百度上有详细教程,具体操作不再叙述。
注:以下输入数均为(16进制数)
实验1.1
题目:使用debug,将下面的程序写入内存,逐条执行,观察每条指令执行后CPU中相关寄存器中内容的变化。
机器码 |
汇编指令 |
b8 20 4e 05 16 14 bb 00 20 01 d8 89 c3 01 d8 b8 1a 00 bb 26 00 00 d8 00 dc 00 c7 b4 00 00 d8 04 9c |
mov ax,4E20 add ax,1416 mov bax,2000 add ax, bx mov bx,ax add ax,bx mov ax,001A mov bx,0026 add al,bl add ah,bl add bh,al mov ah,0 add al,bl add al,9c |
实验过程:
第一次,使用a命令输入汇编指令,没有指定段地址和偏移地址。用t命令执行。
步骤如下图:
第一步用mov指令将4E20赋给AX,
第二步用mov指令将2000赋给BX,
第三步用ADD指令将BX加上AX后的值赋给AX,
第四步用第二步用mov指令将BX值赋给AX,
第五步用ADD指令将BX加上AX后的值赋给AX,(8236+8236=1046C,其中1溢出)
第六步用mov指令将001A赋给AX,
第七步用mov指令将0026赋给BX,
第八步用ADD指令将BL加上AL后的值赋给AL,
第九步用ADD指令将BL加上AH后的值赋给AH,
第十步用ADD指令将AL加上BH后的值赋给BH,
(注:AX可以拆成AH和AL,AH是高位,AL是低位,AH、AL是一个字节)
第十一步用mov指令将00赋给AH,
第十二步用ADD指令将BL加上AL后的值赋给AL,
第十三步用ADD指令将9C加上AL后的值赋给AL。(同上,9C+66=102,一个字八位,其中1溢出)。
第二次使用e 指令写入机器码,指定段地址为0,偏移地址为200.
(-e 0:200 <回车> 在冒号前是原来的值,再冒号后输入机器码,就会修改之前的值)
可以用d命令查看(-d 0:200<回车>)
此时需要用t命令执行该命令,一定要将段地址CS,偏移地址IP修改成0:200,否则无法执行该机器码。
执行步骤如下:
实验步骤和上面一样,不再赘述。
注:t和p指令在大部分情况下可以互换,区别在于:
单步执行程序时,如果遇到子程序或中断服务程序:
若使用t命令,则进入子程序或中断服务程序,继续单步执行;
若使用p命令,则把子程序或中断服务程序当做是一个整体执行。
我们可以用U命令来反汇编一下。(-u 0:200)
实验1.2
题目:使用下面3条指令写入从2000:0开始的内存单元中,利用这三条指令计算2的8次方。
mov ax,1 add ax,ax jmp 2000:3
实验步骤:
想法:2的8次方,就是1连续乘2乘八次。
或者说,乘2,就是将两个相同的值相加。
1+1=2 等价于21
2+2=4等价于22
4+4=8等价于23
以此循环,28就是加八次。
也就是执行代码行16+1次(赋给AX代码1次,相加代码8次,跳转代码8次)。
28在十六进制下是100。
实验1.3
查看内存中的内容。PC机主板上的ROM中写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到这个生产日期并试图改变它。
此处的值修改不了。
从C0000~FFFFF是各种ROM地址空间,向其写入数据的操作无效。
实验1.4
题目:向内存从B8100H开始的单元中填写数据。如:
-e B810:01 01 02 02 03 03 04 04
向地址A0000~BFFFF的内存单元中写数据,就是向显存中写入数据,这些数据会被显示卡输出到显示器上。
总结与体会:
1.在短线与命令之间不能出现空格,否则报错。
2.t=偏移地址 或 p=偏移地址 功能:从指定的偏移地址处单步执行程序。
所以在使用t或者p命令之前,一定要确定CS和IP指向命令储存地址。