这是汇编语言实验2:
- 教材实验2中「2. 实验任务」(P74)
① 截图记录:使用 e 命令修改 0021:0~0021:f 数据,及修改后查看是否正确写入的操作
修改的值是十进制数字‘0-9’的ASSIC码,在后面显示十进制数值
② 截图记录:使用 a 命令输入的 p74 指令
③ 截图记录:每一行指令单步调试
将0021送入ds中,默认的数据段地址为0021
将2200送入ss寄存器中
这里需要注意的是:在执行了mov ss,ax以后直接跳过了mov sp,0100这条指令?这是为什么?
这里的跳过并不是不执行,而是和mov ss,ax一起执行,这是因为这是为了确保对ss段寄存器和栈指针的修改不被破坏。(在此期间CPU不会响应其他中断)
T执行 mov ax,[0]
这里可以看到AX=3130,即为刚才用E命令修改成功后的一个字节
T执行 add ax,[2]
AX的值变为6462h ,因为取了偏移地址为2的字为3332作Add操作为3130h+3232h=6462h
从偏移地址为4的地址中去一个字3534赋给BX,即BX=3534h
同理执行 add bx,[6] 3534H+3736H=6c6aH
将AX寄存器里的内容压入起始栈顶地址为2200:00FE的栈中
将BX的内容压入栈内,栈顶地址变为2200:00fc
弹出BX的内容后,只剩下将Y原BX寄存器内容给AX,故AX=6c6aH,这符号栈的特点:后进先出
同上面的POP ax操作得出的结果
这里可以看出,数据段DS:0004里的数据为3534H,DS:0006的内容为3736H
实验任务(2):
① 截图记录图 3.19 中使用 a命令输入的 7 行指令,使用 e 命令修改 2000:0~2000:f 的值,及修改后查看的部分
② 单步调试每一行汇编指令的截图。且每一条指令单步调试后,都使用 d 命令查看 2000:0~2000:f 的值。观察每一条指令执行后相关寄存器值的变化,及 2000:0~2000:f 单 元值的变化
③ 以文字方式陈述:
① 前3行汇编指令的功能,特别是,mov sp, 10意味着什么?初始时栈顶和栈底分别 是?
意味着将2000:0010起的这段内存空间作为栈段使用,这里同样出现了修改SS的值和修改SP的值同步出现的情况。这也是因为CPU的中断机制(OS抢占性的资源调度方式,根据程序的优先级来决定哪项程序优先执行)初始栈顶的地址为2000:0010,初始栈底地址为2000:000E.
② 基于单步调试观察到的变化,给出你对此的思考及可能原因分析。
这是因为在8086CPU下 自定义的内存空间作为栈时,CPU会为了保证栈的完整性这时候将与栈相关的环境变量一起存储到该内存空间内,比如这里记录了操作的CS:IP地址,还有压入栈的内容,由最后一张图可以看见将数据3366H,3132H压入了该栈段内.
五、总结与体会
这次实验考察了对数据段数据的修改操作,对栈段的数据进行的进栈出栈操作,这里刚开始我以为的单步调试是写完一段代码便可以进行T操作,然后继续A命令进行键入操作,然后在T单步调试,这种方式也是可行的。当然A键入全部指令后逐步T执行也可。本次实验中自己有些小问题,比如输入指令时出现字母敲错的情况,导致运行结果错误只能重新敲一遍,故在以后的实验中注意,当然,对于DS数据寄存器,SS:SP栈段寄存器有了一定的认知.