LAB2from 2022.3.4
预备知识
(1)在 D E A U 指令中可以使用段寄存器
d指令除了之前的那种使用方式, 还可以通过d 段寄存器:偏移地址
去访问内存
(2)中断机制
这里并没有讲解什么是中断机制,后期会讲解, 这里需要知道 t 指令执行了修改栈段寄存器SS后,会紧接着执行它的下一条指令。
实验任务
(1) 使用DEBUG, 将下面的程序段写入内存, 逐条执行, 根据实际情况填空
(手抽按错一个指令,问题不大)
开始执行:
先看一下CS:IP在哪
调整IP 指针的值
指向了我们写的指令内存,使用T指令开始执行
很明显前两个指令是修改 Date segement 的值
然后修改栈段寄存器SS的值,以及让SP指向2200:0100
创建一个空栈, 栈底是2200:0100,第一个元素是2200:00fe
OK,继续执行
下一步涉及到读取内存里的数据了, 看了以下这时候的DS = ffff, 就读一下16个字节瞧瞧
执行 mov ax,[0] 把 ffff:0开始的字传给了 ax,那么ax应该等于 c0ea
果然,
执行add ax,[2] , ax = cocf
执行mov bx,[4] bx = 30f0
执行add bx,[6] bx = 6021
执行push ax
, 首先SP -2 , SP 变成00fe, 那么2200:00fe字单元 应该等于 cofc,验证一下
可以看到是正确的
执行push bx
,同理 sp = sp -2 = 00fc , 然后复制bx的内容,
执行pop ax
, 先把 2200:00fc的内容复制到ax寄存器, 然后 sp = sp +2 = 00fe
执行pop bx
,把2200:00fe的内容复制给 bx 寄存器, 然后sp = sp +2 = 0100
执行push [4]
,先执行SP = SP - 2 = 00fe ,然后把 DS:0004的字单元放入 SS:SP的子单元
(2)观察3.19 分析为什么2000:0 ~ 2000:f 中的内容会发生变化
看图把每个字单元的内容写出来
2000 0000 0108 0b39 059d
好像是 ss cs ip 的值?
和寄存器有关, 这让我联想到了前面说的中断 emm