微機原理與接口技術:第3章 80x86匯編語言程序設計(中)_第1頁
微機原理與接口技術:第3章 80x86匯編語言程序設計(中)_第2頁
微機原理與接口技術:第3章 80x86匯編語言程序設計(中)_第3頁
微機原理與接口技術:第3章 80x86匯編語言程序設計(中)_第4頁
微機原理與接口技術:第3章 80x86匯編語言程序設計(中)_第5頁
已閱讀5頁,還剩99頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論