实验1 用机器指令和汇编指令编程
一、教材实验1(P35)
1、用e命令和a命令两种方式将指令写入内存,用t命令单步调试。
e命令修改,d命令查看,u命令反汇编
a命令书写
t命令逐步调试,可得出结果:ax=8236, bx=2000; cs:ip=073f:010b
2、利用3条指令计算2的8次方
逐步执行后,得出最终结果:ax=2^8=0100H
3、找到PC主板上ROM中的生产日期,在内存FFF00H~FFFFFH的某几个单元中,并试图改变它。
利用d命令,从FFF00H开始查看内存信息,可以发现生产日期在FFF0:00F0~00FF中,并无法改变该部分内容。查看1.15节可知,C0000~FFFFF为各类ROM地址空间,该部分内容只可读取,不可改变。
4、向内存从B8100H开始的单元中填写数据
在该内存填写数据不同,显示的图形和颜色不同;修改的地址不同,显示的位置不同。
由1.15节知识可知,A0000~BFFFF为显存地址空间,向该部分中写入的数据,会被显示卡输出到显示器上。
二、教材实验2(P71)
1.1 使用 e 命令修改内存单元0022:0~0022:f 中的数据,及修改后查看是否正确 写入的操作
1.2 使用 a 命令输入的 p74 指令
1.3 每一行指令单步调试(如单步调试步骤多,可分屏截图,但不要有遗漏)
1.4 P74 中指令执行后各个寄存器填空结果
mov ax,[0] add ax,[2] mov bx,[4] add bx,[6] |
ax=C0EA ax=C0FC bx=30F0 bx=6021 |
push ax push bx pop ax pop bx |
sp=00FE;修改的内存单元地址:00FF,00FE; 内容为C0FC sp=00FC;修改的内存单元地址:00FD,00FC;内容为6021 sp=00FE;ax=6021 //栈先进后出 sp=0100;bx=C0FC //此时栈空 |
push [4] push [6] |
sp=00FE;修改的内存单元地址:00FF,00FE; 内容为30F0 sp=00FC;修改的内存单元地址:00FD,00FC;内容为2F31 |
2.1 使用 a命令输入的 7 行指令,使用 e 命令修改 2000:0~2000:f 的值, 及修改后查看的部分
2.2 单步调试每一行汇编指令。每一条指令单步调试后,都使用 d 命令查看 2000:0~2000:f 的值。
2.3 前3行汇编指令的功能,特别是,mov sp, 10意味着什么?初始时栈顶和栈底分别是?
前3行设置栈顶位置,将SS:SP指向我们定义的栈段2000:0010,因为不能直接向段寄存器SS中送入数据,所以用ax中转。mov sp,10表示初始化栈顶为0010。
栈顶=2000:0010;栈底=2000:000E
2.4 基于单步调试观察到的变化,给出你对此的思考及可能原因分析
设置栈顶位置后,2000:0~f存储了cs,ip,ax等的内容。
通过搜索得知,与中断机制有关。mov ss,ax执行后,mov sp,10立即执行,然后靠近栈顶的10个字节发生变化,对部分环境变量,如ss,ip,cs进行暂存,以保护现场。