实验1 用机器指令和汇编指令编程
1.教材实验1:
实验任务(1):
使用e 命令写入程序,然后使用u命令可以查看到指令成功写入,然后偏移地址为073b开始则是其它本来就有的无关指令。

然后同样的测试使用a命令在073b之后继续写入指令,并且使用u命令查看:

使用t命令单步执行调试,首先修改CS:IP指向存储的程序:

然后开始执行,可以看到指令依次正常执行:

实验任务(2):
写入指令:

执行:

可以观察到在执行完add ax,ax命令后,实验jmp命令跳转会使得程序重复执行ADD命令:
所以要得到2的8次方,需要共T命令16次(需要注意debug默认是16进制,应该是T 10)


最后得到AX为0100H即256。
实验任务(3):

存储生产日期可以看到是92年1月1日。
尝试修改:

修改失败:

实验任务(4):

可以观察到显示器显示出图案:
修改数据,发现图案形状颜色样式发生改变:

修改地址,可以发现原图案后方出现一个新图案,同时将B810:0000的数据置0可以发现上一个图案消失:

2.教材实验2:
实验任务(1):
①使用e命令修改0022:0~0022:f的值,并查看:

②使用a命令输入指令


③单步执行:
执行前寄存器状态:

开始执行:




④填空
mov ax,[0] ax=3221
add ax,[2] ax=6664
mov bx,[4] bx=3635
add bx,[6] bx=6E6C
push ax sp=00FE; 修改的内存单元的地址是 2200:00FE, 内容为 6664
push bx sp=00FC; 修改的内存单元的地址是 2200:00FC, 内容为 6E6C
pop ax sp=00FE; ax=6E6C
pop bx sp=0100; bx=6664
push [4] sp=00FE; 修改的内存单元的地址是 2200:00FE, 内容为 3635
push [6] sp=00FC; 修改的内存单元的地址是 2200:00FC, 内容为 3837
与实验截图对照后结果一致
实验任务(2):
①a命令输入指令,e命令修改2000:0~2000:f的值并用d命令查看修改结果:

②单步执行存储好的指令并使用d命令查看每次执行后2000:0~2000:f的值的变化


思考原因:
Ⅰ 前三行指令功能,特别是,mov sp, 10意味着什么?初始时栈顶和栈底分别是?
mov ax,2000 将2000H传入ax
mov ss,ax 将ax中存储的2000H传入ss中,作为栈基准地址
mov sp,10 将栈顶的偏移地址设为0010H
初始的栈顶为2000:0010H,栈底是2000:000EH
Ⅱ 基于单步调试观察到的变化,给出你对此的思考及可能原因分析。
在执行完mov ss,ax时将2000H传入到了ss中,会发现2000:0008H存储的值变成了2000H,说明2000:0008H对应的地址在执行t时很可能存储了ss的值,同样的观察20后面的几个数值:
0108H显然是IP的值,而073FH和01A3同样应该是存储某个寄存器中的值。
总结:有几个注意点,debug过程中输入的数值默认都是16进制,以及在执行指令时假如直接t执行不加地址参数的话一定得记得修改对应的cs:ip。

浙公网安备 33010602011771号