计组实验报告实验二文档格式.docx
- 文档编号:21314107
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:17
- 大小:231.94KB
计组实验报告实验二文档格式.docx
《计组实验报告实验二文档格式.docx》由会员分享,可在线阅读,更多相关《计组实验报告实验二文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
2
1
第一字节中,W指出操作数类型:
W=0为字节,W=1为字。
D指出操作数的传送方向:
D=0寄存器操作数为源操作数,D=1寄存器操作数为目标操作数。
第二字节指出所用的两个操作数存放的位置,以及存储器中操作数有效地址EA的计算方法。
操作码
操作码MOD
操作码MODDATA/DISP
操作码MODDATA/DISP(低)DATA/DISP(高)
操作码MODDISP(低)DISP(高)DATA
操作码MODDISP(低)DISP(高)DATA(低)DATA(高)
图28086/8088不同字长的指令码格式
REG字段规定一个寄存器操作数,它作为源操作数还是目标操作数已由第一个字节中的D位规定。
由REG字段选择寄存器的具体规定见表1。
表1REG字段编码表
W=1(字操作)
W=0(字节操作)
000
AX
AL
001
CX
CL
010
DX
DL
BX
BL
100
SP
AH
101
BP
CH
110
SI
DH
111
DI
BH
MOD字段用来区分另一个操作数在寄存器中(寄存器寻址)还是在存储器中(存储器寻址)。
在存储器寻址的情况下,还用来指出该字节后面有多少偏移量字节(即指出存储器操作数地址偏移量的字节数)。
MOD字段编码表见表2。
表2MOD字段编码表
寻址方式
00
存储器寻址,没有位移量
01
存储器寻址,有8位位移量
10
存储器寻址,有16位位移量
11
寄存器寻址,没有位移量
R/M字段受MOD字段控制。
若MOD=11,为寄存器方式,R/M字段将指出第二操作数所在寄存器编号。
MOD=00,01,10为存储器方式,R/M则指出如何计算存储器中操作数地址。
MOD与R/M字段组合的寻址方式见表3。
表3各种MOD与R/M字段组合编码及有关地址的计算
MOD=11寄存器寻址
MOD≠11存储寻址、有效地址的计算公式
W=1
W=0
MODR/M
不带位移量00
带8位位移量01
带16位位移量10
[BX+SI]
[BX+SI+D8]
[BX+SI+D16]
[BX+DI]
[BX+DI+D8]
[BP+SI]
[BP+SI+D8]
[BP+SI+D16]
011
[BP+DI]
[BP+DI+D8]
[BP+DI+D16]
[SI]
[SI+D8]
[SI+D16]
[DI]
[DI+D8]
[DI+D16]
(直接寻址)
[BP+D8]
[BP+D16]
[BX]
[BX+D8]
[BX+D16]
例如:
指令MOVAH,[BX+DI+50H]。
代码格式如下。
OPCODEDWMODREGR/MDISP—8
100010100110000101010000
指令码:
8A6150H。
指令ADDDISP[BX][DI],DX;
DISP=4523H
代码格式:
OPCODEDWMODREGR/MDISP—LoDISP—Hi
000000001010100010100010100100011
指令码为:
01914523H。
【实验内容】
一、用试探法
-e100000000000000
-u100105
170A:
01000000ADD[BX+SI],AL
01020000ADD[BX+SI],AL
01040000ADD[BX+SI],AL
结论:
操作码字节前六位为000000(二进制)看来是一条ADD指令,而且只占两个字节。
记下来:
二、将指令首字节变为01,重复以上实验
-e1000100
-u100101
01000100ADD[BX+SI],AX
第1字节由00(二进制00000000)变为01(二进制00000001),ADD指令的第二个操作数由AL变为了AX。
AL为8位寄存器、AX为16位寄存器,印证了W字段的作用,增加一条有用的记录:
指令码汇编指令
-------------------------------------------------------------------------
170A:
三、将指令首字节变为02,重复以上实验
-e1000200
01000200ADDAL,[BX+SI]
第1字节由00(二进制00000000)变为02(二进制00000010),ADD操作的传送方向发生转变,印证了D字段的作用。
增加一条记录:
指令码汇编指令
------------------------------------------------------------------------
再来,变为03,
-e1000300
01000300ADDAX,[BX+SI]
D和W同时变化,记下:
-----------------------------------------------------------------------
(第二回合)
一、首字节为04~07,继续实验
-e100040000000000
01000400ADDAL,00
-e1000500
0100050000ADDAX,0000
-e10006
010006PUSHES
01010000ADD[BX+SI],AL
-e10007
010007POPES
-
得到四条新的记录,出现了第1个3字节指令050000(ADDAX,0000),还捕获了两条新的单字节指令:
----------------------------------------------------------------------
二、08~0b,继续
-e100080000000000
01000800OR[BX+SI],AL
-e10009
01000900OR[BX+SI],AX
-e1000a
01000A00ORAL,[BX+SI]
-e1000b
01000B00ORAX,[BX+SI]
是四条OR指令:
--------------------------------------------------------------------
--
(手工操作效率太低,是不是?
该换一种方法了)
三、退出
-q
D:
\>
(第三回合)
一、用in1.txt生成out1.txt
原理:
用DOS的输入/输出重定向功能,让debug自动执行一批命令。
1、编写in1.txt
先写一个短的试试看,点击“开始->
程序->
附件->
记事本”,打开记事本,输入:
e1000c0000000000
u100101
q
最后一行q后面要回车,保存文件为C:
\DocumentsandSettings\Administrator
2、打开命令提示符窗口
3、输入以下命令回车执行
4、核实out1.txt文件的内容
在此目录下生成了一个out1.txt文件,内容如下:
Invalidkeyboardcodespecified
-e1000c0000000000
01000C00ORAL,00
5、将out1.txt中的新操作码加入指令表。
首字节为0c的指令是一条OR指令:
二、用in2.txt生成out2.txt
好了,可以写长一点的in.txt来实验了,以下内容存为in2.txt。
e1000d0000000000
e1000e0000000000
e1000f0000000000
生成了out2.txt文件,内容为:
-e1000d0000000000
01000D0000ORAX,0000
-e1000e0000000000
01000EPUSHCS
01010000ADD[BX+SI],AL
-e1000f0000000000
01000FDB0F
-q这一次收获了三条新的记录:
------------------------------------------------------------------
好了,到这里你该明白我的意思了吧,让你的in3.txt文件覆盖指令码的首字节从10到FF,就可以一次得到其余的操作码编码的记录了。
输入:
输出结果:
实验日志:
通过本次试验,掌握了8086/8088指令系统所有指令的操作码的编码方法。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 报告