8086指令系统精析.docx
- 文档编号:5901506
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:39
- 大小:176.36KB
8086指令系统精析.docx
《8086指令系统精析.docx》由会员分享,可在线阅读,更多相关《8086指令系统精析.docx(39页珍藏版)》请在冰豆网上搜索。
8086指令系统精析
8086指令系统精析
3.1基本数据类型
1.IA-32结构的基本数据类型是字节(8位)、字(16位)、双字(32位)、四字(64位,486中引入的)和双四字(128位,Pentium3中引入的)。
2.低字节占用内存中的最低地址,该地址也是此操作数的地址。
图:
P44图3-1
3.字、双字、四字的自然边界是偶数编号的地址,字的自然边界是偶数编号的地址,双字和四字的自然边界地址要分别能被4和8除尽。
4.数据结构要尽可能在自然边界上对齐
5.对于不对齐的存储访问,处理器要求做两次存储访问操作;而对于对齐的访问,只要进行一次存储访问操作。
6.数字数据类型(学生自学)PPT
3.28086的指令格式
一、指令格式
Label(标号):
mnemonic(助记符)argument1(参数1),argument2(参数2),argument3(参数3)
其中:
1.标号是一个标识符,后面跟有冒号
2.助记符是一类具有相同功能的指令操作码的保留名
3.操作数的三个参数是任选的,可以有零到三个操作数,操作数参数的数量取决于操作码
4.操作数参数可能是文字或数据项的标识符,也可能是寄存器的保留名或在程序的另一部分声明的赋予数据项的标识符。
5.在算术和逻辑指令中存在两个操作数时,右边的操作数是源,左边的操作数是目的。
例如:
LOADREG:
MOVAX,SUBTOTAL功能是把由SUBTOTAL表示的源操作数传送至AX寄存器。
3.38086/8088指令的操作数寻址方式
寻找操作数,操作数能定位在指令中、寄存器中、存储单元中以及I/O端口中。
1.立即数
用包含在指令中的操作数作为源操作数,这些操作数即为立即操作数。
立即数可以是8位或16位,立即数常用来给寄存器或内存单元赋初值。
例1MOVAX,2056H
结果(AH)=20H(AL)=56H
例2MOVAL,78H
结果(AL)=78H
2.寄存器操作数
操作数在寄存器中,指令中指定寄存器名
8位操作数,用8位寄存器:
AH、AL、BH、BL、CH、CL、DH、DL
16位操作数,用16位寄存器:
AX、BX、CX、DX、SP、BP、SI、DICS、DS、SS、ES
例1MOVAX,2056H
执行后:
(AX)=2056H
例2MOVBL,AH
执行前:
(BL)=12H,(AH)=78H
执行后:
(BL)=78H(AH)=78H
▲立即数寻址、寄存器寻址的操作数,不用在取完指令后再到内存中取数。
▲以下的5中寻址方式,操作数存放在内存中,取完指令后,还需到内存取数。
指令中给出的是该操作数的地址,包括段地址和偏移地址。
3.内存操作数
▲指令MOVDS:
[DI],CL
完成将CL寄存器中的内容传送到以DS为段值,DI为偏移值的内存单元中。
例编程将CL寄存器的内容传送到21000H单元中。
PPT
地址21000H=2000:
1000H,编程时,DS存放段地址2000H,DI存放偏移地址1000H
MOVAX,2000H
MOVDS,AX;(DS)=2000H
MOVDI,1000H;(DI)=1000H
MOVDS:
[DI],CL;(21000H)=(CL)
结果如图所示:
PPT(第一页)
内存单元的地址由段地址和偏移地址构成
▲为减短指令长度
指令中只给出偏移地址的来源,段地址由默认关系给出。
MOVAL,[2000H]PA=(DS)×10H+2000H
即选择DS寄存器的内容为段地址。
▲CPU根据偏移地址给出的方式,按默认关系自动选择段寄存器,获取段值,由段值、偏移值构成操作数所在内存单元的物理地址。
指令中用[]给出偏移地址。
操作数的偏移地址又称有效地址EA(EfficientAddress)
▲按给出偏移地址方式的不同,分为以下5种:
直接寻址MOVAL,[1000H]
寄存器间接寻址MOVAL,[BX]
寄存器相对寻址MOVAL,[BX+10H]
基址加变址寄存器MOVAL,[BX+SI]
相对基址加变址寄存器MOVAL,[BX+SI+10H]
(1)直接寻址方式-位移量
存储器操作数的有效地址EA在指令中直接给出。
例MOVAL,[1000H]
默认段寄存器为DS。
操作数所在内存单元的物理地址为:
PA=(DS)×10H+EA
例:
MOVAX,[1000H]
若(DS)=2000H
内存操作数的物理地址为:
PA=(DS)×10H+EA=2000H×10H+1000H=21000H
执行后(AX)=3040H
在汇编语言程序中,不直接用数值表示偏移地址,用符号代替数值表示地址,称符号地址(变量名)。
例符号buffer表示一个地址。
MOVAX,[buffer]
或写成MOVAX,buffer
源操作数为buffer指向的内存单元的内容
符号地址(变量名)经汇编连接后,与一个确定的数值地址相对应,可用操作符Offset获取变量的偏移地址。
故PA=(DS)×10H+Offsetbuffer
指令执行结果(AX)=0B0AH
(2)寄存器间接寻址-基地址
存储器操作数的有效地址EA由寄存器给出,寄存器的内容为操作数的有效地址。
可用的寄存器有BX、SI、DI、BP
如:
MOVAL,[BX]
MOVAH,[SI]
MOVDL,[DI]
MOVDH,[BP]
●默认段寄存器的关系:
①使用BX、SI、DI,默认段寄存器为DS
PA=(DS)×10H+(SI)或(BX)或(DI)
②使用BP,默认段寄存器为SS
PA=(SS)×10H+(BP)
例1:
MOVAX,[DI]
若(DS)=3000H,(DI)=2000H
则内存操作数的物理地址为:
PA=(DS)×10H+(DI)=32000H
执行后(AX)=(32000H)=400BH
例2:
MOVAX,[BP]
若(SS)=4000H,(BP)=3000H
则内存操作数的物理地址为:
PA=(SS)×10H+(BP)=43000H
指令执行后(AX)=(43000H)=0102H
(3)寄存器相对寻址-基地址+位移量
操作数的有效地址由一个寄存器与一个偏移量相加得到,偏移量(相对量)在指令中给出,范围在0000~FFFFH
可用的寄存器有BX、DI、SI、BP,与寄存器间接寻址相同。
如:
:
MOVAL,[BX+10H]
MOVAH,[DI+20H]
MOVDL,30H[SI]
MOVDH,40H[BP]
PA=(DS)×10H+(SI)或(BX)或(DI)+偏移量
PA=(SS)×10H+(BP)+偏移量
例1:
MOVAX,[BX+30H]
若(DS)=2000H,(BX)=1000H
则内存操作数的物理地址为:
PA=(DS)×10H+(BX)+30H=21030H
指令执行后:
(AX)=(21030H)=8976H
(4)基址加变址寻址-Index+Dsplacement
操作数的有效地址由一个基址寄存器与一个变址寄存器之和给出。
可用的基址寄存器为BX、BP,变址寄存器为SI、DI
如MOVAL,[BX+SI]
MOVAX,[BX][DI]
MOVDL,[BP+SI]
MOVDX,[BP][DI]
默认段寄存器由基址寄存器决定。
①基址寄存器为BX,默认段寄存器为DS
PA=(DS)×10H+(BX)+(SI)或(DI)
②基址寄存器为BP,默认段寄存器为SS
PA=(SS)×10H+(BP)+(SI)或(DI)
例1:
MOVAX,[BX+SI]
若(DS)=4000H,(BX)=2000H,(SI)=100H
则内存操作数的物理地址为:
PA=(DS)×10H+(BX)+(SI)=42100H
指令执行后:
(AX)=(42100H)=2345H
(5)相对基址加变址寻址–Base+Index+Dsplacement
操作数的有效地址由:
基址寄存器、变址寄存器、偏移量三者之和给出。
基址寄存器有BX、BP,变址寄存器有SI、DI
如MOVAL,[BX+SI+10H]
MOVAX,20H[BX][DI]
MOVDL,[BP+SI+30H]
MOVDX,40H[BP][DI]
例:
MOVAX,[BX+SI+10H]
若(DS)=4000H,(BX)=3000H,(SI)=200H
则内存操作数的物理地址为:
PA=(DS)×10H+(BX)+(SI)+10H=43210H
指令执行后:
(AX)=(43210H)=8877H
除此之外,其他方式均错误。
如下:
MOVCL,[AX]
MOVAX,[DX]
MOVAL,[CX]
MOVCX,[BP+BX]
MOVAH,[SI+DI]
MOVBL,[AX+CX]
3.48086的通用指令
指令系统可分为六个功能组:
数据传送、算术运算、逻辑运算、串操作、控制传送、处理器控制。
3.4.1数据传送指令
数据传送是最基本、最重要的一种操作,实际程序中,使用的比例最高。
寄存器——寄存器
寄存器——内存单元
寄存器——I/O端口
按传送内容,可分为四类:
(1).通用数据传送MOV,PUSH,POP,XCHG,XLAT
(2).地址传送LEA,LDS,LES
(3)标志传送PUSHF,POPF,LAHF,SAHF
(4)输入输出传送(累加器专用传送指令)IN,OUT
▲特点:
(1).除POPF、SAHF外,其他传送指令对标志位均无影响;
(2).唯一允许以段寄存器做操作数的指令,且只有MOV、PUSH、POP这三条允许。
1.MOV指令
格式MOVdst,src
执行(dst)←(src)
MOV传送指令的使用:
①reg/mem/segreg←reg通用寄存器/存储器/段寄存器←通用寄存器(8个)
MOVAL,BL
MOV[BX],AL
MOVDS,AX
②reg/segreg←mem通用寄存器/段寄存器←存储器
MOVAL,[BX]
MOVDS,[BX+SI]
③reg/mem←segreg通用寄存器/存储器←段寄存器
MOVBX,CS
MOV[BX],DS
④reg/mem←data通用寄存器/存储器←立即数
MOVAl,9
MOVBX,OFFSETbuffer
MOV[value],0
MOVWORDPTR[BX],1
MOV指令特点及注意事项:
1)双操作数指令(注意双操作指令的特点)
2)可进行字节或字传送
3)不允许存储器传送到存储器
MOV[BX],value错存储器不能传给存储器!
MOV[DI],[SI]错
MOVAX,value对
MOV[BX],AX对
MOVAL,[SI]对
MOV[DI],AL对
4)可对DS、ES、SS赋值,但不允许立即数直接传送给段寄存器
MOVDS,AX
MOVES,[BX]
MOVDS,1000H错
MOVAX,1000H
5)CS不能做目的操作数,不能通过传送指令改变CS的值
MOVCS,AX错
6)不允许段寄存器传送到段寄存器
MOVES,DS错
MOVAX,DS
MOVES,AX
2交换指令
格式XCHGDOPD,SOPD
执行(DOPD)——(SOPD)
reg——regreg——memmem——reg
例1XCHGAX,BX字操作
执行前(AX)=1122H(BX)=3344H
执行后(AX)=3344H(BX)=1122H
例2XCHGAH,BL字节操作
执行前(AX)=1122H(BX)=3344H
执行后(AX)=4422H(BX)=3311H
注意事项:
●双操作数指令
●可进行字或字节操作
●不允许对立即数、段寄存器做操作数
XCHGAX,4错
XCHGBX,DS错
3堆栈操作指令
(1)入栈操作
格式PUSHDOPD
执行分两步:
P54
执行(SP)←(SP)-2
(SS:
SP)←(DOPD)
特点:
1单操作数指令
2操作数为16位,可以是reg/segreg/mem,(CS除外)不可以是data
reg:
AX,BX,CX,DX,SI,DI,BP,BX
segreg:
DS,ES,SS
mem字类型(或双字)
例:
PUSHAX
跳上去(低位)再把AX的货放进去
若执行前:
(SS)=2000H
(SP)=1002H
(SS:
SP)=21002H
(AX)=1234H
则执行后:
(SS)=2000H
(SP)=1000H
(SS:
SP)=1234H
(AX)=1234H
(2)出栈操作
格式POPDOPD
执行(DOPD)←(SS:
SP)
(SP)←(SP)+2
特点:
3单操作数指令
4操作数为16位,可以是reg/segreg/mem,不可以是data
例:
POPBX
把货先复制给BX再跳下来(高位)
若执行前:
(SS)=2000H
(SP)=1000H
(SS:
SP)=1234H
(BX)=5678H
则执行后:
(SS)=2000H
(SP)=1002H
(SS:
SP)=2010H
(BX)=1234H
●PUSH和POP指令只能对字操作。
PUSHAL错
POPBYTEPTR[BX]错
●可以对段寄存器操作,POPCS非法,PUSHCS合法
PUSHDS
PUSHCS
POPES
POPCS错
4输入输出指令IN、OUT、
1)IN输入指令
把一个字节或一个字由一个输入端口(port),传送至AL或AX。
INAL(AX),n;端口地址0~255
INAL(AX),DX;浮动地址64k
2)OUT输出指令
把AL中的一个字节或AX中的一个字,传送至一个输出端口。
OUTn,AL(AX)
OUTDX,AL(AX)
4地址传送指令LEA、LDS、LES
LEA有效地址传送
格式LEAreg,mem
执行(reg)←mem的EA
即寄存器←存储器操作数的偏移地址
例1:
buffer是一个符号地址表示的内存操作数(变量)。
LEABX,buffer
若变量buffer的偏移地址=1000H,执行后(BX)=1000H
等价于MOVBX,OFFSETbuffer
注意:
OFFSET是汇编程序提供的一个操作符,不是CPU的指令。
例2:
将buffer为首的4个字节内存内容相加,存放在AL中。
MOVAX,SEGbuffer取段地址
MOVDS,AX
LEABX,buffer
MOVCX,4
MOVAL,0
Exit:
ADDAL,[BX]
INCBX
DECCX;(cx)=(cx)-1
JNZexit;ZF≠0,即CX≠0,转至exit
说明:
1操作符SEG的作用是取变量的段地址。
执行完前两条指令后,(DS)=buffer的段值;
2操作符OFFSET的作用是取变量的偏移地址,执行完LEA BX,buffer,(BX)为buffer的偏移地址;
3操作数[BX]是以DS为段值,BX为偏移值的内存单元。
LEAreg,mem的特点及注意事项:
●目的操作数reg应是16位通用寄存器
LEAES,[BX]错
LEAAL,buffer错
LEA6,[BX+SI]错
LEA[DI],buffer错
●源操作数应是存储器操作数
LEABX,AX错
●传送的是内存单元的有效地址,与其内容无关。
1)LDSr,src
执行:
(EA)给r,(EA+2)给DS
2)LESr,src
执行:
(EA)给r,(EA+2)给ES
二、算术运算指令PPT
特点:
1带符号数用补码表示
如:
MOVAX,-1等价于MOVAX,0FFFFh负数补码为零
2对加、减运算,不区分无符号数、带符号数;对乘、除运算,区分无符号数、带符号数
3可进行字节或字操作
4影响状态标志
5十进制运算方法
1.加法运算指令PPT
指令格式
执行操作
ADDdst,src
(dst)------(dst)+(src)
ADCdst,src
(dst)------(dst)+(src)+CF
INCoprd
(oprd)-------(oprd)+1
1ADD、ADC为双操作数指令,适用于所有的寻址方式。
2INC为单操作数指令
3INC指令除不影响CF外,6个状态标志AFCFOFPFSFZF均据结果设置,主要用于循环程序中修改地址指针和循环次数,指令的操作数可以在通用寄存器中,也可以在内存中。
4ADC带进位加法,实现多字节运算
例1:
字节运算
MOVAL,64H
ADDAL,64H
即01100100
+01100100
=11001000
分析运算后,各标志位的状态。
C=0;A=0;Z=0;P=0;S=1;O=1
例2INCAL
执行前(AL)=FFH
FFH
+01H
11
=00H
执行后:
(AL)=00H,CF=不变,OF=0,ZF=1,PF=1,SF=0,AF=1。
例3value是一个字变量,OFFSETvalue=1000H,(DS)=2000H,
(21000H)=01FFH。
INCvalue
或写成:
INC[value]
01FFH
+0001H
11
=0200H
执行后:
(21000H)=0200H,CF=不变,OF=0,ZF=0,SF=0,AF=1,PF=0
注意是内存单元内容加1,而非地址加1。
例4将buffer为首的4个字节内存内容相加,存放在AL中。
MOVCX,4
LEABX,buffer
MOVAL,0
exit:
ADDAL,[BX]
INCBX
DECCX
JNZexit
若编程如下,不能实现,为什么?
MOVCX,4
MOVAL,0
exit:
ADDAL,[buffer]
INCbuffer
DECCX
JNZexit
实现的是1A+1B+1C+1D,指令INCbuffer,将buffer指向的内容加1,
而不是地址buffer加1
例5两双字相加0002F365H+0005E024H=?
分析:
8086/8088只能按字节或字相加,位数在字以上的操作数,先加低位,再加高位,加高位时加入从低位产生的进位。
MOVAX,F365H①
ADDAX,E024H②
MOVBX,0002H③
ADCBX,0005H④
执行完①、②:
(AX)=D389HCF=1,OF=0,SF=1,ZF=0
执行完③、④:
(BX)=0008HCF=0,OF=0,SF=0,ZF=0
结果存放在:
0008(BX)D389(AX)
BCD码(BinaryCodedDecimal)
1用二进制编码表示十进制数。
2常用8421BCD码,与十进制数码对应关系:
例:
48的BCD码为(01001000)BCD
根据在内存的存放形式,分压缩BCD码和非压缩BCD码:
①压缩BCD码(一字节存放2个BCD码。
)即组合十进制数
如2148的压缩BCD码为:
(0010000101001000)压缩BCD在内存中占2字节
②非压缩BCD码(一字节存放1个BCD码。
)即未组合十进制数
如2148的非压缩BCD码为:
(00000010000000010000010000001000)非压缩BCD
在内存中占4字节
当数据用压缩或非压缩BCD码表示时,为使运算的结果仍为BCD码表示,需对结果进行调整:
十进制运算=二进制运算+十进制调整。
例:
(00001000)压缩BCD+(00001001)压缩BCD=(00010111)压缩BCD
计算过程:
二进制运算和十进制调整(加6)
具体调整过程P65-66,学生自己看。
3)AAA分离BCD码调整指令
将AL中的结果调整为分离BCD码
两个未组合的十进制数可以直接用ADD指令相加,但要得到正确的未组合的十进制数,必须在加法指令以后,紧接着用一条AAA指令加以校正,于是在累加器中就可以得到正确的结果。
例:
MOVAH,0
ADDBL,CL
AAA
MOVAL,BL
4)DAA组合BCD码调整指令第五版书P65举例
例:
若有两个多字节数NA和NB,每一个是16位十进制数,NA放在以FIRST开始的存储区中,NB放在以SECOND开始的存储区中,都是低字节在前。
编程将相加以后的和放在自THIRD开始的存储区中。
分析:
每个是16位十进制数,十进制数在机器中用(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 8086 指令系统