8086指令系统精析3.1基本数据类型1.IA-32结构的基本数据类型是字节(8位)、字(16位)、双字(32位)、四字(64位,486中引入的)和双四字(128位,Pentium3中引入的)。
2.低字节占用内存中的最低地址,该地址也是此操作数的地址。
图:P44 图3-13.字、双字、四字的自然边界是偶数编号的地址,字的自然边界是偶数编号的地址,双字和四字的自然边界地址要分别能被4和8除尽。
4.数据结构要尽可能在自然边界上对齐5.对于不对齐的存储访问,处理器要求做两次存储访问操作;而对于对齐的访问,只要进行一次存储访问操作。
6.数字数据类型(学生自学)PPT3.28086的指令格式一、指令格式Label(标号):mnemonic(助记符)argument1(参数1),argument2(参数2),argument3(参数3)其中:1.标号是一个标识符,后面跟有冒号2.助记符是一类具有相同功能的指令操作码的保留名3.操作数的三个参数是任选的,可以有零到三个操作数,操作数参数的数量取决于操作码4.操作数参数可能是文字或数据项的标识符,也可能是寄存器的保留名或在程序的另一部分声明的赋予数据项的标识符。
5.在算术和逻辑指令中存在两个操作数时,右边的操作数是源,左边的操作数是目的。
例如:LOADREG: MOV AX, SUBTOTAL 功能是把由SUBTOTAL表示的源操作数传送至AX寄存器。
3.38086/8088指令的操作数寻址方式寻找操作数,操作数能定位在指令中、寄存器中、存储单元中以及I/O端口中。
1.立即数用包含在指令中的操作数作为源操作数,这些操作数即为立即操作数。
立即数可以是8位或16例1 MOV AX , 2056H结果( AH ) = 20H ( AL ) = 56H例2 MOV AL , 78 H结果( AL ) = 78H2.寄存器操作数操作数在寄存器中,指令中指定寄存器名8 位操作数,用8 位寄存器: AH、AL、BH、BL、CH、CL、DH、DL16 位操作数,用16 位寄存器: AX、BX、CX、DX、SP、BP、SI、DICS、DS、SS、ES例1 MOV AX , 2056H执行后:(AX)=2056H例2 MOV BL , AH执行前:(BL) = 12H, (AH) = 78H执行后:(BL) = 78H (AH) = 78H▲立即数寻址、寄存器寻址的操作数,不用在取完指令后再到内存中取数。
▲以下的 5 中寻址方式,操作数存放在内存中,取完指令后,还需到内存取数。
指令中给出的是该操作数的地址,包括段地址和偏移地址。
3. 内存操作数▲指令MOV DS: [ DI ] , CL完成将CL寄存器中的内容传送到以DS为段值,DI为偏移值的内存单元中。
例编程将CL寄存器的内容传送到21000H单元中。
PPT地址21000H=2000:1000H ,编程时,DS 存放段地址2000H,DI 存放偏移地址1000HMOV AX, 2000HMOV DS, AX ; (DS) = 2000HMOV DI, 1000H ; (DI) = 1000HMOV DS: [ DI ], CL ;(21000H) = (CL)结果如图所示:PPT(第一页)内存单元的地址由段地址和偏移地址构成▲为减短指令长度指令中只给出偏移地址的来源,段地址由默认关系给出。
MOV AL,[ 2000H ] PA= ( DS ) ×10H + 2000H即选择DS寄存器的内容为段地址。
▲CPU根据偏移地址给出的方式,按默认关系自动选择段寄存器,获取段值,由段值、偏移值构成操作数所在内存单元的物理地址。
指令中用[ ] 给出偏移地址。
操作数的偏移地址又称有效地址EA ( Efficient Address)▲按给出偏移地址方式的不同,分为以下5种:直接寻址MOV AL, [ 1000H ]寄存器间接寻址MOV AL, [ BX ]寄存器相对寻址MOV AL, [ BX + 10H ]基址加变址寄存器MOV AL, [ BX + SI ]相对基址加变址寄存器MOV AL, [ BX + SI + 10H ](1)直接寻址方式-位移量存储器操作数的有效地址EA在指令中直接给出。
例MOV AL, [ 1000H ]默认段寄存器为DS。
操作数所在内存单元的物理地址为:PA = ( DS )×10H + EA例:MOV AX , [ 1000 H]若( DS ) = 2000H内存操作数的物理地址为:PA = ( DS )×10H +EA = 2000H ×10H + 1000H = 21000H 21000执行后 (AX)= 3040H在汇编语言程序中,不直接用数值表示偏移地址,用符号代替数值表示地址,称符号地址(变量名)。
例 符号buffer 表示一个地址。
MOV AX , [buffer] 或写成 MOV AX , buffer 源操作数为buffer 指向的内存单元的内容符号地址( 变量名)经汇编连接后,与一个确定的数值地址相对应,可用操作符Offset 获取变量的偏移地址。
故 PA = ( DS )×10H + Offset buffer指令执行结果 ( AX ) = 0B0A H(2) 寄存器间接寻址-基地址存储器操作数的有效地址EA 由寄存器给出,寄存器的内容为操作数的有效地址。
可用的寄存器有 BX 、SI 、DI 、BP 如: MOV AL, [ BX ] MOV AH, [ SI ] MOV DL, [ DI ] MOV DH, [ BP ] 默认段寄存器的关系:①使用BX 、SI 、DI ,默认段寄存器为DS PA = ( DS )×10H + (SI)或(BX)或(DI) ②使用BP ,默认段寄存器为SS PA = ( SS )×10H + ( BP ) 例1: MOV AX , [ DI ]若 ( DS ) = 3000H ,( DI ) = 2000H则内存操作数的物理地址为:PA = ( DS )×10H + ( DI ) = 32000H执行后(AX) = (32000H) = 400BH例2:MOV AX , [ BP ]若( SS ) = 4000H,( BP ) = 3000H则内存操作数的物理地址为:PA = ( SS )×指令执行后(AX) = (43000H) = 0102H(3)寄存器相对寻址-基地址+位移量操作数的有效地址由一个寄存器与一个偏移量相加得到,偏移量(相对量)在指令中给出,范围在0000 ~ FFFFH可用的寄存器有BX、DI、SI、BP , 与寄存器间接寻址相同。
如::MOV AL, [ BX +10H] MOV AH, [ DI+20H ]MOVDL, 30H [ SI ]MOV DH, 40H [ BP ]PA = ( DS )×10H + (SI)或(BX)或(DI)+偏移量PA = ( SS )×10H + ( BP )+偏移量例1:MOV AX , [ BX+30H ]若( DS ) = 2000H,( BX ) = 1000H则内存操作数的物理地址为:PA = ( DS )×指令执行后:(AX) = (21030H) = 8976H(4)基址加变址寻址-Index+Dsplacement操作数的有效地址由一个基址寄存器与一个变址寄存器之和给出。
可用的基址寄存器为BX、BP,变址寄存器为SI 、DI如MOV AL,[ BX+SI ]MOV AX,[ BX][DI ]MOV DL,[ BP+SI ]MOV DX,[ BP][DI ]默认段寄存器由基址寄存器决定。
① 基址寄存器为BX ,默认段寄存器为DS PA = ( DS )×10H + ( BX ) +(SI)或(DI) ② 基址寄存器为BP ,默认段寄存器为SSPA = ( SS )×10H + ( BP ) +(SI)或(DI)例1: MOV AX , [ BX + SI ]若 ( DS ) = 4000H ,( BX ) = 2000H ,( SI ) = 100H则内存操作数的物理地址为: PA = ( DS )×指令执行后: (AX) = (42100H) = 2345H(5)相对基址加变址寻址 – Base+ Index+Dsplacement 基址寄存器有 BX 、BP ,变址寄存器有 SI 、DI 如MOV AL, [ BX+SI +10H] MOV AX ,20H[ BX][DI ]MOV DL ,[ BP+SI+30H ] MOV DX ,40H[ BP][DI ]例: MOV AX , [ BX + SI + 10H ]若 ( DS ) = 4000H ,( BX ) = 3000H ,( SI ) = 200H则内存操作数的物理地址为:PA = ( DS )×10H + ( BX ) + ( SI ) + 10H = 43210H 指令执行后:(AX) = (43210H) = 8877H除此之外,其他方式均错误。
如下: MOV CL, [AX] MOV AX, [DX] MOV AL, [CX] MOV CX, [BP+BX] MOV AH, [SI+DI] MOV BL, [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指令格式MOV dst,src执行( dst ) ←( src )MOV传送指令的使用:①reg/mem/segreg ←reg 通用寄存器/存储器/段寄存器←通用寄存器(8个)MOV AL , BLMOV [ BX ] , ALMOV DS , AX②reg/segreg ←mem 通用寄存器/段寄存器←存储器MOV AL , [ BX ]MOV DS , [ BX+SI ]③reg/mem ←segreg 通用寄存器/存储器←段寄存器MOV BX , CSMOV [ BX ] , DS④reg/mem ←data 通用寄存器/存储器←立即数MOV Al , 9MOV BX , OFFSET bufferMOV [ value ] , 0MOV WORD PTR [ BX ] , 1MOV指令特点及注意事项:1)双操作数指令(注意双操作指令的特点)2)可进行字节或字传送3)不允许存储器传送到存储器MOV [ BX ] ,value 错存储器不能传给存储器!MOV [DI],[SI] 错MOV AX ,value 对MOV [ BX ] ,AX 对MOV AL ,[SI] 对MOV [ DI ] ,AL 对4)可对DS、ES、SS 赋值,但不允许立即数直接传送给段寄存器MOV DS,AXMOV ES ,[BX]MOV DS,1000H 错MOV AX ,1000H5)CS不能做目的操作数, 不能通过传送指令改变CS的值MOV CS ,AX 错6)不允许段寄存器传送到段寄存器MOV ES ,DS 错MOV AX ,DSMOV ES ,AX2 交换指令格式XCHG DOPD,SOPD执行(DOPD) ——(SOPD)reg ——reg reg——mem mem——reg例1 XCHG AX, BX 字操作执行前(AX)= 1122H (BX)= 3344H执行后(AX)= 3344H (BX)= 1122H例2 XCHG AH, BL 字节操作执行前(AX)= 1122H (BX)= 3344H执行后(AX)= 4422H (BX)= 3311H注意事项:●双操作数指令●可进行字或字节操作●不允许对立即数、段寄存器做操作数XCHG AX, 4 错XCHG BX, DS 错3 堆栈操作指令(1)入栈操作Array格式PUSH DOPD执行分两步:P54执行(SP)←(SP)- 2(SS:SP)←(DOPD)特点:① 单操作数指令② 操作数为16位,可以是reg/segreg/mem,(CS除外)不可以是datareg : AX, BX, CX, DX, SI, DI, BP, BXsegreg : DS, ES, SSmem 字类型(或双字) 例: PUSH AX跳上去(低位)再把AX 的货放进去若执行前: (SS )= 2000H (SP )= 1002H(SS :SP )= 21002H (AX )= 1234H则执行后: (SS )= 2000H (SP )= 1000H (SS :SP )= 1234H (AX )= 1234H(2) 出栈操作格式 POP DOPD执行 (DOPD ) ← (SS :SP ) (SP ) ←(SP )+ 2 特点:③ 单操作数指令④ 操作数为16位,可以是reg/segreg/mem, 不可以是data例: POP BX把货先复制给BX 再跳下来(高位) 若执行前: (SS )= 2000H (SP )= 1000HSS:SP 2000:1002指令执行前(AX)=1234hSS:SP 2000:1000指令执行后(AX)=1234hSS:SP SS:SP (DOPD t)SS:SP 2000:1000指令执行前(BX)=5678h(SS :SP )= 1234H (BX )= 5678H 则执行后: (SS )= 2000H(SP )= 1002H (SS :SP )= 2010H(BX )= 1234H ● PUSH 和POP 指令只能对字操作。