




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章寻址方式及指令系统
3.1基本概念3.2寻址方式
操作数的寻址方式转移指令的寻址方式3.3指令系统传送指令算术运算指令位运算指令CPU控制指令I/O类指令串操作指令转移类指令3.4常用DOS系统功能调用和BIOS中断调用
DOS系统功能调用常用DIOS中断
3.1基本概念一、指令及指令系统指令是CPU可以理解并执行的操作命令。指令系统是CPU的所有指令的集合。指令的兼容性:同一系列机的指令都是兼容的。二、程序执行的基本流程程序是为了解决某一问题而编写的有限指令序列。指令的执行过程主要有两个阶段:取指阶段和分析执行阶段。图3.1程序执行流程图三、指令的级别机器级和汇编级机器指令是指由二进制代码构成的可由CPU直接理解并执行的指令;汇编指令实质上是机器指令符号化的结果,它与机器指令是一对一的。例如:MOVAL,1(易于理解、记忆、书写不易出错)
1011000000000001(难理解、难记忆、书写易出错)四、指令格式指令中应包含的信息:“做什么操作”“对什么操作”指令格式操作码[操作数],[操作数]执行何种操作参加操作的数据或数据存放的地址或操作数地址计算方法说明:①操作数的寻址方式是指寻找指令中操作数的方式。
操作数可能的存放方式:直接包含在指令中立即数立即寻址方式包含在某个寄存器中寄存器操作数寄存器寻址方式在内存中存储器操作数(内存操作数)存储器寻址方式在端口中端口操作数端口寻址方式②操作数的分类:根据其在指令中的位置分为第一操作数和第二操作数以及隐含操作数(无操作数,在指令中不会出现但会用到);根据操作数的作用分为源操作数(SRC)和目的操作数(DST);
例如:MOVAL,80根据操作数所对应的操作对象的字节数(也叫数据类型)分为字节操作数(Byte)、字操作数(Word)(8088/86字长为两个字节)、双字操作数(DoubleWord)、8字节操作数(Octalbyets,LongWord)、十字节操作数(TenBytes)。按操作数的个数将指令分为零地址指令(无操作数)、一地址指令(只有一个操作数)、二地址指令(有二个操作数)、多地址指令(多于二个操作数);按指令级别分为机器指令和汇编指令;按是否转移分为转移指令和顺序指令;按功能分为七大类:传送类、算术运算类、位操作类、I/O类、串操作类、CPU控制类、转移类;按指令长度(即指令占用的字节数)分为一字节指令、二字节指令等,8088/86指令长度是不同的,叫变字长,不同的指令有不同的指令长度,从一字节到六字节均有;按指令执行期间取操作数是否需要与总线打交道分为内部指令(不需)和外部指令(需要)。五、指令分类
3.2寻址方式与数据有关的寻址方式与转移地址有关的寻址方式(转移指令)与数据有关的寻址方式:以MOV
指令为例立即寻址MOVAX,3069H寄存器寻址MOVAL,BH直接寻址MOVAX,[2000H]寄存器间接寻址MOVAX,[BX]
寄存器相对寻址MOVAX,COUNT[SI]
基址变址寻址MOVAX,[BP][DI]相对基址变址寻址MOVAX,MASK[BX][SI]存储器寻址3.2.1操作数的寻址方式操作数直接存放在指令中,紧跟在操作码之后,作为指令的一部分,存放在代码段里,这种操作数称为立即数。例如:MOVAL,5MOVAX,3064H
图例MOVAL,‘A’主要用来给REG或M赋初值。3.2.1.1立即寻址方式AH
AL
AXCS段…………操作码存储器例:MOVAX,3064HB8H64H30H∴(AX)=3064H例3.1:MOV
AL,5 ;5为十进制字节常数MOV
AX,5 ;5为十进制字常数MOVAX,300H ;300H为十六进制字常数MOV
CX,N;在此之前N已定义为常量MOV
AX,DATA ;DATA为段名MOV
AX,5+2*3;5+2*3=11为常数表达式注意:立即数可以是:各种进制的常数、字符常数、符号常量、地址(段名、段地址、偏移地址)、常数表达式等。立即数只能作为源操作数,不能作为目的操作数。立即数的数据类型由指令本身决定。字节数据的取值范围为-128-+255,字数据的取值范围为-32768-+65535。MOV40H,AL错MOVAH,3064H错3.2.1.2寄存器寻址方式指令中出现的寄存器名作为操作数的寻址方式叫寄存器寻址方式。操作对象是寄存器中的内容。例3.2:MOV
AX,BXMOV
DH,CLMOV
DS,AX注意:汇编指令涉及到的寄存器名有20个。其中,字节寄存器只有
AHALBHBLCHCLDHDL寄存器寻址既可以作DST,也可以作SRC。源操作数和目的操作数的字长一致
图例CS不能作为目的操作数如:MOVCS,AX错例:MOVAX,BXAX
BX
若(AX)=1234H,(BX)=5678H,则CPU执行上条指令后,(AX)=5678H,而(BX)不变。
又如:MOVCX,DL(语法错误)
错误原因:类型不一致。3.2.1.3存储器寻址方式
指令中操作数是操作对象在内存中的存放地址的寻址方式叫存储器寻址方式。操作对象是内存地址所对应的存储单元中的内容。存储器寻址方式分为五种:直接寻址方式、寄存器间接寻址方式、寄存器相对寻址方式、基址变址寻址方式、相对基址变址方式。由段地址及段内偏移地址确定内存地址对应的SR及EA1、直接寻址方式—有效地址EA由指令直接给出
例:MOVAX,[2000H]
*
隐含的段为数据段DS*
可使用段超越前缀
例:
MOVES:[2000H],AL*
操作数地址常数、常量或常数表达式加[]表示,也可由变量名(符号地址)或变量名加减常量表示。例如:MOVBX,[N] ;N为常量名
MOVBX,ES:[2+3*5] MOVDX,A ;A为变量名
MOV
SI,A+5
EA=N图例图例AXCS段操作码例1:MOVAX,[2000H]若DS为3000H,则:AH
AL
32000H32001H30000H
+DS……
……存储器数据段20H00HA1H2000H
PA=32000H
3050CS段操作码例2:MOVES:[2000H],AL若ES为2050H,则:AL
22500H20500H
+ES………存储器附加数据段20H00H2000H
PA=22500H
前缀码2、寄存器间接寻址(简称间接寻址)—EA在基址寄存器(BX/BP)或变址寄存器(SI/DI)中
MOVAX,[BX]PA=16(DS)+(BX)MOVAX,ES:[BX]PA=16(ES)+(BX)
MOVAX,[BP]PA=16(SS)+(BP)MOV
BP,[SI]PA=16(DS)+(SI)MOV
SP,SS:[DI]PA=16(SS)+(DI)
*不允许使用AX、CX、DX存放EAMOVAX,[CX]错*BP默认相对SS段,其它则默认相对DS段。
EA=R
有效地址=(BX)(BP)(SI)(DI)+相对偏移量(8位或16位)3、寄存器相对寻址方式—EA为寄存器内容加上一个相对偏移量
*相对偏移量可以是常数、常量、常数表达式以及变量名等EA=R+n例3.5:MOV
AX,[BX+6]MOV
BX,DS:[BP+N];N为常量名MOV
BP,A[SI];A为变量名,变量名常写于“[”前MOV
SP,[DI][8];另一种书写格式MOV
CX,8[DI];另一种书写格式
例:MOVAX,COUNT[SI]
假设(DS)=3000H,(SI)=2000H,COUNT=3000H,PA=3000H×10H+(2000H+3000H)
则:PA=35000H
假设(35000H)=1234H,
那么(AX)=1234H
在相对偏移量为常数时,操作数所在单元的段地址以寄存器为准,若寄存器为BX、SI、DI,操作数默认在DS段中。若寄存器为BP,操作数默认在SS段中。在相对偏移量为变量时,操作数所在单元的段地址以变量为准,变量在哪个段定义的,就取该段的段地址。注意:例:若(DS)=1500H,TABLE为在DS段定义的一个字变量,且偏移地址为0004H,(BP)=0003H。
MOVAX,TABLE[BP]SRC的寻址方式为寄存器相对寻址。指令完成的操作为:
(AX)(DS:TABLE+(BP))PA=1500H×10H+(0004H+0003H)
则:PA=15007H4、基址变址寻址方式—EA为一个基址寄存器内容加上一个变址寄存器的内容*必须是一个基址寄存器和一个变址寄存器的组合
MOVAX,[BX][BP]错
MOVAX,[SI][DI]错*若用到BP则默认相对SS段,其它则默认相对DS段。有效地址=(BX)(SI)(BP)(DI)+EA=BR+IR例3.6
MOV
AX,[BX+SI]
MOV
BX,DS:[BP+SI]
MOV
DX,[BP][DI] ;另一种书写格式
MOVAX,ES:[BX][SI]5、相对基址变址寻址方式—EA为一个基址寄存器内容加上一个变址寄存器的内容再加上一个相对偏移量默认段地址来源,同寄存器相对寻找方式例3.7:MOV
AX,[BX+SI+19]MOV
BX,DS:[BP][SI][8];另一种书写格式MOV
BP,[BP+DI+N] ;N为常量名MOV
A[BX][DI],DX ;A为变量名相对偏移量(8位或16位)
有效地址=(BX)(SI)(BP)(DI)++EA=BR+IR+n例:设DS=1200H,BX=05A6H,SS=5000H,BP=40A0H,SI=2000H,DI=3000H,位移量DISP=1618H。试判断下列指令的寻址方式,并求出在各种寻址方式下的EA和PA,并说明指令执行的结果。MOVAX,[0618H]直接寻址EA=0618H执行结果:将数据段12618H和12619H两单元的内容取出送AX。PA=DS左移4位+EA=12000H+0618H=12618H存储器寻址实例(一)30MOVAX,[BX]寄存器间接寻址EA=BX=05A6H执行结果:将数据段125A6H和125A7H两单元的内容取出送AX。PA=DS左移4位+EA=12000H+05A6H=125A6H存储器寻址实例(二)31MOVAX,[BP]寄存器间接寻址EA=BP=40A0H执行结果:将堆栈段540A0H和540A1H两单元的内容取出送AX。PA=SS左移4位+EA=50000H+40A0H=540A0H存储器寻址实例(三)32MOVAL,[DI+DISP]寄存器相对寻址EA=DI+DISP=3000H+1618H=4618H执行结果:将数据段16618H单元的内容取出送AL。PA=DS左移4位+EA=12000H+4618H=16618H存储器寻址实例(四)MOVAX,[BX+DI]基址加变址寻址EA=BX+DI=05A6H+3000H=35A6H执行结果:将数据段155A6H和154A7H两单元的内容取出送AX。PA=DS左移4位+EA=12000H+35A6H=155A6H存储器寻址实例(五)MOVAX,[BP+SI+DISP]基址变址相对寻址EA=BP+SI+DISP=40A0H+2000H+1618H=76B8H执行结果:将堆栈段576B8H和576B9H两单元的内容取出送AX。PA=SS左移4位+EA=50000H+78B8H=576B8H存储器寻址实例(六)图3.3任一存储单元可采用
五种存储器寻址方式任一种
3.2.1.4端口寻址方式端口地址给出的方式有两种:常数(端口直接寻址方式)
DX寄存器(端口间接寻址方式)端口直接寻址方式:指令直接提供8位端口地址。寻址范围为0-255(00H--FFH),即一个字节的地址值。端口间接寻址方式:由DX寄存器给出16位端口地址。
DX的取值范围为0-65535(0000H—FFFFH)。
例3.8: IN
AX,41H ;41H为端口直接寻址OUT
DX,AL ;DX为端口间接寻址
*端口操作数只能出现在I/O指令,即IN和OUT指令,端口操作数实质上是指明端口的地址,操作对象是端口地址对应的端口中的内容。3.3指令系统按功能分为:数据传送类算术运算类逻辑运算和移位类串操作类程序控制转移类
I/O类处理器控制类重点关注:指令的助记符指令的汇编格式指令的基本功能指令支持的数据类型指令支持的寻址方式指令的执行对标志位的影响英文缩写含义本书讲解指令系统所用的一些英文缩写如下:
SR:段寄存器N:立即数F:标志位
UR:通用寄存器
UR8:8位通用寄存器,UR16:16位通用寄存器
M或[EA]:存储器操作数
B:字节,W:字,DW:双字
DST:目的操作数,SRC:源操作数
OD:操作数
传送类指令(12条)一般传送交换传送堆栈传送地址传送标志传送POPF传送类指令又可分为五小类:3.3.1.1一般传送MOV(赋值)指令。助记符:MOV基本格式:MOV
DST,SRC数据类型:B/W功能:将第二操作数送给第一操作数, 即DST←SRC对F影响:无寻址方式:注意:*DST不能是立即数和CS
*立即数不能直接送段寄存器
MOVDS,2000H错
*DST、SRC不能同时为段寄存器
MOVDS,ES错*DST、SRC不能同时为存储器寻址
MOV
A,B错注意:不能直接赋值可通过间接赋值来实现。例3.18:
MOV
AX,DATA
MOV
DS,AX ;实现将DATA段地址送DS
MOV
AX,CS
MOV
DS,AX ;实现将CS送DS
MOV
AL,A
MOV
B,AL;A、B为字节变量,实现将A的值送给BN→UR(注意数据表示范围)例3.9:MOV
AL,80 ;AL=80=50HMOV
AX,80 ;AX=80=0050HMOV
BX,1200;BX=04B0HMOV
CX,N ;N为常量MOV
AX,DATA ;DATA为段名,段名代表段的段地址错:MOV
CL,300 ;数据300超出字节表示范围N→M
(注意类型明确)例3.10:MOV
A,8
;A为变量名,8的类型由A的变量类型决定MOV
BYTEPTR[BX],8;字节传送MOVWORDPTR[BX],8;字传送错:MOV
[SI],8;类型不明确注:BYTEPTR和WORDPTR用来定义地址对应单元的数据类型UR→UR(注意类型匹配)例3.11:MOV
AL,AHMOV
BH,DLMOV
SP,AXMOV
CX,CX错:MOV
CX,BL;类型不匹配UR→SR
(注意CS不能为目的操作数及类型匹配)例3.12:MOV
DS,AXMOV
ES,DX错:MOV
CS,AX
;CS不能作为目的操作数错:MOV
SS,CL
;CL为字节类型,类型不匹配UR→M
(类型由UR决定,若变量与UR类型不一致,则需类型转换)例3.13:MOV
[20H],ALMOV
[BX],BXMOV
ES:[BP],CXMOV
A,DX ;假设A为字变量错:MOV
A,DL
;或改为MOVBYTE
PTRA,DLSR→UR(注意类型匹配)例3.14:MOV
AX,CSMOV
BX,SS错:MOV
CL,DS;类型不匹配SR→M
(M的类型必须为字)例3.15:MOV
CS:[BX],DSMOV
[BP],SS错:MOV
B,CS
;若B为字节变量,则类型不匹配M→UR(类似于UR→M,只是方向相反)例3.16:MOV
AL,[20H]MOVBX,[BX]M→SR(类似于SR→M,只是方向相反,而且SR不能是CS)例3.17:MOV
DS,SS:[20H]MOV
SS,[BP]3.3.1.2交换传送交换传送有二条指令:XCHG(互换)和XLAT(换码)1、XCHG指令:助记符:XCHG基本格式:XCHG
OD1,OD2数据类型:B/W功能:将第二操作数与第一操作数的值互换,即OD1
OD2对F影响 无寻址方式:注意:*SR不能参加互换XCHGBX,ES错
*立即数不能参加互换XCHGAX,1234H错*
M与M不能互换XCHG
A,B错例3.20:
XCHG
AX,BX
XCHG
AL,AH
XCHG
CL,[BX][DI]
XCHG
A[DI],DX例3.21:A
B(A、B为字节变量)
MOV
AL,A
XCHG
AL,B
MOV
A,AL2、XLAT换码指令(查表指令):助记符XLAT基本格式 XLAT[代码表的起始地址]数据类型隐含寻址方式隐含功能(BX+AL)→AL对F影响 无XLAT常用于将序号码转换成ASCII码、键盘按键代码、显示代码等其它码元。实际使用时的基本格式:
MOVBX,OFFSET代码表;将代码表的首地址送BX MOVAL,序号 ;将需转换的第几个送AL XLAT ;将DS:(BX+AL)对应存储单元内容送AL获取操作对象的段内偏移地址建立代码转换表:最大容量256字节,将该表定位到内存中某个逻辑段的一片连续地址中,并将表首地址的偏移量置入BX。
MOVBX,0030H例如:十进制数0~9的七段显示码表,被定位在当前数据段中,其起始地址的偏移地址值为0030H,将AL中待转换的十进制数5转换成对应的七段码。CS=2000H,IP=007AH,DS=4000H。将待转换的一个十进制数在表中的序号送入AL中。
MOVAL,5
执行XLAT命令。
XLAT操作步骤:…D7……4079243019120278001020000HCS首地址2007AH40000HDS首地址40030H40031H40032H40033H40034H40035H40036H40037H40038H40039HBX+0BX+1BX+2BX+3BX+4BX+5BX+6BX+7BX+8BX+9+BX=0030HAL=5H查表指令例3.3.1.3堆栈传送堆栈传送有二条指令:PUSH(进栈)和POP(出栈)在程序调用、中断调用的子程序中一般使用PUSH和POP指令实现现场信息的保护及恢复。堆栈是以后进先出(LIFO)的原则存取信息的一种存储区域。堆栈的段地址存放在SS中,SP在任何时候都指向栈顶,进出栈后自动修改SP。在信息的存与取的过程中,栈顶是堆栈区的动端,而堆栈区的另一端则是固定不变的,这端称为栈底。堆栈以字为单位进行压入弹出操作。
8088/8086系统中,初始化后SP指向堆栈底+1单元的偏移地址。
堆栈:例如:若堆栈段定义空间大小为256字节,则初始化后,(SP)=0100H(SP)=0100H……SS:0000HSS:00FFH256B的堆栈区栈底1、PUSH指令:助记符PUSH基本格式PUSH
SRC数据类型W,只能为字操作寻址方式SRC可以为SR、UR16、M16功能将SRC的内容压入栈顶,即①SP=SP-2②SRC→(SP)
对于8088分四步:①SP=SP-1②SRC高8位→(SP)③SP=SP-1④SRC低8位→(SP)对F影响无例:假设(AX)=2107H,执行
PUSHAX********(SP)PUSHAX执行前(SP)********07H21H低地址
高地址PUSHAX执行后进栈方向例3.22:合法的例子如下:PUSH
CSPUSH
BXPUSH
A ;A为字变量PUSH
WORD
PTR
[BX]PUSH
[BX] ;一定为字操作,所以类型说明可省略非法的例子如下:PUSH
AL ;字节不能进栈PUSH
B ;若B为字节变量,则不对PUSH1000H ;立即数不能进栈*
PUSH指令只能对字操作,不能用立即寻址方式将常数压入堆栈:MOVAX,OFFFFHPUSHAX2、POP指令:助记符POP基本格式POP
DST数据类型W,只能为字操作寻址方式DST可以为SR(除CS外)、UR16、M16功能将栈顶元素出栈给DST,即①(SP)→DST②SP=SP+2
对于8088分四步:①(SP)→DST低8位②SP=SP+1③(SP)→DST高8位④SP=SP+1对F影响无(SP)********07H21HPOPBX执行前(SP)********07H21H低地址
高地址POPBX执行后
(BX)=2107H例:POPBX出栈方向例3.23:合法的例子如下:POP
DSPOP
BXPOP
A ;A为字变量POP
WORD
PTR
[BX]POP
[BX];一定为字操作,所以类型说明可省略非法的例子如下:POP
AL ;字节不能出栈POP
B ;若B为字节变量,则不对POP
CS ;CS不能作为出栈对象*
POP指令只能是字操作,立即数、CS不能作为目的操作数例1:若(SS)=2000H,(SP)=0100H(AX)=1122H,(BX)=3344H,(CX)=5566H则CPU执行以下指令:
PUSHAXPUSHBX
PUSH
CX;此时,栈顶单元的PA=
例1:若(SS)=2000H,(SP)=0100H(AX)=1122H,(BX)=3344H,(CX)=5566H则CPU执行以下指令后,
POPAX;(AX)=
POPCX;(CX)=
POP
BX;(BX)=
;此时,(SP)=
例2:若CPU执行
PUSHAXPUSHBX
PUSH
CX
指令组后,试将压入堆栈的(AX)DX(用MOV指令实现)。SS:SPMOVBP,SPMOVDX,[BP]+04HCLCHBLBHALAH+1+2+3+4BP例:PUSHDSSUBAX,AXPUSHAX…………RET例:PUSHAXPUSHBXPUSHCX……;其间用到AX、BX、CXPOPCX;后进先出
POPBXPOPAX常见应用:用PUSH和POP的组合也可实现两数的互换例3.24(实现AX与BX的互换):PUSH
AX;①PUSH
BX;②POP
AX;③POP
BX;④图3.6堆栈操作示意图AXBX②①③SPSP④3.3.1.4地址传送地址传送有三条指令:LEA(送有效地址)LDS(置有效地址及DS段地址)LES(置有效地址及ES段地址)1、LEA指令:助记符LEA基本格式LEA
UR16,[EA]数据类型隐含功能将第二操作数存储器操作数的偏移 地址送给第一操作数指定的16位通用寄存器,即EA→UR16。寻址方式包含在基本格式中对F影响无它传送的不是操作数本身,而是操作数的有效地址。*源操作数必须是一个存储器操作数,目标操作数通常是间址寄存器(一般用BX、BP、SI、DI)。例3.25:LEA
SI,[2000H]
;SI=2000H,等价于:MOV
SI,2000HLEA
BX,TABLE图例;TABLE的偏移地址送BX,即BX指向TABLE
等价于:MOVBX,OFFSETTABLELEA
DI,[BP]
;DI=BP,等价于:与MOV
DI,BP等价LEABX,[BX+SI+0F62H]77H88HDS:0010H99H66HDAT1TABLE
那么,CPU执行LEABX,TABLE指令完成的功能是:
BX
将TABLE变量所具有的EA
∴(BX)=0012H
◆上述指令完成的功能等效于:
MOVBX,OFFSETTABLE
而CPU执行MOVBX,TABLE指令完成的功能是:
BX(TABLE)
∴(BX)=9988H
LEA指令在程序中的应用例:将数据段中首地址为MEM1
的50个字节的数据传送到同一逻辑段首地址为MEM2的区域存放。编写相应的程序段。LEA指令在程序中的应用
开始取源地址取目标地址送数据块长度到CL传送一个字节修改地址指针修改计数值计数值=0?结束NYLEA指令在程序中的应用LEASI,MEM1LEADI,MEM2
MOVCL,50NEXT:MOVAL,[SI]MOV[DI],ALINCSIINCDIDECCLJNZNEXTHLT2、LDS与LES助记符LDS/LES基本格式 LDS/LES
UR16,[EA]数据类型隐含功能将存储器操作数的第一字送给第一操作数指定的16位通用寄存器,并将存储器操作数的第二字送给操作码部分指明的段寄存器DS/ES。即(EA)→UR16
(EA+2)→DS/ES寻址方式包含在基本格式中对F影响无LDS/LES不但使指定的通用寄存器值发生变化,而且DS/ES也会发生变化。例如:LDS
BX,[SI]
;BX=(SI),DS=(SI+2)BXDSSIDS图3.7
LDS
BX,[SI]的功能40H00H00H30HTABLE(DS):1000HMOVBX,TABLE;(BX)=0040HMOVBX,OFFSETTABLE;(BX)=1000HLEABX,TABLE;(BX)=1000HLDSBX,TABLE;(BX)=0040H;(DS)=3000HLESBX,TABLE;(BX)=0040H;(ES)=3000H注意:*SRC必须为存储器寻址方式*DST是UR16间址寄存器例如:例:数M所在单元的地址指针在POINT双字单元存放着,试将数MAL中。LDSBX,POINTMOVAL,[BX]20H01HPOINT15H1500H:0120H00H≈≈BXDSDS:BXM3.3.1.5标志传送
标志传送有四条指令:LAHF(PSW低8位送AH)SAHF(AH送PSW低8位)PUSHF(PSW进栈)POPF(出栈给PSW)1、LAHF/SAHF指令:助记符LAHF/SAHF基本格式LAHF/SAHF功能
PSW低8位→AH/AH→PSW低8位对F影响无/影响除OF外的其余5个状态标志SF、ZF、
AF、PF和CF,AH的对应位去填充各标志位。SFZF
AFPFCF01234567AH图3.8
LAHF的功能SFZF
AFPFCF01234567AH图3.9
SAHF的功能注:这一对指令主要用于除OF外5个状态标志位的保护和恢复。2、PUSHF/POPF指令:助记符PUSHF/POPF基本格式PUSHF/POPF功能
SP=SP-2,PSW→(SP)/(SP)→PSW,SP=SP+2对F影响无
/影响所有状态标志(SF、ZF、AF、
PF、OF和CF)及所有控制标志(IF、
TF和DF),弹出的栈顶元素对应位去填充各标志位。注:PUSHF/POPF指令主要用于标志位的保存和恢复,PUSHF用于保存所有标志位到栈中,POPF用于从栈中恢复所有标志位。
标志传送举例例3.26设置SF=1,ZF=0,AF=0,PF=1,CF=0。
分析:要置5个状态标志位可用SAHF指令,先按对应位填充一个立即数送AH,再用SAHF实现将AH
送PSW的低8位。;无关位一般填0,即84H解:MOVAH,10000100B
SAHF例3.27设置OF=1,DF=0,IF=1,TF=0,SF=1,ZF=0,AF=0,PF=1,CF=0。分析:要置9个状态标志位可用POPF指令,先按对应位填充一个立即数送AX,再将AX进栈,而后再用POPF实现将栈顶元素出栈送PSW,即N→AX→栈→PSW。解:MOVAX,0000101010000100B;即0A84HPUSHAX
POPF3.3.5I/O类指令(2条指令)
I/O指令只有两条指令:输入IN指令,输出OUT指令。IN AL/AX,PORT/DX ;“/”代表或的关系,所以可一分为四
OUT
PORT/DX,AL/AX ;“/”代表或的关系,所以可一分为四
累加器专用传送指令(只限使用AX或AL)
输入指令IN(I/OCPU)
长格式:INAL,PORT(字节)
INAX,PORT(字)执行操作:(AL)(PORT)(字节)
(AX)(PORT+1,PORT)(字)短格式:INAL,DX(字节)
INAX,DX(字)执行操作:(AL)((DX))(字节)
(AX)((DX)+1,(DX))(字)
端口直接寻址:其取值范围为0-255即00H-FFH端口间接寻址:其取值范围为0-65535即0000H-FFFFH输出指令OUT(CPUI/O)长格式:OUTPORT,AL(字节)
OUTPORT,AX(字)执行操作:(PORT)(AL)(字节)
(PORT+1,PORT)(AX)(字)短格式:OUTDX,AL(字节)
OUTDX,AX(字)执行操作:((DX))(AL)(字节)
((DX)+1,(DX))(AX)(字)注意:*不影响标志位*前256个端口号00H~FFH可直接在指令中指定(长格式)*如果端口号256,端口号
DX(短格式)例:INAX,28H MOVDATA_WORD,AX例:MOVDX,3FCHINAX,DX例:OUT5,AL
3.3.2算术运算类指令(20条)算术运算类指令可分为三小类:加减运算乘除运算BCD修正3.3.2.1加减运算(8条)1、单目运算指令三条:
INC(加1)、DEC(减1)、NEG(求补):助记符INC/DEC/NEG基本格式INC/DEC/NEGOD数据类型B/W寻址方式OD可以为UR及M功能OD=OD+1/OD=OD-1/OD=0-OD对F影响INC、DEC对CF标志位无影响,对其余
5个状态标志位均有影响;NEG对6个状态标志位均有影响。不能是段寄存器或立即数例3.26:INC
BX;BX=BX+1DEC
AL
;AL=AL-1INCBYTEPTR[BX]
;DS:BX对应的内存字节单元加1DEC
WORDPTR[BP]
;SS:BP对应的内存字单元减1例3.29理解下面的程序段,并填充结果。
;设CF=0
MOV AL,0
MOV AH,1
DEC AL
;AX=
H,CF=
。解:AL=00H-1=FFH,AH=01H,CF不变,所以AX=01FFH,CF=0。(其他5个标志位为:OF=0,SF=1,ZF=0,AF=1,PF=1)注:INC或DEC常用于循环程序中修改地址指针或循环计数等场合(如前例)。例:NEG
DL分析: NEG(求补)功能为:0-DL=-DL设:DL原始值为5,则执行后DL为-5,即FBH(-5的补码);6个标志位:
SF=1,PF=0,ZF=0,OF=0,CF=1,AF=1。注意:NEG实质在对操作数按位取反后加1
(即求补操作)对标志位影响的规律总结:INC加1指令只是当对7FH或7FFFH加1时OF=1。DEC减1指令只是当对80H或8000H减1时OF=1。NEG求补指令只有当对80H(8位,即-128)或8000H(16位,即-32768)求补时OF=1,其它情况下OF=0;只有当对0求补时CF=0,其它情况下CF=1。2、双目运算指令5条:
ADD(加)、ADC(带CF加)、SUB(减)、
SBB(带CF减)、CMP(比较)基本格式
ADD/ADC/SUB/SBB/CMPDST,SRC功能
DST=DST+SRC/
DST=DST+SRC+CF/
DST=DST-SRC/DST=DST-SRC-CF/DST-SRC数据类型B/W寻址方式:源操作数:8/16位通用寄存器,存储器,立即数目的操作数:8/16位通用寄存器,存储器对F影响这5条指令对6个状态标志位均有影响。影响的填充方法按通用填充方法填充。
提示:
目的操作数不能为立即数;源操作数和目的操作数不能同时为存储器;段寄存器不能作操作数。例3.30:ADD
AX,BX
;AX=AX+BX设指令执行前AX=35C9H,BX=726DH,则执行后AX=A836H,BX不变,SF=1,PF=1,ZF=0,OF=1,CF=0,AF=1例3.31:ADC
BH,DL
;BH=BH+DL+CF设指令执行前BH=96H,DL=6DH,CF=1,则执行后BH=04H,DL不变,SF=0,PF=0,ZF=0,OF=0,CF=1,AF=1注:
ADC指令多用于多字节数相加,使用前要先将CF清零。例:完成双字相加,被加数存放在DX(高)与AX(低)中,加数放在BX(高)和CX(低)中,和放在DX与AX中。程序段如下:
ADDAX,CXADCDX,BX
;高位运算时要考虑低位的进位例3.32:SUB
CX,[BX]
;CX=CX-(BX),字操作设指令执行前CX=1296H,DS=2000H,BX=100H,(20100H)=3DH,(20101H)=28H,则(BX)=283DH,执行后CX=EA59H,BX、(BX)不变,SF=1,PF=1,ZF=0,OF=0,CF=1,AF=1例3.33:SBB
[DI],BL
;(DI)=(DI)-BL-CF,字节操作设指令执行前DS=2000H,BL=76H,DI=6DH,(2006DH)=B2H,CF=1,则(DI)=B2H,执行后(2006DH)=3BH,DI、BL不变,SF=0,PF=0,ZF=0,OF=1,CF=0,AF=1例3.34:CMP
AL,10H
;AL-10H,不保存结果,但影响标志,可用于数据大小比较。设指令执行前AL=96H,则执行后AL不变,AL-10=86H。SF=1,PF=0,ZF=0,OF=0,CF=0,AF=0注:用于比较两个数的大小,可作为条件转移指令转移的条件判断两个数大小:无符号数:根据借位标志CF判断。
ZF=1,AX=BX;ZF=0,AXBXCF=0,表示无借位,即AX
BX;
CF=1,表示有借位,即AX<BX;
有符号数:根据溢出标志OF和符号标志SF两者的异或运算结果来判断。
OFSF=0
(OF和SF状态相同)时,则AXBX;
OFSF=1(OF和SF状态相异)时,则AX<BX;通常,比较指令后面跟一条条件转移指令,检查标志位的状态决定程序的转向。
假设执行比较指令:CMPAX,BX比较指令例例3.35理解下面的程序段,并填充结果。
MOV AX,’爱’
MOV BX,’AI’
CMP AX,BX;SF⊕OF=
,CF=
。分析:主要要理解ASCII码、汉字内码,以及无符号数、有符号数的大小比较。ASCII码最高位为0,汉字内码最高位为1,所以作为无符号数汉字比英文字符大,作为有符号数汉字比英文字符要小。解:SF⊕OF=1,CF=0。3.3.2.2乘除运算乘除运算共有六条指令:
MUL(无符号数乘)、IMUL(有符号数乘)、DIV(无符号数除)、IDIV(有符号数除)、CBW(字节扩展成字)、CWD(字扩展成双字)。1、MUL、IMUL指令:助记符MUL/IMUL基本格式MUL/IMUL
SRC数据类型B/W功能与SRC的数据类型有关,SRC若为字节则为 AL*SRC送AX;SRC若为字则为AX*SRC送 DX、AX,DX保存高16位,AX保存低16位。寻址方式SRC只能是UR或M,不能为N或SR。对F影响对6个状态标志均有影响,但只有CF、OF有定义,其填充方法为若字节乘字节未超过字节表示范围或字乘字未超过字范围则CF=0、OF=
0,否则CF=1、OF=1。乘数对乘法指令主要注意:一是隐含操作数:被乘数一定为AL或AX,积为AX或DX、AX,不需在指令中另行指明;二是对CF、OF的填充:无符号数只要判断高位段是否为全0,若是则未超出范围,有符号数只要判断高位段是否为低位的符号位扩展,若是则未超出范围。三是模拟计算:无符号数直接相乘即可,有符号数则需先用绝对值相乘,而后再加符号位(同号得正、异号得负)。例3.36:若AL为05H、BL为F7H则MUL
BL指令执行后AX=?CF、OF=?无符号数乘法直接相乘,所以AX= 05*F7H=04D3H、CF=1、OF=1。例3.37:若AL为05H、BL为F7H则IMUL
BL指令执行后AX、CF、OF=?有符号数乘法先用绝对值相乘、再加符号位,所以AX=-(05*09H)=-2DH
=FFD3H、CF=0、OF=0。例:(AX)=16A5H,(BX)=0611H
(1)IMULBL
;(AX)(AL)*(BL);A5*11-(5B*11)=-060BHF9F5H;(AX)=F9F5HCF=OF=1(2)MULBX;(DX,AX)(AX)*(BX);16A5*0611=00895EF5;(DX)=0089H(AX)=5EF5HCF=OF=12、DIV、IDIV指令:助记符DIV/IDIV基本格式DIV/IDIV
SRC数据类型B/W功能与SRC的数据类型有关,SRC若为字节则为AX/SRC的商送AL、余数送AH;SRC若为字则为DX、AX/SRC的商送AX、
余数送DX。寻址方式SRC只能是UR或M,不能为N或SR。对F影响对6个状态标志均有影响,但均无定义。指令要求被除数是除数的双倍字长对除法指令主要注意:一是隐含操作数,被除数一定为AX或DX、AX,商为AL或AX,余数为AH或DX,不需在指令中另行指明;二除法不允许出现除数为0或商溢出(除字节时,商超出AL或除字时,商超出AX范围),若发生除数为0或商溢出则其结果没有意义,并引起中断。三是模拟计算,无符号数直接相除即可,有符号数则需先用绝对值相除,而后再加符号位商的符号为同号得正、异号得负,余数的符号则与被除数相同。例3.38:若AX为1005H、BL为17H则DIV
BL指令执行后AX=?无符号数除法直接相除,所以1005H/17H=4101/23,商为178(176+2),余数为7,即AL=B2H、AH=07H,因此AX=07B2H。例3.39:若AX为FF05H、BL为17H则IDIV
BL指令执行后AX=?有符号数除法先用绝对值相除、再加符号位,FF05H的绝对值为0-FF05H=FBH=251,251/23的商为10,余数为21,商的符号为负,余数的符号也为负,所以AL=-10=F6H,AH=-21=EBH,因此AX=EBF6H。例3.41理解下面的程序段,并填充结果。
MOV AL,200
MOV AH,-1
MOV BL,10
IDIV BL;AX=
H,商十进制为
。AX=FFC8H=-56,BL=10,商为-5即FBH,余数为-6即FAH解:AX=FAFBH,商十进制为-5。3、CBW和CWD指令:助记符CBW/CWD基本格式CBW/CWD数据类型隐含功能CBW为将AL有符号扩展成AX/CWD为将AX有符号扩展成DXAX寻址方式隐含对F影响对标志位无影响MOVAL,64H
;AL=64H(机器数),表示10进制数100(真值)CBW
;将符号0扩展,AX=0064H,仍然表示100MOVAX,0FF00H
;AX=FF00H,表示有符号10进制数-256CWD
;将符号位“1”扩展,DX.AX=FFFFFF00H
;仍然表示-256例:例3.40:设A,B,C,D为字节变量,且A除B不会溢出,试编写无符号数或有符号数A/B商送C,余数送D。
;无符号数除;有符号数除MOV
AL,A
MOV
AL,AMOV
AH,0
CBWDIV
B
IDIV
BMOV
C,AL
MOV
C,ALMOV
D,AH
MOV
D,AH例:x,y,z,v均为16位带符号数,计算
(v-(x*y+z–540))/xMOVAX,XIMULY;x*y→(DX,AX)MOVCX,AXMOVBX,DXMOVAX,ZCWD;Z→(DX,AX)ADDCX,AXADCBX,DX;x*y+z→(BX,CX)SUBCX,540SBBBX,0;x*y+z-540MOVAX,VCWD;V→(DX,AX)SUBAX,CXSBBDX,BX;v-(x*y+z-540)IDIVX;(v-(x*y+z-540))/x→(AX) 余数→(DX)3.3.2.3
BCD修正BCD修正共有六条指令,可分为压缩BCD码修正指令和非压缩BCD码修正指令。压缩BCD码修正指令有:
DAA(加法修正)、DAS(减法修正)。非压缩BCD码修正指令有:
AAA(加法修正)、AAS(减法修正)、
AAM(乘法修正)、AAD(除法修正)。复习:BCD码:用二进制编码的十进制数,又称二--十进制数压缩的BCD码:用4位二进制数表示1位十进制数例:(59)10=(01011001)BCD非压缩的BCD码:用8位二进制数表示1位十进制数
例:(59)10=(0000010100001001)BCD数字的ASCII码是一种非压缩的BCD码
DIGIT ASCII BCD0 30H 001100001 31H 001100012 32H 00110010…
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 北京小工装合同范本
- 净水渔业合同范本
- 专柜撤柜合同范本
- 冷库轨道转让合同范本
- 借购合同范例范例
- 出租给超市合同范本
- 鲜花店采购合同范本
- 品牌授权合作合同范本
- 租赁奢华汽车合同范本
- 合伙开模合同范本
- 生物节律调节课件
- 2025年黑龙江民族职业学院单招职业技能测试题库汇编
- 感恩父母课件:父母的爱如山如水
- 不分手承诺书(2025版)恋爱忠诚协议
- 2020-2025年中国国有控股公司行业发展趋势及投资前景预测报告
- 病区8S管理成果汇报
- 民法典题库(附答案)
- 绥芬河市2025年上半年招考事业单位专业人员易考易错模拟试题(共500题)试卷后附参考答案
- 小学数学新课程标准(教育部2024年制订)
- 2025复工复产安全教育培训
- 2024年叉车司机车辆基本操作知识考试题库及答案(共70题)
评论
0/150
提交评论