汇编语言(第四版)实验2 习题解答

实验 2 用机器指令和汇编指令编程

1、预备知识:Debug的使用

(略)

2、实验任务

(1)使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行的实际情况填空

(详细图解在实验结果中)

特别说明:由于笔者的实验环境是在Win98(虚拟机)上进行实验的,有些同学是在DOSBOX上进行实验的。不同机器的ROM配置可能不相同,因此 FFFF:0000~0000F 这一段的信息可能不相同,因此实验结果不尽相同。但只要是正确的操作,答案都是正确的

mov ax,ffff

mov ds,ax

mov ax,2200

mov ss,ax

mov sp,0100

mov ax,[0]        ; AX = 19CDH  (答案不唯一)       FFFF:0 = 19CDH

add ax,[2]         ; AX = 1AADH  (答案不唯一)       FFFF:2 = 00E0H    19CDH + 00E0H = 1AADH

mov bx,[4]        ; BX =  30F0H  (答案不唯一)        FFFF:4 = 30F0H

add bx,[6]         ; BX =  6022H  (答案不唯一)        FFFF:6 = 2F32H    30F0H + 2F32H = 6022H

push ax             ; SP = 00FEH        修改的内存单元的地址是 220FEH 内容为1AADH (答案不唯一)

push bx             ; SP = 00FCH        修改的内存单元的地址是 220FCH 内容为 6022H (答案不唯一)

pop ax               ; SP = 00FEH        ax=  6022H 

pop bx               ; SP = 0100H         bx= 1AADH 

push [4]             ; SP = 00FEH        修改的内存单元的地址是 220FEH 内容为 30F0H (答案不唯一)

push [6]             ; SP = 00FCH        修改的内存单元的地址是 220FCH 内容为 2F32H (答案不唯一)

实验结果:

汇编语言(第四版)实验2 习题解答_第1张图片

汇编语言(第四版)实验2 习题解答_第2张图片

汇编语言(第四版)实验2 习题解答_第3张图片

汇编语言(第四版)实验2 习题解答_第4张图片汇编语言(第四版)实验2 习题解答_第5张图片

汇编语言(第四版)实验2 习题解答_第6张图片

(2) 仔细观察图 3.19 中的实验过程,然后分析:为什么2000:0~2000:f中的内容会发生改变?

汇编语言(第四版)实验2 习题解答_第7张图片

解答:

汇编语言(第四版)实验2 习题解答_第8张图片

         由图分析可知,CS、IP的内容在执行mov ss,ax 指令后入栈了。这是为什么呢?为什么在执行前一条指令执行后CS、IP的内容没有入栈?

        注意,CS、IP入栈是在mov ss,ax 执行后才在栈段20000H显示出来。也就是说,CS、IP的内容在前一条指令 mov ax,2000 后 CS、IP 的内容其实也入栈了,只不过当时的栈段处于 SS = 1269H SP = FFEE 位置处,CS、IP的内容保存在了那里。在执行mov ss,ax后,栈段改为 SS = 2000H SP = 0010H 位置了。

        那么剩下的 0BEEH 和  0020H又是什么?这一部分涉及到了单步中断,笔者一开始对这一部分也不是很了解,这一部分在后面王爽老师12.11 章节王爽老师作出了解答。解答如下:

        基本上,CPU在执行完一条指令之后,如果检测到标志寄存器的TF位为1,则产生单步中断,引发中断过程。单步中断的类型码为1,则它所引发的中断过程如下:

1) 取得中断类型码1;

2)标志寄存器入栈,TF、IF设置为0

3)CS、IP入栈

4)(IP)=(1*4), (CS)=(1*4+2)。

        Debug的实现就是提供了单步中断的中断处理程序,功能为显示所有寄存器中的内容后等待输入命令。然后,在使用t命令执行指令时,Debug将TF设置为1,使得CPU工作于单步中断方式下,则在CPU执行完这些指令后就引发单步中断,执行单步中断的中断处理程序,所有寄存器中的内容被现实在屏幕上,并且等待输入命令。

        CPU在进入中断处理程序之前,设置TF=0。这样是为了避免CPU在执行中断处理程序的时候发生单步中断。这就是为什么在中断过程中有TF=0这个步骤。

 其实看不懂也没有关系,随着我们对中断的深入学习就会理解了。

你可能感兴趣的:(汇编语言,汇编语言)