实验1 用机器指令和汇编指令编程
Posted 030507gz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验1 用机器指令和汇编指令编程相关的知识,希望对你有一定的参考价值。
1. 教材实验1结论 此部分书写内容: 教材实验1中「2. 实验任务」(P45)
实验任务(1) 机器码数据较多,只用前4行实验即可。 用t命令和a命令两种方式,写入内存。用t命令单步调试。
b8 20 4e mov ax,4E20H 05 16 14 add ax,1416H bb 00 20 mov bx,2000H 01 d8 add ax,bx
首先使用-a方式将汇编指令写入内存中:
可以发现内存中已经写入了相应的指令,
使用-e命令写入内存:
-e表示使用十六进制形式写入内存,此时反编译可以发现内容与以a写入相同:
使用-t单步运行此汇编代码。
CS(Code segment)代码段寄存器 IP(Instructor point)指令指针寄存器
1.此时CS寄存器的值为073FH,IP寄存器的值为0100H,cpu到地址073f:0100H物理地址的内存中寻址,
得到命令mov, AX, 4E20H,于是将AX寄存器的内容修改为4E20H,并将IP寄存器的值修改为0100H+3(指令长度) = 0103H
此时,AX寄存器的值改变为4E20H,IP寄存器的值改变为0103H,实验发现实验结果与预期符合的很好。
2.CPU访问物理地址为CS:IP,即地址073F:0103H,得到下一条指令为ADD AX,1416,
此时,AX <- AX + 1416H,IP寄存器的值修改为0103H+3(指令长度) = 0106H。
AX的理论值为6236H,IP的理论值为0106H,实验发现实验值与预期值符合的很好。
3.CPU访问物理地址为073F:0106H的内存空间,得到下一条指令为MOV BX, 2000H
BX <- 2000H, IP <- IP+3(指令长度)
BX的理论值为2000H,IP的理论值为0109H
实验发现实验值与理论值符合的很好。
4.CPU访问物理地址为073F:0109H的内存空间,得到下一条指令为ADD AX, BX
AX <- AX+BX , IP <- IP+2(指令长度)
AX的理论值为8236H, IP的理论值为010BH,实验发现实验值与理论值符合的很好。
实验任务(2)
首先使用A命令将指令写入2000:0000H开始的内存空间:
此时使用u命令反编译可以发现内存中已经有指令了
使用-t命令进行调试:
CPU从CS:IP中得到命令并运行,将AX赋值为1,IP变为0003H
接下来,ADD AX,AX
将AX <- AX+AX,相当于AX <- AX x 2
下一步, JMP 2000:0003H,
相当于CS <- 2000H, IP <- 0003H,
接下来相当于多次运行AX = AX *2,运行多次可以得到2的8次方为256,十六进制形式为0100H
实验任务(3)
分析:物理地址为FFF00H-FFFFFH,可以解释为FFF0*16+00 - FFF0*16+FF
总共FF个内存单元。
即-e FFF0:00 LFF
得到内存中内容如下:
可以发现FFF0:00F5H - FFF0:00FDH为生产日期01/01/92,尝试修改其中内容:
发现内存中的数据并没有改变:
查询8086CPU的内存分配图可以发现,该段区域属于ROM只读区域,不可修改。
8086CPU的内存分配图如下:
仔细想想,如果一块主板的生产日期可以随意改变的话,记录这个生产日期的意义不足,一块2000年生产的主板可以被随意改变为2020年生产的,对维修业务很不友好。
实验任务(4)
从内存B8100H开始的内存单元写入数据:01 02 03 01 03 02 01 02
使用-e 命令改变内存单元:
可以发现出现了图案:
改变写入的数据,发现图案也跟着变化:
解释:查阅8086CPU内存分配可以发现:
A0000H - BFFFFH属于显存地址空间,而B8100H开始的一小块地址空间正好属于这个区域,
修改B8100H开始的一小块内存区域修改的为显存空间,因此会出现图案,而随着内存的改变,图案也会变化。
2.教材实验二结论
实验任务一
1.先使用 e 命令将内存单元 0022:0 ~0022:7连续 8 个字 节数据修改为 50H, 51H, 52H, 53H, 54H, 55H, 56H, 57H
同时使用d命令查看内存内容,发现写入正确:
2.使用a命令写入汇编代码:
接下来开始单步执行:
1.mov ax,0022
将ax寄存器的值改变为0022。
2.mov ds,ax
将ds的值修改为ax内的值,即将ds修改为0022H
3.mov ax,2200
将寄存器ax的值改为2200H
4.mov ss,ax
将ss寄存器的内容改为ax的内容2200H
5.mov sp,0100
将sp内存器的值修改为0100,此时栈顶的物理地址为ss:sp即为22100H
6.mov ax,[0]
将ax寄存器的值修改为ds:0内存单元中的值
由于8086采用的是大端法,0022:0中的值为50,0022:1中的值为51,所以ax=5150H
7.add ax,[2]
由上述分析可知,ax = ax + 5352H = A4A2H
8.mov bx,[4]
将ax寄存器的值修改为ds:4内存单元中的值
由于8086采用的是大端法,0022:4中的值为54,0022:4中的值为55,所以bx=5554H
9.add bx,[6]
由上述分析可知,bx = bx + 5756H = ACAAH
10.push ax
表示ax进栈。
进栈后,sp = sp - 2 = 00FEH
被修改的内存单元为:
22100被修改为A4H
220FF被修改为A2H
下为内存单元查看:
实验值与理论值符合的非常好。
11.push bx
表示bx进栈。
进栈后,sp = sp - 2 = 00FCH
被修改的内存单元为:
220FE被修改为ACH
220FD被修改为AAH
下为内存修改显示:
12. pop ax
表示出栈,并将元素存在ax中。
出栈时,sp = sp + 2 = 00FEH
ax = ACAAH
13. pop bx
表示出栈,并将元素存放在BX中,
出栈时,sp = sp + 2 = 0100H
BX = A4A2H
14. push [4]
表示进栈,进栈元素为ds:4中的元素
sp = sp - 2 = 00FEH
被修改的内存单元为:
220FF被修改为55H
220FE被修改为54H
15.push [5]
表示进栈,进栈元素为ds:6中的元素
sp = sp - 2 = 00FCH
被修改的内存单元为:
220FD被修改为57H
220FC被修改为56H
实验任务二
1.首先,使用e命令写入数据
2.用a命令写入程序
(1)mov ax,2000
可以发现,ax寄存器变为2000,2000:0 - 2000:F的区域没有发生变化。
2.mov ss,ax
将ss寄存器的值修改为ax中的值,此时ss为2000H,sp变为0010H
联想:0000H-0010H正好为16B的存储空间
观察几个改变了的内存的内容,为 00 20 00 00 08 01 3f 07 a3 01
由大端法的存储特点,可以猜想,其中内容分别为:
2000H 0000H 0108H 073FH 01A3H
2000H与 AX寄存器内容相同
0000H与BX CX DX内容相同
0108H与IP寄存器内容相同
073F与CS寄存器内容相同
01A3H没有找到。
经过查阅资料,我发现
设置栈顶位置后
会触发一次中断,栈会存储cs,ip和ax等的内容。
mov ss,ax执行后,mov sp,10立即执行,然后靠近栈顶的16个字节发生变化,对部分环境变量,如ss,ip,cs进行暂存,以保护现场。
前三条命令执行过后,初始时的栈顶和栈底为:2000:0010
我的思考:在mov ss,ax后,mov sp,0010被立刻执行了。
数据是从2000:0010从后往前写的。
以上是关于实验1 用机器指令和汇编指令编程的主要内容,如果未能解决你的问题,请参考以下文章