一、实验目的

      掌握在Debug中使用命令进行汇编指令编程及执行

二、实验设备与环境

计算机

DOS操作系统或 Windows 操作系统

MASM.EXE, LINK.EXE, DEBUG.COM 或宏汇编集成环境

三、实验内容、程序清单及运行结果

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

汇编语言(第三版)王爽著(实验二)用机器指令和汇编指令编程

汇编语言(第三版)王爽著(实验二)用机器指令和汇编指令编程

进行ds和ss:sp的设置,mov ss,ax和mov sp,0100先后一起执行

汇编语言(第三版)王爽著(实验二)用机器指令和汇编指令编程

因为地址空间在(ds)ffff:0000上是rom区(只读),所以不管这个实验做多少次,得到的数据都一样,而不用担心大家的答案不一样

汇编语言(第三版)王爽著(实验二)用机器指令和汇编指令编程

执行push时先sp-2,再放入数据到栈中

执行pop时,先取出数据到寄存器,然后sp+2

汇编语言(第三版)王爽著(实验二)用机器指令和汇编指令编程

mov ax,ffff

mov ds,ax

mov ax,2200

mov ss,ax

mov sp,0100

mov ax,[0] ;ax=C0EAH

add ax,[2] ;ax=C0FCH

mov bx,[4] ;bx=30F0H

add bx,[6] ;bx=6021H

push ax    ;sp=00FEH  修改的内存单元的地址是2200:FE到FF内容为:C0FCH

push bx    ;sp=00FCH  修改的内存单元的地址是2200:FC到FD内容为:6021H

pop ax     ;sp=00FEH  ax=6021H  

pop bx     ;sp=0100H  bx=C0FCH

push [4]   ;sp=00FEH  修改的内存单元的地址是2200:FE到FF内容为:30F0H

push [6]   ;sp=00FCH  修改的内存单元的地址是2200:FC到FD内容为:2F31H

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

汇编语言(第三版)王爽著(实验二)用机器指令和汇编指令编程

汇编语言(第三版)王爽著(实验二)用机器指令和汇编指令编程

当把2000:0-2000:f作为栈时。系统会把寄存器的一些数据暂存在栈中,以供后续相关操作使用,如数据cs:ip先后得到暂存

通过了解,知道了dos下系统只有一个栈,也就是说,外部操作未设置栈时,系统自己已经有一个栈在做暂存等相关工作了,当外部进行设置时,暂存等工作就发生在新栈中,因此没有进行push前系统已经先用来暂存相关数据了,这就是我们看到数据的原因

汇编语言(第三版)王爽著(实验二)用机器指令和汇编指令编程

经过更多的操作发现栈还可以暂存ax寄存器的数据,至于01a3是啥,百度了一下,说是标志寄存器的数据,呃,这个是什么,具体应该以后书上会有讲。

  • 实验结论、实验体会

第一题:

ss:sp始终指向栈顶元素,ss不能直接修改要通过一个寄存器进行中转,sp可以直接修改,但当ss,sp一起修改时,它们先后一起执行,修改sp的指令一定会被一起执行掉,在dos的t命令下将只会看到ss的修改指令

mov ss,ax和mov sp,0100先后一起执行

执行push时先sp-2,再放入数据到栈中

执行pop时,先取出数据到寄存器,然后sp+2

第二题:

Dos下栈只有一个,它不仅可以push和pop,还可以在执行指令时进行相关寄存器数据的暂存,现在知道的暂存数据有cs:ip,ax,标志寄存器

 

做完这次实验发现知识是无穷的,特别是第二题,一直沿着不懂的东西一直查下去,会发现更多不懂的东西/(ㄒoㄒ)/~~

 

相关文章: