Assembly Languag (王爽) Lab

LAB2from 2022.3.4

预备知识

(1)在 D E A U 指令中可以使用段寄存器
d指令除了之前的那种使用方式, 还可以通过d 段寄存器:偏移地址去访问内存
(2)中断机制
这里并没有讲解什么是中断机制,后期会讲解, 这里需要知道 t 指令执行了修改栈段寄存器SS后,会紧接着执行它的下一条指令。

实验任务

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

image.png
(手抽按错一个指令,问题不大)

开始执行:
先看一下CS:IP在哪
image.png
调整IP 指针的值
image.png
指向了我们写的指令内存,使用T指令开始执行
很明显前两个指令是修改 Date segement 的值
image.png
然后修改栈段寄存器SS的值,以及让SP指向2200:0100
image.pngimage.png
创建一个空栈, 栈底是2200:0100,第一个元素是2200:00fe
OK,继续执行
下一步涉及到读取内存里的数据了, 看了以下这时候的DS = ffff, 就读一下16个字节瞧瞧
image.png
执行 mov ax,[0] 把 ffff:0开始的字传给了 ax,那么ax应该等于 c0ea
果然,image.png
执行add ax,[2] , ax = cocf
image.png
执行mov bx,[4] bx = 30f0
image.png
执行add bx,[6] bx = 6021
image.png
执行push ax, 首先SP -2 , SP 变成00fe, 那么2200:00fe字单元 应该等于 cofc,验证一下
image.png
可以看到是正确的
执行push bx,同理 sp = sp -2 = 00fc , 然后复制bx的内容,
image.png
执行pop ax, 先把 2200:00fc的内容复制到ax寄存器, 然后 sp = sp +2 = 00fe
image.pngimage.png
执行pop bx,把2200:00fe的内容复制给 bx 寄存器, 然后sp = sp +2 = 0100
image.pngimage.png
执行push [4],先执行SP = SP - 2 = 00fe ,然后把 DS:0004的字单元放入 SS:SP的子单元
image.png
image.png
image.png

(2)观察3.19 分析为什么2000:0 ~ 2000:f 中的内容会发生变化

看图把每个字单元的内容写出来
2000 0000 0108 0b39 059d
好像是 ss cs ip 的值?
和寄存器有关, 这让我联想到了前面说的中断 emm