一、实验目的
- 掌握Debug常见指令的使用,以及跟踪程序的运行。
- 掌握待执行指令地址的形成方法。
- 掌握物理地址的形成方法。
- 掌握数据段段基址的设置方法。
- 掌握堆栈段段基址和sp的设置方法。
二、实验过程和结果
1:生日数字(BCD码)还来一次。
-
①用a命令写入几条指令,这些指令需完成如下操作: 注意:以下操作需全部用汇编指令完成。
-
将数据段段基址设置成
15E0
H
将自己的生日数字(BCD码)存放在寄存器中。
将寄存器中的年数字存放在数据段中任意位置,隔开2个字节后,存放月和日的数字(参考下方参考图片)。 -
②执行上述指令。
-
③用d命令查看对应内存 思考:本题数据段在哪里?代码段在哪里?(填写地址范围)
1.数据段:15E0:0110 0115 将段地址放在DS:15E0,
用MOV访问内存单元的指令时,CPU就将我们定义的
数据段中的内容当作数据来访问;
2.代码段:13F0:0100 0116将段地址放在CS:13F0,
将段中的第一条指令的偏移地址放在IP:0110中,这
样CPU就将执行我们定义的代码段中的指令。
截图如下:
2:用a命令写入几条指令,完成下述操作,并执行,最后用d命令检查。
- 在内存中物理地址是
18020
h开始的位置写入十六进制数据:6861707079
- 注意:不能使用r命令修改除了cs和ip以外寄存器的值,更不能使用e命令修改内存,使用数据段和代码段,不使用堆栈段。
思考:本题数据段在哪里?代码段在哪里?(填写地址范围)
数据段:1000:8020 8024;将段地址放在DS:1000,
用MOV访问内存单元的指令时,CPU就将我们定义的数
据段中的内容当作数据来访问;
代码段:11F0:0000 001C;将段地址放在CS:11F0,
将段中的第一条指令的偏移地址放在IP:0000中,这样
CPU就将执行我们定义的代码段中的指令。
3.接上题。用a命令写入几条指令,完成下述操作,并执行,最后用d命令检查。
- 将内存中物理地址是
18022
h处的三个字节的数据分别放入寄存器BL,CL,DL中。将这三个字节的数据看做ASCII码,转换成其字母对应的大写,并分别存入BL,CL,DL中。再写入物理地址是13ff0h开始的内存中。
思考:本题数据段在哪里?代码段在哪里?(填写地址范围)
数据段:1000:3FF0 3FF2;将段地址放在DS:1000,
用MOV访问内存单元的指令时,CPU就将我们定义的数
据段中的内容当作数据来访问;
代码段:12F0:0000 001D;将段地址放在CS:12F0,
将段中的第一条指令的偏移地址放在IP:0000中,这样
CPU就将执行我们定义的代码段中的指令。
截图如下(可分多次截图):
4:用a命令写入下列指令并用t命令执行
mov ax,2000
mov ss,ax
mov sp,10
mov ax,3123
push ax
mov ax,3366
push ax
思考:这7条指令需要使用几个t命令才能执行完成?请仔细观察每次t命令结束后,各个寄存器的变化以及显示出来的下一条指令。
这7条指令需要使用6个t命令才能执行完成
5:用a命令将下面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。
填空:
mov ax,ffff
mov ds,ax
mov ax,2200
mov ss,ax
mov sp,0100
mov ax,[0] ;ax= C0EA H
add ax,[2] ;ax= C0FC H
mov bx,[4] ;bx= 30F0 H
add bx,[6] ;bx= 6021H
push ax ;sp= 00FE H ,修改的内存单元地址是 0100修改后数值为00FE
push bx ;sp= 00FCH ,修改的内存单元地址是 00FE 修改后数值为00FC
pop ax ;sp= 00FE ,ax= 6021
pop bx ;sp= 0100 ,bx= C0FC
push [4] ;sp= 00FE ,修改的内存单元地址是 0100 修改后数值为00FE
push [6] ;sp= 00FC ,修改的内存单元地址是 00FE 修改后数值为00FC
思考:本题数据段在哪里?代码段在哪里?堆栈段在哪里?(填写地址范围)
1.数据段:FFFF:0000 将段地址放在DS:FFFF,
用MOV访问内存单元的指令时,CPU就将我们定
义的数据段中的内容当作数据来访问;
2.代码段:13FF:0000 0024;将段地址放在
CS:13FF,将段中的第一条指令的偏移地址放
在IP:0000中,这样CPU就将执行我们定义的代码段中的指令。
3.堆栈段:2200:0100,将段地址放在SS中,将栈顶单元的
偏移地址放在SP中,这样CPU在需要进行栈操作的时候,
比如PUSH、POP指令等,就将为我们定义的栈段当作栈空间来用
5:堆栈好像是个不听话的东东。
- ①用a命令在自己指定位置写入下列指令
mov ax,2000
mov ss,ax
mov sp,10
mov ax,1234
push ax
mov ax,3355
push ax
-
②用e命令在堆栈空间(2000:0000~2000:000f)写入全0
-
③用t命令单步执行前三条指令(即初始化堆栈)后,请用d命令查看堆栈内容,还是全0吗,这些值在哪里出现过?再执行一条指令查看堆栈内容变化…请多次操作,看看堆栈里面到底放了什么,至于为什么,就先不用管啦。
思考:不是全0,之前好像写过,眼熟,ax,ip,ss?
6.在16f0:0100处写入自己籍贯的拼音(ASCII码,例如:hu空格nan空格chang空格sha即68 75 20 6e 61 6e 20 63 68 61 6e 67 20 73 68 61),若不是偶数个字节,请在任意位置补空格,凑成偶数个字节。利用堆栈的入栈
操作将上述数据逆序存放在16e0:0100处。不能使用mov指令传送上述数据,不能使用r命令修改除了cs和ip以外寄存器的值。
ASCII码参考可转换为十六进制、十进制、二进制的网址
还可自行搜索转换器,也可以自己编写一个。
(湖南衡阳:6875 6e616e 68656e67 79616e67)本人的籍贯
-
提示1:将哪里设置成数据段,哪里设置成堆栈段就可以了?
-
提示2:怎么设置数据段,怎么设置堆栈段?
-
提示3:堆栈是空的还是满的,sp如何设置?
思考:本题数据段在哪里?代码段在哪里?堆栈段在哪里?(填写地址范围)
1.数据段:16F0:0100 000f 将段地址放在DS:16F0,
用MOV访问内存单元的指令时,CPU就将我们定义的数据
段中的内容当作数据来访问;
2.代码段:14F0:0000 0029;将段地址放在CS:14F0,
将段中的第一条指令的偏移地址放在IP:0000中,这样
CPU就将执行我们定义的代码段中的指令。
3.堆栈段:16E0:0110 011f,将段地址放在SS中,将栈顶
单元的偏移地址放在SP中,这样CPU在需要进行栈操作的时候,
比如PUSH、POP指令等,就将为我们定义的栈段当作栈空间来用
截图如下:
7.在16f0:0100处写入自己籍贯的拼音(ASCII码,例如:hu空格nan空格chang空格sha即68 75 20 6e 61 6e 20 63 68 61 6e 67 20 73 68 61),若不是偶数个字节,请在任意位置补空格,凑成偶数个字节。利用堆栈的出栈
操作将上述数据逆序存放在16e0:0100处。不能使用mov指令传送上述数据,不能使用r命令修改除了cs和ip以外寄存器的值。
思考:本题数据段在哪里?代码段在哪里?堆栈段在哪里?(填写地址范围)
1.数据段:16F0:0100 000f 将段地址放在DS:16F0,
用MOV访问内存单元的指令时,CPU就将我们定义的数据段
中的内容当作数据来访问;
2.代码段:14F0:0100 0029;将段地址放在CS:14F0,
将段中的第一条指令的偏移地址放在IP:0100中,这样CPU
就将执行我们定义的代码段中的指令。
3.堆栈段:16F0:0100 010f,将段地址放在SS中,将栈顶
单元的偏移地址放在SP中,这样CPU在需要进行栈操作的时候,
比如PUSH、POP指令等,就将为我们定义的栈段当作栈空间来用
截图如下:
8.第2题的改版。用a命令写入几条指令,完成下述操作,并执行,最后用d命令检查。
-
在内存中物理地址是
18020
h开始的位置写入十六进制数据:6861707079
-
注意:不能使用r命令修改除了cs和ip以外寄存器的值,更不能使用e命令修改内存,使用堆栈段和代码段,不使用数据段。
思考:本题堆栈段在哪里?初始状态堆栈是空的还是满的?代码段在哪里?(填写地址范围)
1.堆栈段:1802:0000 0006,将段地址放在SS中,将栈顶单元
的偏移地址放在SP中,这样CPU在需要进行栈操作的时候,
比如PUSH、POP指令等,就将为我们定义的栈段当作栈空间来用
2.代码段:15F0:0000 0013;将段地址放在CS:14F0,
将段中的第一条指令的偏移地址放在IP:0100中,这样CPU
就将执行我们定义的代码段中的指令。
截图如下(可分多次截图):
【等待老师的讲解,果不其然,桌面上我肯定不会保留,还是放在这里吧】