一、实验目的
掌握在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ㄒ)/~~