一、预备知识:debug的使用
ps:上次实验已经练习了debug的使用,已经基本熟悉了debug的用法
(1)关于D命令
这次练习了一下d命令的用法
-r ds
DS 073F
:1000
-d ds:0
这几行代码是查看从1000:0开始的内存区间中的内容;下面几行代码是查看1000:10~1000:18中的内容
突然发现,d命令不止可以写d 1000:0也可以写d ds:0
-d cs:0
查看当前代码段中的指令代码
-d ss:0
查看当前栈段中的内容
ps:第三章着重讲了栈,ss,sp的内容,这里就不多说了
(2)在E、A、U命令中使用段寄存器
First:
-r ds
DS 073F
:1000
e ds:0 11 22 33 44 55 66
这四行代码表示:在从1000:0开始的内存区间中写入数据
Second:
-u cs:0
U命令,反汇编,以汇编指令的形式,显示当前代码段中的代码,0代码的偏移地址
(3)下一条指令执行了吗?
在Debug中,用A命令写一段程序,安排2000:0000~2000:000F为栈空间,然后在栈中压入两个数据
输入这段程序后用T命令单步调试,很奇怪的发现,程序好像并没有执行mov sp,10
这条指令到底是怎么执行的在后面实验任务中详细说明
二、实验任务
实验任务(1)
1、使用e命令将内存单元0021:0~0021:7连续8个字节数据修改为30H,31H,32H,33H,34H,35H,36H,37H
并用D命令查看这些数据是否正确写入
2、用A命令输入书上P74的指令
mov ax,0021
mov ds,ax
mov ax,2200
mov ss,ax
mov sp,0100
mov ax,[0]
add ax,[2]
mov bx,[4]
add bx,[6]
push ax
push bx
pop ax
pop bx
push [4]
push [6]
以下为输入程序后用T命令单步执行得到的结果
可以看到这个程序执行完mov ss,ax之后直接执行了mov ax,[0]
我猜测这个跟上面的那个是一个原因导致的
但是mov sp,0100这条指令肯定是执行的
ps:在写答案之前我看了一下用T命令单步执行得出来的结果
我一开始对ax读取的数据有点困惑,于是我又去看了一下ax读取数据的方式
e命令中写入的那8个数都是2位十进制的,正好是一个字节,一个内存单元可以存下
ax读2个单元,比如说3031,30h存入ax的低8位寄存器,31h存入ax高8位寄存器
所以显示是3130h
各个寄存器的结果显示:
下面,我用图例的方式解释了一下这些填空都是怎么出来的,并且说明了栈顶指针也就是sp的变化
实验任务(2)
使用a命令输入书上图3.19的7行指令,使用e命令修改2000:0~2000:f的值,及修改后查看的部分
mov ax,2000
mov ss,ax
mov sp,10
mov ax,3123
push ax
mov ax,3366
push ax
接着,用t命令单步调试,且每一条指令单步调试后都使用d命令查看2000:0~2000:f的值
前三步表示初始化栈顶,安排2000:0000~2000:000F为栈空间
栈顶为2000:0010,栈底为2000:000E
ps:我不知道为什么d 2000:0 f里面的数据是那个样子的
我只知道3123这个数存在了栈里面
书上提到了中断机制,我去查了一下
中断是指计算机在执行程序的过程中,当出现异常情况或特殊请求时,计算机停止现行程序的运行,转向对这些异常情况或特殊请求的处理
处理结束后再返回现行程序的间断处,继续执行原程序。
中断是单片机实时地处理内部或外部事件的一种内部机制。
当某种内部或外部事件发生时,单片机的中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理
中断处理完毕后,又返回被终端的程序处,继续执行下去
中断过程使用当前栈空间存放CPU关键数据,所以,栈里面不是我操作的数据
总结:
(1)本次实验帮助我更好地了解了什么是栈,数据在栈当中是怎么存的
(2)我重新认识了ax寄存器中的高8位和低8位,本来没怎么关注过这个问题,但这次实验用到了,那个时候卡在那里,一直很奇怪这个数是怎么出来的
(3)Debug的t命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行
(4)重新认识了d命令,多了一种d命令的用法
(5)初步了解了一下“中断”这个问题