1. 预备知识:
用T命令执行修改栈寄存器SS的指令,如mov ss,ax,mov ss,[0],pop ss等时,它的下一条关于修改偏移地址SP的指令也紧接着执行,一般情况下,用T命令执行一条指令后,会停止继续执行,显示出当前CPU各个寄存器的状态和下一步要执行的指令,但如上情况却没有做到这点。这种现象属于后期学习内容:中断机制。
2. 实验任务
(1)使用DEBUG,将上面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。
mov ax, 0021
mov ds, ax
mov ax, 2200
mov ss, ax
mov sp, 0100
mov ax, [0] ;ax= 3130H
add ax, [2] ;ax= 6462H
mov bx, [4] ;bx=3534H
add bx, [6] ;bx=6C6AH
push ax ;sp= 00FEH ,修改的内存单元地址是 2200:00FE 内容为 6462H
push bx ;sp= 00FCH ,修改的内存单元地址是 2200:00FC 内容为 6C6AH
pop ax ;sp= 00FEH ,ax= 6C6AH
pop bx ;sp= 0100H ,bx= 6462H
push [4] ;sp= 00FEH ,修改的内存单元地址是 2200:00FE 内容为 3534H
push [6] ;sp=00FCH ,修改的内存单元地址是 2200:00FC 内容为 3736H
以E命令改写,A命令写入:
单步运行结果:
查询得栈地址中数据内容:
(2)仔细观察图3.19中的实验过程,然后分析:为什么2000:0~2000:F中的内容会发生改变?
图3.19 用Debug进行实验的示例
答:在debug使用T等指令引发了中断造成的,中断过程使用当前栈空间存放cpu关键数据,所以,栈中就有些不是我们操作的数据了。
如果是在中断过程中压栈是栈越界的话,在windows下的命令窗口会强制关闭。
实验总结:
Debug使用时,不同形式的命令指令,可能对应不同的寄存器地址分配,指令地址为CS,数据段地址为ds,栈段地址为SS;对于段寄存器不可直接赋值,可间接通过其他寄存器赋值。初始化栈顶由SS:SP地址指向所决定,在使用栈的时候,由于CPU无法自动识别栈的大小,存在栈溢出的危险问题。
原文地址:https://www.cnblogs.com/qiqi-14/p/9864631.html