版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1第3章80x86汇编语言程序设计(中)23.4顺序结构程序设计顺序结构是最简单也是最基本的程序结构。程序按顺序执行,不发生任何转移,通常非控制转移类指令都可编写顺序结构程序。语句1语句n语句2
..33.4.1数据传送指令通用数据传送指令地址传送指令标志寄存器传送指令输入输出指令类型转换指令4PUSHA/PUSHAD(pushallregisters)所有寄存器进栈POPA/POPAD(popallregisters)所有寄存器出栈1、通用数据传送指令MOV(move)传送MOVSX(movewithsigh-extend)带符号扩展传送MOVZX(movewithzero-extend)带零扩展传送PUSH(pushontothestack)进栈POP(popfromthestack)出栈XCHG(exchange)交换XLAT(translate) 换码(查表)MOV传送指令格式:MOVDST,SRC操作:DST<--(SRC)
即把源操作数的内容送入目的操作数说明:1)可以进行8位、16位或32位数据的传送
2)SRC可为立即数、寄存器、存储器操作数
3)DST可为寄存器、存储器操作数
4)该指令不影响任何状态标志位存储器段寄存器CSDSSSES立即数通用寄存器AXBXCXDXBPSPSIDI5MOV指令示例MOVAX,[BX+DI];存储器操作数MOVAX,ARRAY[SI];传送到寄存器MOVAX,0B00H;立即数传送到寄存器MOVCL,10000000BMOVVALUE,100H;立即数传送到存储单元MOVES:[BX],4BHMOV[BX],CX;寄存器内容传送到存储器MOVBUFF[BP][DI],AXMOVAL,BL;寄存器之间传送MOVBP,SI6MOV指令注意事项:(1)两个操作数长度必须一致
MOVAL,BX;不合法例外:源是16进制立即数,位数小于目的操作数时,高位按0扩展,源是10进制立即数,位数小于目的操作数时,高位按符号位扩展
MOVAX,0D8H
执行后,(AX)=00D8HMOVAX,-40
执行后,(AX)=FFD8H(2)不允许用立即数为段寄存器赋值例:MOVES,10A0H;不合法7(3)不允许两个操作数均是存储器操作数
MOVX,Y;不合法可以通过一个寄存器传送:
MOVAX,YMOVX,AX(4)不允许两个操作数均为段寄存器
MOVES,DS;不合法(5)不允许CS、IP和立即数做目标操作数
MOVCS,AX ;不合法
MOV100H,AX ;不合法
MOVIP,BX ;不合法89MOVSX带符号扩展传送指令格式:MOVSXDST,SRC操作:DST<--符号扩展(SRC)MOVZX带零扩展传送指令格式:MOVSXDST,SRC操作:DST<--零扩展(SRC)说明:
1)源操作数是8位或16位寄存器或存储器的内容
2)目的操作数必须是16位或32位寄存器10MOVSX指令示例
MOVSXEAX,CL
设(CL)=0ABH,执行后(EAX)=0FFFFFFABH
负号扩展若(CL)=57H,执行后(EAX)=00000057H
正号扩展MOVZX指令示例
MOVZXEAX,DATA
设(DATA)=87ADH,执行后(EAX)=000087ADH0扩展11PUSH压栈指令格式:PUSHSRC操作:
SP<--(SP)-2((SP)+1,(SP))<--(SRC)32位指令:
ESP(ESP)-4((ESP)+3,(ESP)+2,(ESP)+1,(ESP))(SRC)说明:1)源操作数可以是寄存器或存储器操作数
2)必须以字或双字为单位操作
3)32位指令允许SRC是16位或32位立即数,也容许是32位寄存器和存储器操作数举例:PUSHAXPUSHDAT[BX][SI]
PUSH1234H PUSH87654321H PUSHEAX12
压栈指令示例
PUSHAX
执行前
AXAX
25H31HSP52500H 3125H3125H低地址低地址进栈方向SP3125H524FEH524FFH52500H执行后13POP出栈指令格式:POPDST操作:
16位指令:
DST<--((SP)+1,(SP))SP<--(SP)+2
32位指令:
DST((ESP)+3,(ESP)+2,(ESP)+1,(ESP))(ESP)(ESP)+4举例:POPAXPOPDAT[BX][SI] POPDS
POPECX14出栈指令示例
POPBX
执行前执行后
BXBX75C1H
低地址低地址
SP6Bh51000H6Bh51000H48h1H48h1H9Ah2H9Ah2H28h3H28h3H出栈方向48h6Bh48h48h6BhSP15PUSHA所有寄存器进栈格式:PUSHAPUSHA:(286及其后继机型)
16位通用寄存器依次进栈,次序为:AX,CX,DX,BX,指令执行前的SP,BP,SI,DI
指令执行后SP(SP)-16仍指向栈顶操作:PUSHAD:
(386及其后继机型)
32位通用寄存器依次进栈,次序为:EAX,ECX,
EDX,EBX,指令执行前的ESP,EBP,ESI,EDI
指令执行后ESP(ESP)-32仍指向栈顶16PUSHA指令示例(DI)-16(SI)-14(BP)-12(SP)原
-10(BX)-8(DX)-6(CX)-4(AX)-20(SP)原(SP)执行前执行后17POPA所有寄存器出栈格式:POPAPOPA:(286及其后继机型)
16位通用寄存器依次出栈,次序为:
DI,SI,BP,SP,BX,DX,CX,AX
指令执行后SP(SP)+16仍指向栈顶操作:POPAD:
(386及其后继机型)
32位通用寄存器依次出栈,次序为:EDI,ESI,
EBP,ESP,EBX,EDX,ECX,EAX
指令执行后ESP(ESP)+32仍指向栈顶18XCHG交换指令格式:XCHGOPR1,OPR2操作:(OPR1)(OPR2)说明:
1)操作数不允许为段寄存器
2)两个操作数长度必须相同
3)本指令不影响状态标志位
4)两个操作数不能同时为存储器操作数如:
XCHGAX,BX;寄存器之间交换
XCHGBX,[BP+DI];寄存器与存储器之间交换
XCHG[SI],DX19交换指令示例
XCHGDX,DATA[BP]设(SS)=5000H,(BP)=0400H,DATA=1800H
物理地址=5000H×16+0400H+1800H=51C00H
执行前执行后
DXDX37CDH
51C00H42H51C00H1H6DH1H
CDH37H6D42H20XLAT查表指令(换码指令)格式:XLATTABLE或
XLAT操作:AL<--((BX)+(AL))或AL((EBX)+(AL))
将AL中的当前内容转换为表中某一种代码。执行前一定要将表(TABLE)的EA赋给BX
(或EBX)寄存器,将代码在表中距首址的偏移放在AL寄存器中。XLAT指令示例
TABLE30HMOVBX,OFFSETTABLE+131H
;表首址给BX +232HMOVAL,4 +333H
;待转换内容到AL +434H
XLAT +535H+636H+737H34HAL21LDS(loadDSwithpointer)
指针送寄存器和DSLES(loadESwithpointer)
指针送寄存器和ESLFS(loadFSwithpointer)
指针送寄存器和FSLGS(loadGSwithpointer)
指针送寄存器和GSLSS(loadSSwithpointer)
指针送寄存器和SS2、地址传送指令LEA(loadeffectiveaddress)
有效地址送寄存器22LEA指令示例设(DS)=2000H,(BX)=1234HLEADI,[BX] MOVSI,[BX]执行后执行后
21234H78H 5H56H1234H1234HBXLEA装载有效地址指令格式:LEADST,SRC操作:DST<--SRC的有效地址EA说明:SRC必须是存储器操作数,而DST则必须是一个16位或32位的通用寄存器(AX..DI..)
DI5678HSI78H1234H56235678HLEADI,BUFFER;将变量BUFFER的;有效地址送到DI,;而不是将BUFFER;变量的值送DI78H562000H:1234H5HBUFFERDI1234HDIMOVDI,BUFFER;将变量BUFFER的有效地址;所指单元的值送DI执行后执行后1234H78H56H注意LEA与OFFSET的区别24LDS装载数据段指针指令
格式:LDSDST,SRC
操作:DST(SRC)DS(SRC+2)或
DS(SRC+4)LES、LFS、LGS、LSS
格式:同LDS,目标分别是ES,FS,GS,和SS寄存器说明:
1)源操作数必须是32位或48位存储器操作数
2)目的操作数必须是寄存器
3)完成一个逻辑地址的传送,该逻辑地址须用伪指令预先定义在当前数据段中257659H2000HH45HHD6HH00HH50HD645H5000HDSDIDIDSLDS指令示例
LDSDI,[BX]设(DS)=2000H,(BX)=1000H执行前执行后
再比如:LDSBX,BUFF[SI]LDSDI,BUFF4550D60026LEA与LDS的区别LEASI,BUFFLDSDI,BUFFBUFF(21000H)45H+1D6H+200H+350H设(DS)=2000HEABUFF=1000H执行后:SI=1000HDI=D645HDS=5000H思考:LDSDI,BX是合法指令吗?27
LAHF(loadAHwithflags)
标志送AHSAHF(storeAHintoflags)AH送标志寄存器3、标志寄存器传送指令PUSHF/PUSHFD(pushtheflagsoreflags)
标志进栈POPF/POPFD(poptheflagsoreflags)
标志出栈28LAHF标志寄存器送AH指令格式:LAHF
操作:AH<--FLAGS7-0
即将标志寄存器的最低8位送AH中SAHF送标志寄存器指令格式:SAHF操作:FLAGS7-0<--(AH)
即将AH寄存器内容送FLAGS最低8位说明:1)无操作数
2)FLAGS中含若干标志位,但LAHF指令本身不影响标志位29PUSHF标志进栈指令格式:PUSHF操作:PUSHF:SP(SP)-2((SP)+1,(SP))(FLAGS)PUSHFD:(ESP)(ESP)-4((ESP)+3,(ESP)+2,(ESP)+1,(ESP))(EFLAGSAND0FCFFFFH)
(清除VM和RF位)说明:无操作数30POPF标志出栈指令格式:POPF操作:POPF:FLAGS((SP)+1,(SP))SP(SP)+2POPFD:EFLAGS((ESP)+3,(ESP)+2,(ESP)+1,(ESP))ESP(ESP)+4314、输入输出指令
IN(input)输入
OUT(output)输出32
IN输入指令(从接口电路的端口输入数据)说明:用Port指明8位端口地址时,地址范围为00H-FFH
以DX间接给出端口地址时,最大地址为0FFFFH操作:AL/AX/EAX<--(Port)
从外设读入字节或字或双字数据
AL/AX/EAX<--(DX)
以DX内容为端口地址,读入数据格式2:INAL,DX(字节)
INAX,DX(字)
INEAX,DX(双字)格式1:INAL,Port(字节)(Port是0-FFH的立即数)INAX,Port(字)(Port是0-FFH的立即数)
INEAX,Port(双字)
(Port是0-FFH的立即数)33OUT输出指令(向接口电路的端口输出数据)格式1:OUTPort,AL(字节)
OUTPort,AX(字)
OUTPort,EAX(双字)格式2:OUTDX,AL(字节)
OUTDX,AX(字)
OUTDX,EAX(双字)操作:(Port)<--(AL)/(AX)/(EAX)
传送数据到Port端口
(DX)<--(AL)/(AX)/(EAX)
传送数据到DX指出的端口说明:用Port指明8位端口地址时,地址范围为00H-FFH
以DX间接给出端口地址时,最大地址为0FFFFH34IN指令示例
INAL,20H;从20H端口读入字节数据-->ALINAX,48H;从48H端口读入字数据-->AX
MOVDX,3FCHINAX,DX;从03FCH端口读入字数据-->AXOUT指令示例
OUT32H,AX;传送字数据到32H端口
MOVDX,400HMOVAL,86HOUTDX,AL;传送字节数据到DX指出的端口355、类型转换指令CBW(convertbytetoword)
字节转换为字CWD/CWDE(convertwordtodoubleword)
字转换为双字CDQ(convertdoubletoquad)
双字转换为4字BSWAP(byteswap)
字节交换36CBW字节转换为字格式:CBW
操作:扩展AL中的符号至AH中,将8位数扩展成等效的16位数CWD/CWDE字转换为双字格式:CWD操作:扩展AX中的符号至DX中,将16位数扩展成等效的32位数格式:CWDE操作:AX的内容符号扩展到EAX说明:
用于在符号数除之前,形成双倍长度的被除数37CDQ双字转换为4字格式:CDQ操作:EAX的内容符号扩展到EDX,形成EDX:EAX
中的4字BSWAP字节交换格式:BSWAPr32操作:使32位寄存器的字节次序变反(1、4字节交换,2、3字节交换)BSWAP指令示例
BSWAPEAX
执行前(EAX)=11223344H
执行后(EAX)=44332211H38数据传送指令小结1、数据传送指令不影响标志位(除SAHF)2、除XCHG指令外,都是从源到目的的单向传送3、注意MOV指令与LEA指令的区别4、堆栈的存取在16位指令中必须以字为单位,5、8086不允许PUSH指令使用立即数寻址方式如:PUSH12;8086中不合法但286及其后继机型中允许6、POP指令不允许使用立即数寻址方式,不允许使用CS寄存器
例:POP12
;不合法
POPCS;不合法397、段寄存器只能在MOV、PUSH、POP指令中作为操作数出现例:MOVES,AXPUSHCSPOPDS
但下列指令不合法:
MOVCS,regPOPCS8、指令有多种格式,一般都遵循以下规则:双操作数指令中不允许两个操作数均为存储器操作数单操作数指令不允许立即寻址方式目的操作数不允许使用立即寻址方式3.4.2算术运算指令40加法指令
ADDADCINCXADD除法指令
DIVIDIV乘法指令
MULIMUL减法指令
SUBSBBDECNEGCMPCMPXCHGCMPXCHG8B算术运算中关于溢出的结论:OF——表示有符号数的溢出
CF——表示无符号数的溢出(进位)ADD常规加指令格式:ADDDST,SRC操作:DST<--(DST)+(SRC)指令构成方式:ADDreg,imme;寄存器与立即数相加ADDreg,reg;寄存器之间ADDreg,mem;寄存器加存储器操作数ADDmem,imme;存储器加立即数ADDmem,reg;存储器操作数加寄存器
说明:运行结果对CF、SF、OF、PF、ZF、AF都会影响41ADD指令示例1
ADDDX,BX
设(DX)=4652H,(BX)=0F0F0H4652H+F0F0H13742H0100011001010010+111100001111000010011011101000010进位进位执行后
(DX)=3742H
ZF=0结果不为0SF=0结果为正
CF=1有进位
OF=0不溢出42ADD指令示例2
ADDWORDPTR[BX],9F76H
设(DS)=2000H,(BX)=1000H
执行前:
2100088HA988HA9H+9F76H
148FEH
执行后:
21000FEHCF=1有进位
48H
OF=1溢出
ZF=0结果不为0SF=0结果为正进位43ADC带进位加指令格式:ADCDST,SRC操作:DST<--(DST)+(SRC)+(CF)说明:该指令除了多一个进位标志外,同ADD指令。常用于多字节运算INC增1指令格式:INCDST操作:DST<--(DST)+1说明:1)DST可以是寄存器或存储器操作数
2)DST不允许是立即数
3)运行结果对SF、OF、PF、ZF、AF都会影响,但不影响CF44ADC指令示例——双字加法设32位的目的操作数存放在DX和AX中,DX存放高位字,32位源操作数存放在BX和CX中,BX存放高位字
CFADCADDDXAXBXCXDXAX+指令序列为:
ADDAX,CX;低位加
ADCDX,BX;高位加45
执行前(DX)=0418H,(AX)=0F365H(BX)=1005H,(CX)=0E024H0418HDX0F365HAX1005HBX+0E024HCX+1CF141EHDX1D389HAX
CF=1如:DX:AX=37A1FFFFH,则DX:AX+1能否用:
INCAXADCDX,0来实现?46INC指令示例LEABX,ARRAYMOVAL,[BX]……INCBXARRAYa1+1a2+2a3+3a4
MOVBX,0MOVAL,ARRAY[BX]……INCBX8088中,执行INCBYTEPTR[BX]指令(指令已在指令队列中)需要
个总线周期。24748XADD交换并相加指令格式:XADDDST,SRC操作:TEMP(SRC)+(DST)SRC(DST)DST(TEMP)说明:1)仅用于486及其后继机型,
2)源操作数只能是寄存器XADD指令示例
XADDBL,DL
如执行前(BL)=12H,(DL)=02H
则执行后(BL)=14H,(DL)=12HSUB常规减指令格式:SUBDST,SRC操作:DST<--(DST)-(SRC)指令构成如下:
SUBreg,imme;寄存器减立即数
SUBreg,reg;寄存器之间相减
SUBreg,mem;寄存器减存储器操作数
SUBmem,imme;存储器操作数减立即数
SUBmem,reg;存储器操作数减寄存器说明:运行结果对CF、SF、OF、PF、ZF、AF都会影响49SUB指令示例
SUBBX,CX
执行前:
(BX)=9543H(CX)=28A7H9543H-28A7H6C9CH
执行后:
(BX)=6C9CH
CF=0OF=1ZF=0SF=050SBB带进位减指令格式:SBBDST,SRC操作:DST<--(DST)-(SRC)-(CF)说明:该指令除了多一个进位标志外,同SUB指令。常用于多字节运算SBB指令示例——双字减法
SUBAX,CX;低16位减
SBB
DX,BX;高16位减
7456HAX0012HDX-9428HCX0010HBX
1E11EH-1HCF0001HCF=151DEC减1指令格式:DECDST操作:DST<--(DST)-1说明:用法同INC指令NEG求补指令格式:NEGDST操作:DST<---(DST)说明:1)-(DST)表示操作数按位求反后末位加1。
2)执行时,用零减去操作数52NEG指令示例1
NEGDX
执行前:
(DX)=6780H0000-6780
19880
执行后:
(DX)=9880HCF=1NEG指令示例2
NEGAL
;AL求补
ADDAL,100;(AL)+100-->AL
实现的功能为:100-(AL)借位53CMP比较指令格式:CMPDST,SRC操作:(DST)-(SRC)说明:
1、两个操作数相减,但结果不回送2、影响标志位的值,下一指令常是条件转移指令3、必须区分无符号数比较与有符号数比较如比较11111111B与00000000B
无符号数比较:255>0
有符号数比较:-1<04、比较两数是否相等,根据标志位ZF判断若相等,则ZF=1;否则ZF=05、指令构成同SUB指令54比较两数的大小CMPDST,SRC无符号数比较结论:
用标志位CF判断无符号数的大小
CF=0,则DST≥SRCCF=1,则DST<SRC55有符号数比较结论:
用标志位SF和OF判断有符号数的大小
SF、OF值相同,则
DST>SRCSF、OF值不同,则
DST<SRCCMP指令示例1
CMPAL,BL
令(AL)=-64(BL)=10-64-10-74OF=0SF=1结论:(DST)<(SRC)CMP指令示例2
CMPCL,[100H]
令(CL)=-100(DS:100)=-110-100-(-110)10OF=0SF=0结论:
(DST)>(SRC)
5657CMPXCHG比较并交换指令格式:CMPXCHGDST,SRC操作:累加器AC与DST比较如(AC)=(DST)
则ZF1,DST(SRC)
否则ZF0,AC(DST)说明:1)只用于486及其后继机型
2)累加器可为AL、AX或EAX寄存器
3)SRC只能用寄存器,DST可用寄存器或存储器寻址方式MUL无符号数乘指令
格式:MULSRCIMUL有符号数乘指令
格式:IMULSRC操作:字节数乘,AX<--(AL)×(SRC)byte
字数据乘,DX:AX<--(AX)×(SRC)word
双字数乘,EDX:EAX(EAX)×(SRC)DW说明:
1)SRC可用寄存器或存储器寻址方式
2)无符号数乘与有符号数乘不同如(11111111B)×(11111111B)无符号数乘:255×255
有符号数乘:(-1)×(-1)
3)本指令影响标志位CF和OF58MUL,IMUL指令示例
MULBL(AL)=0B4H=180(BL)=11H=1710110100×000100011011010010110100101111110100(AX)=0BF4H=3060IMULBL(AL)=0B4H=-76,(BL)=11H=17-76补=4CH01001100×000100010100110001001100010100001100(AX)=(-050C)补
=FAF4H=-1292硬件上怎么判断有符号数乘法结果符号5960格式:IMULREG,SRC或IMM操作:REG16(REG16)*(SRC或IMM)
REG32(REG32)*(SRC或IMM)格式:IMULREG,SRC,IMM操作:REG16(SRC)*IMM
REG32(SRC)*IMM说明:1)乘积的字长和源、目的操作数的字长一致
2)可能溢出
3)SRC可用寄存器或存储器寻址方式
REG只能是寄存器寻址方式
IMM是立即数
4)这些指令是80186后新增加的DIV无符号数除指令格式:DIVSRCIDIV符号数除指令格式:IDIVSRC操作:AL(商),AH(余数)<--(AX)/(SRC)byteAX(商),DX(余数)<--(DX:AX)/(SRC)word
EAX(商),EDX(余数)<--(EDX:EAX)/(SRC)DW说明:
1)被除数的长度是指令中操作数的两倍
2)源操作数可用除立即数以外的寻址方式
3)如果SRC=0或者商大于存放商的寄存器的最大数值范围,都会引发“Divideerror”错误。因此,当被除数为AX,DX:AX时,商最大是255和6553561DIV指令示例
N1DW?N2DW?……
MOVAX,0000H;装入被除数10000HMOVDX,0001HMOVBX,100H;装入除数
DIVBX;10000H/100HMOVN1,AX;存商
MOVN2,DX;存余数62IDIV指令示例
计算-127/15,商存入RESULT单元
RESILTDB?……
MOVAL,-127;装入被除数(81H)
CBW
;字节扩充到字
MOVBL,15;装入除数
IDIVBL;-127/15MOVRESULT,AL;存商63算术运算指令综合例计算(V-(X*Y+Z))/X,其中X,Y,Z,V均为16位有符号数,要求商存入AX,余数存入DXMOVAX,X
IMULY;X*YMOVCX,AXMOVBX,DX;积存BX:CXMOVAX,Z
CWD
;Z扩展
ADDCX,AX;X*Y+Z
ADCBX,DXMOVAX,V
CWD
;V扩展
SUBAX,CX;相减
SBBDX,BXIDIVX;除以X64
十进制BCD码运算调整指令为什么需要调整?BCD码的1010~1111是无意义的。例:非压缩十进数6和7相加
00000110+0000011100001101+110;调整
00010011调整指令有两类:1、非压缩BCD码调整指令
AAAAASAAMAAD2、压缩BCD码调整指令
DAADAS65AAA非压缩BCD码加调整格式:AAA操作:将存放在AL中的两个非压缩BCD码的和进行调整,正确和在AX中调整过程:如果(AL&0FH)>9或(AF)=1
则(AL)+6-->AL(AH)+1-->AH1-->AF,AF-->CF(AL)&0FH-->AL
否则(AL)&0FH-->AL0-->AF,(AF)-->CF说明:该指令放在二进制加法指令ADD之后AHAL正确和的有效位数66AAA指令示例计算十进制数9+4
MOVAL,9H09HMOVBL,4H+04HADDAL,BL0DH;>9
AAA
+06H;调整
13H&0FH03H(AH)+1-->AH结果:
(AH)=01H(AL)=03HCF=AF=16768AAA指令示例计算十进制数9+9
MOVAL,9H09HMOVBL,9H+09HADDAL,BL12H;AF=1
AAA
+06H;调整
18H&0FH08H(AH)+1-->AH结果:
(AH)=01H(AL)=08HCF=AF=1AAS非压缩BCD码减调整指令格式:AAS操作:将AL中的两个非压缩BCD码的差进行调整,正确结果送AX中
调整过程:如果(AL&0FH)>9或(AF)=1
则(AL)-6-->AL(AH)-1-->AH(AL)&0FH-->AL1-->AF,AF-->CF
否则(AL)&0FH-->AL0-->AF,(AF)-->CFAHAL正确差的有效位数69AAS指令示例计算十进制数16-7MOVAX,0106H06HMOVBL,7H-07HSUBAL,BLFFH;(AL)&0FH>9
AAS-6H;调整
F9H&0FH09H
(AH)-1-->AH结果:
(AL)=09HCF=AF=1(AH)=00H70AAM非压缩BCD码乘调整指令格式:AAM操作:将AX中的两个非压缩BCD码之积进行调整调整过程:将AL除以10,商送AH,余数送ALAAM指令示例
MOVAL,07H;取被乘数
MOVCL,09H;取乘数0111
MULCL×1001
AAM
;调整011100000000011100111111调整后,(AH)=6(AL)=371AAD非压缩BCD码除调整指令格式:AAD操作:在除法运算前,用该指令将AX中的非压缩BCD码形式的被除数调整为二进制数,然后做除法运算调整过程:
(AL)+(AH)×10-->AL0-->AH(AX)/除数,商-->AL,余数-->AH72AAD指令示例
MOVAX,0208H;AX<--被除数
MOVCL,4;除数
AAD
;调整,(AX)=28DIVCL
结果:(AL)=7(AH)=073DAA压缩的BCD码加调整
格式:DAA操作:对AL寄存器中的压缩BCD码之和进行调整,结果在AL寄存器中调整过程:如果(AL&0FH)>9或(AF)=1
则(AL)+6-->AL1-->AF
如果(AL)>9FH或(CF)=1
则(AL)+60H-->AL1-->CFAHAL正确和的有效位数74DAA指令示例1
计算十进制数29+18MOVAL,29H29HMOVBL,18H+18HADDAL,BL41H;AF=1DAA+6;调整
47HDAA指令示例2
计算十进制数54+63MOVAL,54H54HMOVBL,63H+63HADDAL,BLB7H;>9FDAA
+60H;调整
117H75DAS压缩的BCD码减调整格式:DAS操作:对AL中的压缩BCD码差进行调整,结果在AL中调整过程:如果(AL&0FH)>9或(AF)=1
则(AL)-6-->AL1-->AF
如果(AL)>9FH或(CF)=1
则(AL)-60H-->AL1-->CFAHAL正确和的有效位数76DAS指令示例计算十进数A-BA=4612B=3576
MOVAL,A12HSUBAL,B-76H
DAS
19CH;AF,CF均=1MOVD,AL-66H;所以用-66H调整
MOVAL,A+136HDSBBAL,B+1CF=1
DASMOVD+1,AL46H35H-110HD+1结果=103677783.4.3逻辑运算指令逻辑非指令NOT逻辑与指令AND逻辑或指令OR逻辑异或指令XOR测试指令TESTNOT逻辑非指令格式:NOTOPR操作:OPR按位取反后送回原处说明:本指令不影响标志位NOT指令示例2MOVAL,1;1-->AL
NOTAL
;求反
INCAL;NOT指令示例1MOVAL,52H
NOTAL
执行前AL01010010
执行后AL10101101-1-->AL79示例2和哪个指令类似?有无区别?AND逻辑与指令格式:ANDDST,SRC操作:(DST)<--(DST)&(SRC)说明:本指令影响标志位PF、SF、ZF,使CF=0、OF=0AND指令示例1MOVAL,32H
ANDAL,0FH
;屏蔽高四位操作执行前AL00110010(2的ASCII码)执行后AL00000010AND指令示例2
ANDAX,AX
执行后
AX内容不变,CF=0、OF=080OR逻辑或指令
格式:ORDST,SRC操作:(DST)<--(DST)或(SRC)说明:本指令影响标志位PF、SF、ZF,使CF=0、OF=0OR指令示例1MOVAL,02H
ORAL,0F0H
;高四位置位执行前AL00000010
执行后AL11110010OR指令示例2
MOVAL,02H
ORAL,30H
执行前AL00000010
执行后AL00110010;’2’的ASCII码81XOR指令示例1MOVAL,0B6H10110110XORAL,0FH00001111
1011
1001
不变变反XOR指令示例2XORAL,AL
;XOR异或指令格式:XORDST,SRC操作:(DST)<--(DST)与(SRC)按位异或说明:本指令影响标志位PF、SF、ZF,使CF=0、OF=0
思考:让AX寄存器清0,有几种办法,在X86不同的CPU中,哪种方案最好?清零操作,且CF=082指令时钟数指令字节数8088286386486PentiumMOVAX,0432112ANDAX,0432113XORAX,AX322112SUBAX,AX322113MOVBL,0MULBL43211214321384211383TEST测试指令格式:TESTOPR1,OPR2操作:(OPR1)&(OPR2)说明:本指令影响标志位PF、SF、ZF,使CF=0、OF=0
TEST指令示例1
测试AL中的数是否为奇数,若是则转移
TESTAL,01H
JNZNEXT;ZF=0转TEST指令示例2
测试AX中的有符号数是否为正数,若是则转移
TESTAX,8000
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年吉林联通人员招聘考试参考试题及答案详解
- 船舶客运员岗前成果转化考核试卷含答案
- 汽车玻璃维修工岗前个人防护考核试卷含答案
- 2026年大连市供水有限公司人员招聘考试参考试题及答案详解
- 林木采伐工技术综合知识考核试卷含答案
- 片基流延工岗位日常考核试卷含答案
- 2024年执业药师复习提分资料及完整答案详解(必刷)
- 基于保质设计理念的双底辊复卷机创新研发与实践
- 基于位置视觉伺服的运动工件分拣系统:设计、实现与优化
- 基于价值链的企业价值评估方法:理论、实践与创新
- 日粮NFC-NDF比例:奶牛生产性能、瘤胃发酵与微生物区系的关联性探究
- 2025版建筑工程建筑面积计算规范
- 资产配置研究系列三:基于BLACK-LITTERMAN模型融合资产择时与风格轮动的资产配置研究
- 2026 英语新版教材七年级下册核心单词表
- 皮带输送机安装及调试技术方案
- 传统芫根酸菜发酵中风味物质与微生物群落演变规律研究
- 华文慕课《刑法学》总论课后作业答案
- 劳动3D眼镜课件
- 伤口创面修复技术
- DB21∕T 4001-2024 辽宁省高速公路日常养护预算定额
- GB/T 4447-2025船舶与海洋技术海船起锚机和起锚绞盘
评论
0/150
提交评论