一、预备知识: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)初步了解了一下“中断”这个问题

 

posted on 2018-10-27 03:02  樱花飘落の季節  阅读(408)  评论(2编辑  收藏  举报