实验1 用机器指令和汇编指令编程
实验一
实验任务(1)
用A命令和E命令两种方式将指令写入内存。用T命令单步调试,观察CS:IP的指向,附上实验截图。
(1)A指令
(2)E指令
实验任务(2)
写入指令:
调试开始:
调试结束:
分析:2的8次方位256,对应于16进制的0100。
实验任务(3)
查看内存中PC机主板上的ROM中写有的生产日期,在内存FFF00H~FFFFFH的某几个单元中。
查找该生产日期:
分析:发现日期为1992年1月1日。
尝试修改日期:
分析:发现日期为1992年1月1日,并没有修改成功。其原因是,日期信息位于内存的ROM区域,无法进行写入或修改,这等于改写只读存储器中的内容。
实验任务(4)
实验结果:
分析:在窗口中多了个如图所示的小图标。
尝试修改数据:
分析:和第一次图标位置相同,但图标形状产生变化。
尝试修改地址:
分析:和第一次图标形状相同,但是图标位置发生改变。
总结:在8086PC机内存中,A0000~BFFFF为显存地址空间,在此空间写入不同的数据可以显示不同的图标,在不同的地址中写入数据,图标显示的位置也不同。
实验二
实验任务(1)
使用 e 命令修改 内存单元0022:0~0022:f 中的数据,及修改后查看是否正确写入的操作:
使用 a 命令输入的 p74 指令:
每一行指令单步调试:
结果如下:
ax=5150;
ax=A4A2;
bx=5554;
5x=ACAA;
sp=00FE; 2200:00FE; A4A2;
sp=00FC; 2200:00FC; ACAA;
sp=00FE; ax=ACAA;
sp=0010; bx=A4A2;
sp=00FE; 2200:00FE; 5554;
sp=00FC; 2200:00FC; 5756;
总结:实际情况与预估一致。
实验任务(2)
使用A命令输入7行指令,然后使用E指令修改2000:0~2000:f的值,然后进行查看:
单步调试每一行汇编指令,每一条指令单步调试后,都使用 d 命令查看 2000:0~2000:f 的值。观察每一条指令执行后相关寄存器值的变化,及 2000:0~2000:f 单元值的变化:
分析:查阅资料后发现,栈可以在执行指令时进行相关寄存器数据的暂存,暂存的有 CS、IP 等的值。
(1)前3行汇编指令的功能,特别是,mov sp, 10意味着什么?初始时栈顶和栈底分别是?
第1行:将数值2000存入寄存器AX
第2行:将AX寄存器中的数值赋给SS栈段段寄存器
第3行:初始化栈顶偏移地址为10
初始时栈顶为2000:0010,栈底为2000:000E
(2) 基于单步调试观察到的变化,给出你对此的思考及可能原因分析。
查阅资料,我了解到在8086CPU下,自定义的内存空间作为栈时,CPU会为了保证栈的完整性,将与栈相关的变量一起存到了该内存空间内,如CS:IP等。