实验2 用机器指令和汇编指令编程
实验1
使用e命令将内存单元0021:0 ~0021:7连续 8个字节数据修改为 30H, 31H, 32H, 33H,34H,35H,36H,37H,及修改后查看是否正确写入
使用debug将下面的程序写入内存
利用t命令单步调试:
(1)执行mov ax,0021
(2)执行mov ds,ax
(3)执行mov ax,2200
(4)执行mov ss,ax
注意⚠️这里跳过了步骤mov sp,0100
原因:debug的t命令在执行修改寄存器ss的指令时,下一条指令也紧接着被执行。
(4)执行mov ax,[0]
ax=3130
(5)执行add ax,[2]
ax=6462
(6)执行mov bx,[4]
bx=3534
(7)执行add bx,[6]
bx=6c6a
(8)执行push ax
sp=00fe;此时内存单元为2200:00fe;内容为6464
(9)执行push bx
sp=00fc;此时内存单元为2200:00fc;内容为6c6a
(10)执行pop ax
sp=00fe;ax=6c6a
(11)执行pop bx
sp=0100;bx=6462
(12)执行 push [4]
sp=00fe;此时的内存单元为2200:00fe;显示的内容为3534
(13)执行 push[6]
sp=00fc;此时的内存单元为2200:00fc;内容为3736.
填写结果:
实验2
(1)先按要求输入指令
(2)用e命令修改值以及用d命令查看
(3)单步调试
执行mov ax,2000 没有变化
执行mov ss,ax 发生了变化,通过观察此时2000:0006存放的是ax的值。2000:000a存放的是ip的值。2000:000c存放的是cs的值。
执行mov ax,3123 通过观察此时2000:0006存放的是ax的值,2000:000a存放的是ip的值。2000:000c存放的是cs的值
执行push,ax ,可以观察到3123被压入栈底,同时2000:0004的起始地址存放了ax的值。2000:0008存放的是ip的值。2000:000a存放的是cs的值。
执行mov ax,3366,可以观察到2000:0004的起始地址存放了ax的值。2000:0008存放的是ip的值。2000:000a存放的是cs的值。
执行push ax,可以观察到3366入栈,同时2000:0002的起始地址存放了ax的值。 2000:0006存放的是ip的值。2000:0008存放的是cs的值。
mov sp,10意味着栈空时,ss:sp指向栈的最底部单元下面的单元。
初始时栈底为2000:0010,栈顶为2000:0010
通过查阅资料了解到:这么规定是便于控制栈段大小,防止特别是在有子程序调用时出错。至于这两条指令执行后靠近栈顶的10个字节中值立即有了变化,是对定义栈段时部分运行环境变量进行暂存,靠近栈顶的10个字节中的暂存数据分别是SS、IP、 CS 等的值。
我的总结与体会
虽然这次实验不多,但是一步一步的调试以及分析花费了大量的时间。通过自己一步一步的调试,让我明白了数据变化背后的原理。通过这次实验,熟悉了字的传送以及入栈出栈的过程。在自己的操作中发现t命令在执行修改寄存器ss的指令时跳过了步骤mov sp,0100。通过查书发现debug的t命令在执行修改寄存器ss的指令时,下一条指令也紧接着被执行。通过实验二观察出了单元值的变化和cs,ip,ss有关,通过查资料也了解了一些,但有待进一步探索。