




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
微機原理與接口技術(shù)中國水利水電出版社第4章指令系統(tǒng)4.1數(shù)據(jù)類型及其存儲規(guī)則4.2計算機指令格式4.38086的尋址方式4.48086的指令系統(tǒng)4.5DOS和BIOS中斷4.1數(shù)據(jù)類型及其存儲規(guī)則4.1.1基本數(shù)據(jù)類型及其存儲
快速閱讀本部分內(nèi)容回答以下問題:1、對80X86系統(tǒng)而言,最小編址單位是什么?2、當(dāng)一個二進制數(shù)據(jù)超過8位時,如何存儲?3、80X86系統(tǒng)的基本數(shù)據(jù)類型有哪些?4、當(dāng)多于一個字節(jié)的數(shù)據(jù)存儲時,高位字節(jié)應(yīng)該存儲到低地址字節(jié)單元嗎?當(dāng)多于一個字節(jié)的數(shù)據(jù)存儲時,其存儲規(guī)則是高位字節(jié)存儲在地址號高的存儲單元中,低位字節(jié)存儲在地址號低的存儲單元中。且以低地址字節(jié)的地址為該數(shù)據(jù)的地址。圖4-1基本數(shù)據(jù)類型的結(jié)構(gòu)形式例:如果把雙字?jǐn)?shù)據(jù)72AB5396H存放在以32000H開始的內(nèi)存單元中,如何存放?32000::::00000FFFFF例、存儲器內(nèi)容如右圖,請寫出地址為12000H的字?jǐn)?shù)據(jù)?請寫出地址為12001H的字?jǐn)?shù)據(jù)?請問字?jǐn)?shù)據(jù)2547的地址是什么?請寫出地址為12000H的雙字?jǐn)?shù)據(jù)?2518CD120004759::00000FFFFF:4.1.2數(shù)字?jǐn)?shù)據(jù)類型基本數(shù)據(jù)類型不考慮數(shù)的符號和小數(shù)點的問題,但有些指令指定在數(shù)字?jǐn)?shù)據(jù)類型上操作。這些數(shù)字?jǐn)?shù)據(jù)類型包含三部分,即:無符號整數(shù)。帶符號整數(shù)。浮點數(shù)。圖4-2a是無符號整數(shù)類型,圖4-2b是帶符號整數(shù)類型,圖4-2c是浮點數(shù)類型。圖4-2數(shù)字?jǐn)?shù)據(jù)類型1.無符號整數(shù):P802.帶符號整數(shù):P813.浮點數(shù):P814.1.3指針數(shù)據(jù)類型指針是內(nèi)存單元的地址,在實方式下有兩種類型的指針:近指針(16位)和遠指針(32位)近指針(near)是段內(nèi)的16位偏移量(稱為有效地址)。遠指針(far)是一個32位的邏輯地址,不僅包含16位有效地址,而且包含了16位段基址。在虛擬方式下,也有兩種類型指針近指針是段內(nèi)32位偏移量。遠指針是一個48位的邏輯地址。4.1.4字符串、位及位串?dāng)?shù)據(jù)類型(自學(xué))4.2計算機指令格式(自學(xué))4.38086的尋址方式快速閱讀本部分內(nèi)容回答以下問題:1、什么是尋址方式?2、操作數(shù)可以存放在哪些地方?3、當(dāng)操作數(shù)存放在哪個地方時指令的執(zhí)行速度是最快的?立即尋址寄存器尋址直接尋址寄存器間接尋址寄存器相對尋址基址變址尋址相對基址變址尋址本節(jié)以MOV指令為例說明8086指令的各種尋址方式。1、8086指令的尋址方式1)立即尋址在立即尋址(ImmediateAddressing)方式下,操作數(shù)直接包含在指令中,它是一個8位或16位的常數(shù),也叫立即數(shù)。該指令翻譯成機器碼時,立即數(shù)作為指令的一部分,緊跟在操作碼之后,存放在代碼段內(nèi)。以A~F打頭的數(shù)字出現(xiàn)在指令中時,前面一定要加一個數(shù)字0,以免與其它符號相混淆。
示例見下頁。。。如:MOVCX,2A50H它表示將立即數(shù)2A50H送到CX寄存器中。指令的機器碼存放及執(zhí)行過程如圖4-8所示。
MOVCX,2A50H執(zhí)行過程2A50CLCHCX代碼段:操作碼502AMOVCX,2A50H指令代碼:2)寄存器尋址在寄存器尋址(RegisterAddressing)方式下,操作數(shù)放在某個寄存器中。對于16位操作數(shù),寄存器可以是AX、BX、CX、DX、SI、DI、SP和BP等對于8位操作數(shù),則用寄存器AH、AL、BH、BL、CH、CL、DH和DL
源操作數(shù)的長度必須與目的操作數(shù)一致,否則會出錯例如,我們不能將AH寄存器的內(nèi)容傳送到CX中去,盡管CX寄存器放得下AH的內(nèi)容,但是匯編程序不知道將它放到CH還是CL中。示例見下頁。。。如:MOVDX,AX假設(shè)該指令執(zhí)行前(AX)=3A68H,(DX)=18C7H,則指令執(zhí)行后,(DX)=3A68H,而AX的內(nèi)容保持不變。如:MOVCL,AH它表示將AH中的8位數(shù)據(jù)傳送到CL寄存器。除上述兩種尋址方式外,在剩下的5種尋址方式下,指令的操作數(shù)都放在內(nèi)存中,都為存儲器尋址。進一步講,指令的操作數(shù)大都存放在內(nèi)存的數(shù)據(jù)段中。數(shù)據(jù)段的段基址保存在段寄存器DS中,且由系統(tǒng)給定,所以要訪問操作數(shù),指令中只需給出偏移地址即可。若要計算物理地址,則物理地址PA=DS×10H+EA5種尋存儲器尋址,它們之間的差別就在于偏移地址(又稱有效地址EA)的構(gòu)成方法不同。
3)直接尋址(DirectAddressing)指令中直接給出操作數(shù)的16位偏移地址。偏移地址也稱為有效地址(EA,EffectiveAddress),在機器碼中,EA位于指令的操作碼之后。直接尋址的常數(shù)地址用方括號括起來,以便與立即數(shù)相區(qū)別。如:MOVAX,[2000H];MOVBX,[500H];物理地址的計算:當(dāng)采用直接尋址時,默認(rèn)操作數(shù)存放在數(shù)據(jù)段中,DS保存其段基址,操作數(shù)的物理地址PA=DS×10H+EA。指令執(zhí)行過程見下頁。。。例:對于指令:MOVAX,[2000H],設(shè)數(shù)據(jù)段和段寄存器DS的內(nèi)容如下圖所示,則執(zhí)行指令后,寄存器AX的內(nèi)容是什么?:341232000??ALAHAX數(shù)據(jù)段:3000DS32001解:這條指令的功能是將數(shù)據(jù)段中有效地址(即偏移地址)為2000H的字?jǐn)?shù)據(jù)放到AX中,但現(xiàn)在只知道數(shù)據(jù)段中各單元的物理地址,所以要先求出物理地址。根據(jù)物理地址的計算方法,有效地址(即偏移地址)為2000H的字?jǐn)?shù)據(jù)的物理地址PA=DS×10H+EA=3000H×10H+2000H=32000H該地址對應(yīng)的字?jǐn)?shù)據(jù)為1234H,所以指令執(zhí)行后AX的內(nèi)容為1234HMOVAX,[2000H]執(zhí)行過程示意圖3000DS+200032000×10H:3412320001234ALAHAX數(shù)據(jù)段:代碼段:操作碼0020MOVAX,[2000H]指令代碼:如果將上述指令中的AX換成AL,即MOVAL,[2000H],結(jié)果又如何呢?操作數(shù)的偏移地址(有效地址EA)放在寄存器中只有SI、DI、BX和BP可作間址寄存器4)寄存器間接尋址EA=(BX)(BP)(SI)(DI)例:MOVAX,[BX]MOVCL,[DI]錯誤例:
×MOVAX,[DX]×
MOVCL,[AX]如果寄存器是BX、SI或DI,則默認(rèn)操作數(shù)存放在數(shù)據(jù)段中,計算物理地址時使用DS。若寄存器是BP,則默認(rèn)操作數(shù)在堆棧段中,計算物理地址時使用SS。例設(shè)DS=1000H,SI=2000H,(12000H)=8BH,(12001H)=31H;分析指令“MOVBX,[SI]”執(zhí)行后寄存器BX的結(jié)果:8B3112000??BLBHBX數(shù)據(jù)段:1000DS12001解:物理地址=DS×10H+SI=10000H+2000H=12000H。指令執(zhí)行過程示意圖見下頁。2000SI指令執(zhí)行過程示意圖1000DS+SI12000×10H:8B3112000318BBLBHBX數(shù)據(jù)段:代碼段:操作碼::MOVBX,[SI]指令代碼:20005)寄存器相對尋址EA=地址寄存器的內(nèi)容加上一個8/16位的位移量(常數(shù))EA=(BX)(BP)(SI)(DI)+8位16位位移量
如果寄存器是BX、SI或DI,則默認(rèn)操作數(shù)存放在數(shù)據(jù)段中,計算物理地址時段基址使用DS。若寄存器是BP,則默認(rèn)操作數(shù)在堆棧段中,計算物理地址時段基址使用SS。5)寄存器相對尋址示例如下:(1)MOVBX,2000H[SI]則:EA=(SI)+2000H(2)MOVBX,COUNT[SI]則:EA=(SI)+COUNT(其中:COUNT為一常量,稱為符號地址)上述指令也可寫成MOVBX,[COUNT+SI]寄存器相對尋址方式與寄存器間接尋址相似,主要區(qū)別是前者在有效地址上要加一個位移量。例、設(shè)DS=3000H,SI=2000H,位移量COUNT=4000H,(36000H)=78H,(36001H)=56H分析指令“MOVBX,COUNT[SI]”執(zhí)行后寄存器BX的結(jié)果。:785636000??BLBHBX數(shù)據(jù)段:3000DS360012000SI解:指令的物理地址=DS×10H+SI+COUNT=30000H+2000H+4000H=36000H執(zhí)行結(jié)果:BX=5678H。指令執(zhí)行過程示意圖見下頁。指令執(zhí)行過程示意圖20003000DSSI+COUNT400036000×10H:7856360005678BLBHBX數(shù)據(jù)段:代碼段:操作碼0040MOVBX,COUNT[SI]指令代碼:6)基址加變址尋址基址加變址尋址(BasedIndexedAddressing)方式,操作數(shù)的有效地址是一個基址寄存器(BX或BP)和一個變址寄存器(SI或DI)的內(nèi)容之和MOVAX,[BX][SI]MOVAX,[BX+SI]EA=(BX)(BP)+(SI)(DI)注意:同一組內(nèi)的寄存器不能同時出現(xiàn)。例、設(shè)DS=3000H,BX=1200H,SI=0500H,(31700H)=CDH,(31701H)=ABH,分析指令“MOVAX,[BX][SI]”執(zhí)行后寄存器AX的結(jié)果。解:物理地址=DS×10H+BX+SI=30000H+1200H+0500H=31700H該指令的執(zhí)行過程示意圖見下頁。執(zhí)行結(jié)果:AX=ABCDH。上述指令也可以寫成:MOVAX,[BX+SI]
指令執(zhí)行過程示意圖:CDAB31700ABCDALAHAX數(shù)據(jù)段:代碼段:操作碼MOVAX,[BX][SI]指令代碼:+317000500SI3000DS×10H1200BX7)相對基址變址尋址操作數(shù)的有效地址是一個基址寄存器和一個變址寄存器的內(nèi)容,再加上一個8位或16位位移量之和。
如:MOVAX,MASK[BX][SI]MOVAX,
[MASK+BX+SI]MOVAX,200H[BX+SI]MOVAX,MASK[BX+SI]
EA=(BX)(BP)+(SI)(DI)+8位16位位移量
例、設(shè)DS=2000H,BX=1500H,SI=0300H,MASK=0200H,(21A00H)=BFH,(21A01H)=26H,分析指令“MOVAX,MASK[BX][SI]”執(zhí)行后寄存器AX的結(jié)果。解:物理地址=DS×10H+BX+SI+MASK=20000H+1500H+0300H+0200H=21A00H該指令的執(zhí)行過程示意圖見下頁。指令執(zhí)行過程示意圖1500BX+MASK020021A002000DS×10H:BF2621A0026BFALAHAX數(shù)據(jù)段:操作碼操作碼00代碼段:MOVAX,MASK[BX][SI]指令代碼:0300SI02MOVAX,MASK[BX][SI]也可寫成如下幾種形式:MOVAX,[MASK+BX+SI]MOVAX,200H[BX+SI];MASK=0200HMOVAX,MASK[BX+SI]
尋址方式可分為立即尋址直接尋址寄存器相對尋址寄存器尋址基址-變址尋址相對基址-變址尋址寄存器間接尋址小結(jié):寄存器間接、寄存器相對、基址變址、相對基址變址四種尋址方式的比較:尋址方式指令操作數(shù)形式
寄存器間接只有一個寄存器(BX/BP/SI/DI之一)寄存器相對一個寄存器加上位移量基址—變址兩個不同類別的寄存器相對基址-變址兩個不同類別的寄存器加上位移量若尋址方式中用到BP寄存器,且無跨段前綴,則默認(rèn)操作數(shù)在堆棧段中,計算物理地址時使用SS,即物理地址=SS×16+EA。4.48086的指令系統(tǒng)就8086CPU而言,其指令系統(tǒng)共有133條指令。按功能分類,8086的指令共有六大類,分別是:數(shù)據(jù)傳送指令、算術(shù)運算指令、邏輯運算和移位指令、字符串處理指令、控制轉(zhuǎn)移指令以及處理器控制指令。表4-4中列出指令中的操作數(shù)的簡寫符號,是從IntelIA-32手冊上摘錄下來的。用這些符號來描述Intel指令的格式。表4-4指令中的操作數(shù)表示法
操作數(shù)描述r88位通用寄存器:AH,AL,BH,BL,CH,CL,DH,DLr1616位通用寄存器:AX,BX,CX,DX,SI,DI,SP,BPr3232位通用寄存器:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBPreg任意的通用寄存器sreg16位段寄存器:CS,DS,SS,ES,F(xiàn)S,GSimm8位、16位或32位立即數(shù)imm88位立即數(shù)(字節(jié))imml616位立即數(shù)(字)imm3232位立即數(shù)(雙字)r/m88位操作數(shù)(可以是8位通用寄存器或內(nèi)存字節(jié))r/m1616位操作數(shù)(可以是16位通用寄存器或內(nèi)存字)r/m3232位操作數(shù)(可以是32位通用寄存器或內(nèi)存雙字)mem8位、16位或32位內(nèi)存操作數(shù)DOPDSrc源操作數(shù),dst目的操作數(shù)4.4.1數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令用來把數(shù)據(jù)或地址傳送到寄存器或存儲器單元中,共14條,可分為4組:P90表4-51.通用數(shù)據(jù)傳送指令(1)MOV傳送指令(Move)格式:MOVDST,SRC操作:DST←SRC
MOV指令允許數(shù)據(jù)傳送的途徑如圖4-14所示(CS不能做目的操作數(shù))圖4-14MOV允許傳送數(shù)據(jù)的途徑通用寄存器AXAHBXALCXBHDXBLSICHDICLSPDHBPDL段寄存器CS,DS,ES,SS存儲器立即數(shù)MOV指令舉例:如:MOVAL,‘B’;該指令把字符B的ASCII碼(42H)傳送到AL寄存器中。再如: MOVCL,DLMOVAX,BXMOV[SI],CXMOV[SI],CL小問題:后兩條指令有什么區(qū)別?什么是堆棧?按“后進先出(LIFO)”方式工作的存儲區(qū)域。堆棧以字為單位進行壓入彈出操作。為什么要設(shè)置堆棧?主要用于在調(diào)用子程序或處理中斷時保存返回地址,其次用于保存中間結(jié)果。(2)PUSH進棧指令(PushWordontoStack)對8086,堆棧設(shè)置在堆棧段中。其段基址保存在SS中,堆棧指針SP保存棧頂?shù)钠频刂罚QSP指向堆棧的頂部,SP的初值規(guī)定了所用堆棧區(qū)的大小。堆棧的棧底為堆棧段的最后一個單元。SPSS堆棧段進棧方向退棧方向棧底棧頂格式:PUSHsrc ;src為16位操作數(shù)例:PUSH AX ;將AX內(nèi)容壓棧執(zhí)行操作:(SP)←(SP)-2 ((SP))←低字節(jié)AL((SP)+1)←高字節(jié)AH示意圖如下(2)PUSH進棧指令(PushWordontoStack)壓棧指令的形式有如下幾種:PUSH regPUSH memPUSH sreg例如:PUSHAXPUSH[BX]PUSHDS注意進棧方向是高地址向低地址發(fā)展。
格式:POPdst例:POPBX ;將棧頂內(nèi)容彈至BX執(zhí)行操作:(BL)←((SP))
(BH)←((SP)+1)
(SP)←(SP)+2 示意圖如下:(3)POP出棧指令(POPWordoffStack)POPBX的執(zhí)行示意圖如下圖所示低地址存儲區(qū)(SS段)出棧方向執(zhí)行前2010POPBX指令執(zhí)行示意圖(SP)存儲區(qū)(SS段)執(zhí)行后(BX)=1020(SP)(SP)+1(SP)+2BX2010高地址低地址高地址例4-6設(shè)SS=2000H,SP=40H,BX=3120H,AX=25FEH,依次執(zhí)行下列指令后堆棧中的數(shù)據(jù)和SP的變化情況如何?PUSHBXPUSHAXPOPBX解:堆棧中數(shù)據(jù)和SP的執(zhí)行過程見圖4-15所示。
2000:00002000:003C2000:0040FE252031AX=25FEHBX=3120H(c)執(zhí)行PUSHAX指令后SP2000:00002000:003E2000:0040FE252031AX=25FEHBX=25FEH(d)執(zhí)行POPBX指令后SP圖4-15PUSH和POP指令執(zhí)行過程2000:00002000:0040AX=25FEHBX=3120H(a)指令執(zhí)行前SP2000:00002000:003E2000:00402031AX=25FEHBX=3120H(b)執(zhí)行PUSHBX指令后SP堆棧指令使用時應(yīng)注意幾點:①堆棧操作總是按字進行②不能從棧頂彈出一個字給CS③SP自動進行增減量(-2,+2)格式:XCHGdst,src功能:交換兩操作數(shù)的內(nèi)容。要求:兩操作數(shù)中必須有一個在寄存器中;
舉例:XCHG AX,BXXCHG [2000],CL(3)交換指令XCHG(Exchange)2.累加器專用傳送指令(1)XLAT表轉(zhuǎn)換指令(TableLookupTranslation)格式:XLAT或XLAT表首地址操作:(AL)←((BX)+(AL))。數(shù)字0~9的ASCII碼表MOVBX,2000H;(BX)←表首地址MOVAL,02H;(AL)←序號XALT;查表轉(zhuǎn)換執(zhí)行后得到:(AL)=? 012930h31h32h...39h2000H......(AL)=32H=’2’(2)輸入輸出指令(I/O指令)I/O指令是專門面向輸入輸出端口進行讀寫的指令,共有2條:IN和OUT。輸入指令I(lǐng)N用于從I/O端口讀數(shù)據(jù)到累加器AL(或AX)中。輸出指令OUT用于將累加器AL(或AX)中的數(shù)據(jù)寫到I/O端口。只有累加器AL(或AX)才能與I/O端口進行數(shù)據(jù)傳送,所以這2條指令也稱為累加器專用傳送指令。(2)輸入輸出指令(I/O指令)8086/8088系統(tǒng)可連接多個外設(shè)端口,可以像存儲器一樣用不同的地址來區(qū)分它們,8086/8088的I/O指令中,只允許用兩種尋址方式:①直接尋址方式:指令中包含了一個8位的I/O端口地址,允許尋址256個端口,端口地址為0~0FFH。②寄存器間接尋址方式:端口地址由DX寄存器指定,可尋址64K個端口(0~0FFFFH)。間接尋址的適用范圍較大,在編寫程序時要盡量采用這種方式。1)輸入指令I(lǐng)N(Intput)指令格式及操作如下。① INAL,PORT;直接尋址,PORT為8位立即數(shù),表示端口地址,從PORT端口讀一個字節(jié)送AL。 INAX,PORT;直接尋址,從PORT和PORT+l兩個端口讀一個字送AX。② INAL,DX;間接尋址,16位端口地址由DX指出,從(DX)所指的端口讀一個字節(jié)送AL INAX,DX;間接尋址,從(DX)和(DX+1)所指的兩個端口讀一個字到AX,;低地址端口的內(nèi)容送入AL,高地址端口的內(nèi)容送入AH下面是用IN指令從輸入端口讀取數(shù)據(jù)的幾個具體例子:INAL,0F1H ;AL←從F1H端口讀入一個字節(jié)INAX,80H ;AL←80H口的內(nèi)容,AH←81H 端口的內(nèi)容MOVDX,3l0H ;端口地址310H先送入DX中 INAL,DX ;AL←310H端口的內(nèi)容
2)輸出指令OUT(Output)指令格式及操作如下。①OUTPORT,AL ;將AL中的一個字節(jié)輸出到PORT
端口
OUTPORT,AX ;將AX中的一個字輸出到PORT和
PORT+l兩個端口②OUTAL,DX ;DX中為端口地址,將AL中的字節(jié)送(DX)所指的端口OUTAX,DX ;將AX中的字送(DX)和(DX)+l所指的兩個端口
如下面是幾個用OUT指令對輸出端口進行操作的例子:OUT85H,AL ;85H端口←AL內(nèi)容MOVDX,0FF4H OUTDX,AL ;FF4H端口←AL內(nèi)容MOVDX,300H ;DX指向300H OUTDX,AX ;300H端口←AL內(nèi)容,
301H端口←AH內(nèi)容3.地址傳送指令1)LEA(LoadEffectiveAddress)取有效地址指令格式:LEAreg16,mem;(reg16)←mem的偏移地址功能:取源操作數(shù)的偏移地址,并把它傳送到目的操作數(shù)制定的寄存器。LEA指令要求源操作數(shù)必須是存儲單元,而且目的操作數(shù)必須是一個除CS之外的16位寄存器。注意它與MOV指令的區(qū)別,MOV指令傳送的一般是源操作數(shù)中的內(nèi)容而不是地址如:假設(shè):SI=1000H,DS=5000H,(51000H)=34H,(51001H)=12H執(zhí)行指令LEABX,[SI]后,BX=1000H;執(zhí)行指令MOVBX,[SI]后,BX=1234HLEA指令也可用取偏移地址的MOV指令代替。LEABX,[1010H]MOVBX,OFFSET[1010H]上述兩條指令等效。其中OFFSET[1010H]表示存儲器操作數(shù)[1010H]的偏移地址。2)LDS(LoadPointerusingDS)將雙字指針?biāo)偷郊拇嫫骱虳S指令(自學(xué))3)LES(LoadPointerusingES)將雙字指針?biāo)偷郊拇嫫骱虴S指令(自學(xué))1)LAHF(LoadAHfromFlags)標(biāo)志寄存器低8位為送入AH2)SAHF(StoreAHintoFlags)AH送標(biāo)志寄存器低8位4.標(biāo)志傳送指令3)PUSHF(PushFlagsontoStack)標(biāo)志寄存器入棧指令格式:PUSHF操作:(SP)←(SP)-2,((SP))←(FLAGS低字節(jié)),((SP)+1)←(FLAGS高字節(jié))4)POPF(PopFlagsoffStack)標(biāo)志出棧指令格式:POPF執(zhí)行操作:(FLAGS低字節(jié))←((SP)),(FLAGS高字節(jié))←((SP)+1),(SP)←(SP)+2。成對的使用PUSHF和POPF指令,可對標(biāo)志寄存器進行保存和恢復(fù),常用在過程(子程序)調(diào)用和中斷服務(wù)程序的開頭與結(jié)尾處,對進行過程調(diào)用或發(fā)生中斷時主程序的狀態(tài)(即標(biāo)志位)進行保護。
4.4.2算術(shù)運算指令8086/8088指令系統(tǒng)提供了加、減、乘、除四種基本運算指令,可處理無符號或帶符號的8位或16位二進制數(shù)的算術(shù)運算還提供了各種調(diào)整操作指令,可進行壓縮的或非壓縮的十進制數(shù)的算術(shù)運算。1.加法指令A(yù)DD(Addition)加法指令格式:ADDDST,SRC操作:DST←SRC+DSTADC(AdditionwithCarry)帶進位的加法指令格式:ADCDST,SRC操作:DST←DST+SRC+CF
說明:這兩條指令的SRC可以是reg、mem或imm,DST只能用seg和存儲單元源和目的操作數(shù)不能同時為存儲器,且類型必須一致。這兩條指令影響的標(biāo)志位為:CF、OF、PF、SF、ZF和AF列舉上述兩種加法指令的實例,以說明它們的用法。ADDAL,18H ;AL←AL+18HADCBL,CL ;BL←BL+CL+CFADDAL,COST[BX] ;將AL內(nèi)容和邏輯地址=DS:(COST+BX)的存儲單元內(nèi)容相加結(jié)果送到AL中
INC(Increment)增量指令格式:INCOPR操作:OPR←OPR+1說明:相當(dāng)于C語言中++。該指令主要用在循環(huán)程序中對地址指針和循環(huán)計數(shù)器等進行修改。指令執(zhí)行后影響AF、OF、PF、SF和ZF,但CF不受影響B(tài)CD碼運算調(diào)整指令——AAA,DAA(難點)人類習(xí)慣十進制運算,而計算機習(xí)慣二進制運算,如果讓計算機完成十進制運算有兩種方法:先將十進制數(shù)轉(zhuǎn)化為二進制數(shù),然后運用相關(guān)指令得到二進制結(jié)果,再將結(jié)果轉(zhuǎn)化為十進制數(shù)。先將十進制數(shù)用BCD碼表示,然后運用相關(guān)指令得到結(jié)果的BCD碼,再將結(jié)果解碼為十進制數(shù)。壓縮BCD碼就是通常的8421碼;它用4個二進制位表示一個十進制位,如:0000表示0、0001表示1、0010表示2、...、1000表示8、1001表示9一個字節(jié)可以表示兩個十進制位,即00~99非壓縮BCD碼用8個二進制位表示一個十進制位,高4位為0,低4位表示一個十進制位0~9,如:00000000表示0,00000001表示1,00000010表示2,...,00001000表示8,00001001表示9一個字節(jié)只能表示一個十進制位,即0~9分為非壓縮BCD碼和壓縮BCD碼BCD碼(BinaryCodedDecimal)示例見下頁。。。BCD碼(BinaryCodedDecimal)真值 864二進制數(shù)(一個字節(jié))08H40H非壓縮BCD碼00001000B即08H0604H壓縮BCD碼1000B即8H64H
00001000
+0000100100010001=(17)10例如:計算8+9方法1:轉(zhuǎn)化為二進制進行加法:例如:計算8+900001000非壓縮BCD碼(非壓縮BCD碼+)
00001001非壓縮BCD碼0000000100000111非壓縮BCD碼=(17)10如何實現(xiàn)上述非壓縮BCD碼加法呢?方法2:轉(zhuǎn)化為非壓縮BCD碼進行加法,即8的非壓縮BCD加9的非壓縮BCD碼等于17的非壓縮BCD碼,如下所示:4)非壓縮BCD碼加法調(diào)整AAA由左邊的程序可知,非壓縮BCD碼加法是通過間接的方法實現(xiàn)的:先把非壓縮BCD碼按二進制用ADD指令相加,然后使用AAA指令對相加的結(jié)果進行調(diào)整,最后得到和的非壓縮BCD碼。詳細過程見下頁。。。例:用非壓縮BCD碼計算8+9: MOVAL,08H MOVBL,09H ADDAL,BL
AAA上述程序段執(zhí)行后AX的內(nèi)容即為和的非壓縮BCD碼0107H本例中AAA的調(diào)整過程為什么要加6:ADD指令逢十六進一,但BCD碼要求逢十進一,因此只要產(chǎn)生進位,個位就會少6,這就要進行加6調(diào)正。例:用非壓縮BCD碼計算8+9: MOVAL,08H MOVBL,09H ADDAL,BL AAA08H09HALBL07H01HAX--------------------------+11HAL--------------------------+06H17HAL簡而言之,非壓縮BCD碼加法是通過ADD(或ADC指令)與AAA指令這兩條指令一起實現(xiàn)的。AAA的詳細調(diào)整過程:P96例:用壓縮BCD碼計算18+29: MOVAL,18H MOVBL,29H ADDAL,BL
DAA上述程序段執(zhí)行后AL的內(nèi)容即為和的壓縮BCD碼47H5)壓縮BCD碼加法調(diào)整DAA與非壓縮BCD碼加法類似,壓縮BCD碼的加法是也通過間接的方法實現(xiàn),即通過ADD(或ADC指令)與DAA指令這兩條指令一起實現(xiàn)的。DAA的詳細調(diào)整過程:P972.減法指令1)SUB(Subtraction)不帶借位的減法指令格式:SUBDST,SRC操作:DST←DST-SRC。如:SUBDX,1850H ;DX←DX-1850HSUBBL,[BX] ;BL中內(nèi)容減去邏輯地址DS:(BX)處 的字節(jié),結(jié)果存入BL
2)SBB(SubtractwithBorrow)帶借位的減法指令格式:SBBDST,SRC操作:DST←DST-SRC-CF。SBB主要用于多字節(jié)減法中。3)DEC(Decrement)減1指令格式:DECOPR操作:OPR←OPR-1。如:DECBX ;BX←BX-1DECWORDPTR[BP] ;堆棧段中位于[BP]偏置處 的字減14)NEG(Negate)取負(fù)指令格式:NEGOPR操作:OPR←0-OPR(或OPR←-OPR)。如:NEGAX;將AX中的數(shù)取負(fù)(正數(shù)變負(fù)數(shù),負(fù)數(shù)變正數(shù))NEGBYTEPTR[BX];對數(shù)據(jù)段中位于[BX]偏置處的字節(jié)取負(fù)
格式:CMPdest,src操作:(dest)-(src)CMP也是執(zhí)行兩個操作數(shù)相減,但結(jié)果不送目標(biāo)操作數(shù),只根據(jù)結(jié)果設(shè)置相應(yīng)的標(biāo)志位。***通過標(biāo)志位可以判斷兩個數(shù)的大小,詳細見下頁.......5)比較指令CMP根據(jù)標(biāo)志位來判斷比較的結(jié)果1)根據(jù)ZF判斷兩個數(shù)是否相等。若ZF=1,則兩數(shù)相等。2)若兩個數(shù)不相等,則分兩種情況考慮:①比較的是兩個無符號數(shù)若CF=0,則dest>src;若CF=1,則dest<src。②比較的是兩個有符號數(shù)若OF⊕SF=0,則dest>src;若OF⊕SF=1,則dest<src。示例見下頁。。。比較指令在使用時,一般在其后緊跟一條條件轉(zhuǎn)移指令,判斷比較結(jié)果的轉(zhuǎn)向。舉例:比較AL、BL、CL中帶符號數(shù)的大小,將最小數(shù)放在AL中。程序:
CMPAL,BL;AL和BL比較
JLE
BBB
;若AL≤BL,則轉(zhuǎn)XCHGAL,BL;若AL>BL,則交換BBB:CMPAL,CL;AL和CL比較
JLE
CCC;若AL≤CL,則轉(zhuǎn)XCHGAL,CL;若AL>CL,則交換CCC:HLTCMP指令可以在不改變兩個操作數(shù)的情況下通過標(biāo)志位反映兩個數(shù)的大小,這也是其指令名稱compare的來由。6)AAS(ASCIIAdjustforSubtraction)減法的ASCII調(diào)整指令(自學(xué))7)DAS(DecirnalAdjustforSubtraction)減法的十進制調(diào)整指令(自學(xué))3.乘法指令(1)MUL(Multiply)無符號數(shù)乘法指令格式:MULSRC操作:SRC為字節(jié)操作數(shù):AX←AL×SRCSRC為字操作數(shù):(DX,AX)←AX×SRC(操作數(shù)和乘積均為無符號數(shù))SRC可以是寄存器,或是存儲單元,但不能是立即數(shù)。當(dāng)SRC是存儲器操作數(shù)時,必須在操作數(shù)前加B或W說明是字節(jié)還是字。如:MULDL ;AX←AL×DLMULCX ;(DX,AX)←AX×CXMULBYTE[SI];AX←AL×(內(nèi)存中某字節(jié)),BYTE說明字節(jié) 乘法MULWORD[BX];(DX,AX)←AX×(內(nèi)存中某字),WOR說明字 乘法
(2)IMUL(IntegerMuliply)帶符號數(shù)乘法指令格式:IMULSRC操作:同MUL指令。功能:把乘數(shù)和累加器中的數(shù)都作為帶符號數(shù),進行相乘。乘積的符號符合一般代數(shù)運算規(guī)則。例4-12設(shè)AL=-28H,BL=59H,試寫出它們乘積的指令代碼。解:指令代碼如下:
IMULBL結(jié)果為:AX=F98CH=-1652(3)AAM(ASCIIAdjustforMultiply)乘法的ASCII調(diào)整指令(自學(xué))4.除法指令(1)DIV(Divisionunsigned)無符號數(shù)除法指令格式:DIVSRC操作:SRC為字節(jié)除數(shù):AL←AX/SRC的商AH←AX/SRC的余數(shù)。SRC為字除數(shù):AX←(DX,AX)/SRC的商;DX←(DX,AX)/SRC的余數(shù)。說明:被除數(shù),除數(shù)、商及余數(shù)均為無符號數(shù)。(2)IDIV(IntegerDivision)帶符號整數(shù)除法指令格式:IDIVSRC操作:字節(jié)除數(shù):AL←AX/SRC的商;AH←AX/SRC的余數(shù)。字除數(shù):AX←(DX,AX)/SRC的商;DX←(DX,AX)/SRC的余數(shù)。說明:被除數(shù),除數(shù)、商及余數(shù)均為帶符號數(shù),商的符號符合一般代數(shù)運算的符號規(guī)則,余數(shù)的符號與被除數(shù)相同。商超過了目標(biāo)寄存器AL或AX所能存放數(shù)的范圍。這時系統(tǒng)會自動產(chǎn)生一個中斷類型號為0的除法錯中斷,相當(dāng)于執(zhí)行了除數(shù)為0的運算,所得的商和余數(shù)都不確定。
例4-14兩個無符號數(shù)7A86H和04H相除的商應(yīng)為1EA1H,若用DIV指令寫出其代碼。解:指令代碼如下:
MOVAX,7A86H MOVBL,04H DIVBL這時,由于BL中的除數(shù)04H為字節(jié),被除數(shù)AX為字,商1EAlH大于AL中能存放的最大無符號數(shù)FFH,結(jié)果將產(chǎn)生除法錯誤中斷。
(3)AAD(ASCIIAdjustforDivision)除法的ASCII調(diào)整指令(自學(xué))5.符號擴展指令這類指令的功能是對操作數(shù)最高位進行擴展,用于處理帶符號數(shù)運算時的操作類型匹配問題。CBW(ConvertBytetoWord)把字節(jié)擴展為字指令格式:CBW功能:AL中字節(jié)的符號位擴展到AH中(即把AL中的最高位送入AH的所有位)CWD(ConvertWordtoDoubleWord)把字?jǐn)U展成雙字指令格式:CWD功能:把AX中字的符號位擴展到DX中(即把AH中的最高位送入DX的所有位)標(biāo)志:不影響任何標(biāo)志位例4-16編程求-38/3的商和余數(shù)。解:指令代碼如下:MOVAL,11011010B ;被除數(shù)-38MOVCH,00000011B ;除數(shù)+3CBW ;將AL符號擴展到AH中,使AX=11111111l1011010BIDIVCH ;AX/CH,AL=11110l00B=-
12(商),AH=11111110B=-2(余數(shù))
4.4.3邏輯運算與移位指令邏輯運算和移位指令對字節(jié)或字操作數(shù)進行按位操作,這類運算可分成:邏輯運算(LogicalOperations)算術(shù)邏輯移位(shiftArithmeticandShiftLogical)循環(huán)移位(Rotate)1.邏輯運算指令表4-7邏輯運算指令名稱格式操作對標(biāo)志位的影響OFSFZFAFPFCF邏輯非NOTOPROPR按位求反送OPR――――――邏輯與ANDDST,SRCDSR←DST∧SRC0××u×0邏輯或ORDST,SRCDSR←DST∨SRC0××u×0邏輯異或XORDST,SRCDSR←DST∨SRC0××u×0邏輯測試TESTOPR1,OPR2DST∧SRC0××u×0注:-表示對該標(biāo)志位無影響;×表示根據(jù)操作結(jié)果設(shè)置標(biāo)志;u表示操作后標(biāo)志值無定義;0表示清除標(biāo)志位為0邏輯與:對操作數(shù)的某幾位清零(與0與),保留其它位(與1與)。例:對AL高4位清0,保留低4位。ANDAL,0FH邏輯運算指令的用途邏輯或:對操作數(shù)的某幾位置1(與1或),保留其他位(與0或)。例:把AL的第5位置1,其他位保留。ORAL,00100000B邏輯運算指令的用途邏輯異或:對操作數(shù)的某幾位取反(與1異或),保留其他位(與0異或)。邏輯運算指令的用途例1:把DH的第4,3位變反XORDH,18H例2:把AX寄存器清零 ①MOVAX,0 ②SUBAX,AX ③ANDAX,0 ④XORAX,AX例4-17設(shè)AX中存有數(shù)字5和8的ASCII碼,即AX=3538H,要將它們轉(zhuǎn)換成BCD碼,并把結(jié)果仍放回AX,寫出其指令代碼?解:實現(xiàn)指令為:ANDAX,0F0FH;AX←0508H例4-18假設(shè)AX中存有兩個BCD數(shù)0508H,要將它們分別轉(zhuǎn)換成ASCII碼,結(jié)果仍在AX中,寫出其指令代碼?解:實現(xiàn)指令為: ORAX,3030H;AX←3538H例4-19若AL中存有某外設(shè)端口的狀態(tài)信息,其中D1位控制揚聲器發(fā)聲,要求該位在0和1之間來回變化,原來是1變成0,原來是0變成1,其余各位保留不變,寫出其指令代碼?解:實現(xiàn)指令為:XORAL,00000010B
表4-8算術(shù)邏輯移位指令名稱格式操作對標(biāo)志位的影響OFSFZFAFPFCF算術(shù)左移SALDST,CNT×
×
×
u
×
×邏輯左移SHLDST,CNT×
×
×
u
×
×算術(shù)右移SARDST,CNT×
×
×
u
×
×邏輯右移SHRDST,CNT×
×
×
u
×
×2.算術(shù)邏輯移位指令MSB←LSBCF0MSB→LSBCFMSB←LSBCF0MSB→LSBCF0移位指令實現(xiàn)對操作數(shù)的移位操作邏輯移位把操作數(shù)看成無符號數(shù)來移位,右移時,最高位補0,左移時,最低位補0。算術(shù)移位則把操作數(shù)看做有符號數(shù),右移時最高位(符號位)保持不變,左移時,最低位補0。SHL和SAL兩條指令的功能完全相同,在機器中實際對應(yīng)同一種操作。CNT為移位計數(shù)值CL;移位位數(shù)大于1時1;移位位數(shù)等于1時表4-8中的DST可以是8位、16位寄存器或存儲器操作。例4-20用移位指令將AL中的高4位和低4位內(nèi)容互換。(如:1010010101011010)解:代碼段如下:MOVAH,AL;將AL中的內(nèi)容復(fù)制到AHMOVCL,4;設(shè)置移位次數(shù)SHLAL,CL;將AL中的低4位移至高4位,其低4位變?yōu)?000SHRAH,CL;將AH中的高4位移至低4位,其高4位變?yōu)?000ORAL,AH;AL中的高、低4位內(nèi)容互換
表4-9循環(huán)移位指令名稱格式操作對標(biāo)志位的影響OFSFZFAFPFCF循環(huán)左移ROLDST,CNT×
-
-
-
-
×循環(huán)右移RORDST,CNT×
-
-
-
-
×帶進位的循環(huán)左移RCLDST,CNT×
-
-
-
-
×帶進位的循環(huán)右移RCRDST,CNT×
-
-
-
-
×3.循環(huán)移位指令算術(shù)邏輯移位指令,移出操作數(shù)的數(shù)位均被丟失,而循環(huán)移位指令把操作數(shù)從一端移到操作數(shù)的另一端,這樣從操作數(shù)中移走的位就不會丟失了
MSB←─LSBCFMSB─→LSBCFMSB─→LSBCFMSB←─LSBCF例4-21用循環(huán)移位指令實現(xiàn)例4-20的功能。MOVCL,4RORAL,CL;也可以用“ROLAL,CL”指令實現(xiàn)
4.4.4串操作指令(自學(xué))4.4.5控制轉(zhuǎn)移指令程序中的指令默認(rèn)情況下是順序逐條執(zhí)行的。利用控制轉(zhuǎn)移指令可以改變CS和IP的值,從而改變指令的執(zhí)行順序。8086提供了如下幾種轉(zhuǎn)移指令:
無條件轉(zhuǎn)移(UnconditionalTransfer)過程調(diào)用(CallandReturn)條件轉(zhuǎn)移(ConditionalTransfer)循環(huán)控制(IterationControl)中斷(Interrupt)1.無條件轉(zhuǎn)移和過程調(diào)用指令(1)JMP(Jump)無條件轉(zhuǎn)移指令這類指令又分成2種類型:第一種類型:段內(nèi)轉(zhuǎn)移或近(NEAR)轉(zhuǎn)移,轉(zhuǎn)移指令的目的地址和JMP指令在同一代碼段中,轉(zhuǎn)移時僅改變IP寄存器的內(nèi)容,段地址CS的值不變。代碼段1.無條件轉(zhuǎn)移和過程調(diào)用指令(1)JMP(Jump)無條件轉(zhuǎn)移指令代碼段代碼段—第二種類型:段間轉(zhuǎn)移,又被稱之為遠(FAR)轉(zhuǎn)移,轉(zhuǎn)移指令的目的地址和JMP指令不在同一段中,發(fā)生轉(zhuǎn)移時,CS和IP的值都要改變,也就是說,程序要轉(zhuǎn)移到另一個代碼段去執(zhí)行。
1.無條件轉(zhuǎn)移和過程調(diào)用指令(1)JMP(Jump)無條件轉(zhuǎn)移指令無條件轉(zhuǎn)移指令可分成段內(nèi)直接轉(zhuǎn)移段內(nèi)間接轉(zhuǎn)移段間直接轉(zhuǎn)移段間間接轉(zhuǎn)移1)段內(nèi)直接轉(zhuǎn)移指令近轉(zhuǎn)移格式:JMP標(biāo)號
(或JMPNEARPTR標(biāo)號)ADD AL,BL ;兩數(shù)相加 JC NEXT ;若有進位,轉(zhuǎn)NEXT MOV AH,0 ;無進位,AH清0
JMP EXIT ;往下執(zhí)行NEXT:MOV AH,1 ;有進位,AH置1EXIT:HLT ;停機1)段內(nèi)直接轉(zhuǎn)移指令短轉(zhuǎn)移格式:JMPSHORT標(biāo)號2)段內(nèi)間接轉(zhuǎn)移指令(自學(xué))3)段間直接(遠)轉(zhuǎn)移指令(自學(xué))4)段間間接轉(zhuǎn)移指令(自學(xué))(2)過程調(diào)用CALL和返回RET指令
在編程時,往往把某些完成特定功能而又經(jīng)常要用到的程序段,編寫成獨立的模塊,把它稱為過程(Procedure),也稱作子程序(Subroutine)。然后在程序中用CALL語句調(diào)用這些過程,調(diào)用過程的程序稱為主程序。過程以語句PROC開頭,用語句ENDP結(jié)束。在ENDP之前要放一條過程返回指令RET,它與CALL指令相呼應(yīng),使過程執(zhí)行完畢后,能正確返回主程序中緊跟在CALL指令后面的那條指令繼續(xù)運行。過程定義的一般格式如下所示:Proc_APROCNEAR或FAR …… ┋ …… RET ENDP 其中Proc_A為過程名,NEAR或FAR為屬性參數(shù),PROC和ENDP為偽指令。8086系統(tǒng)把處于當(dāng)前代碼段的過程稱為近過程,可通過NEAR屬性參數(shù)定義,而把處于其它代碼段的過程稱為遠過程,可通過FAR屬性參數(shù)定義。CALL指令的常用格式:CALLsub_proc;sub_proc為子程序名功能:過程調(diào)用指令CALL迫使CPU暫停執(zhí)行下一條順序指令,而把下一條指令的地址壓入堆棧,這個地址稱為返回地址。返回地址壓棧保護后,CPU會轉(zhuǎn)去執(zhí)行指定的過程。等過程執(zhí)行完畢后,再由過程返回指令RET從堆棧頂部彈出返回地址,從而從CALL指令的下一條指令繼續(xù)執(zhí)行。編譯匯編程序時,子程序名sub_proc會被該子程序的地址(即其第一條指令的地址)所取代。調(diào)用子程序就相當(dāng)于跳轉(zhuǎn)到子程序的第一條指令處開始執(zhí)行。與JMP指令類似,子程序的調(diào)用也分成2種情況:代碼段代碼段代碼段①段內(nèi)調(diào)用——只改變IP,CS不變②段間調(diào)用——同時改變IP,CS功能:恢復(fù)調(diào)用之前的主程序的執(zhí)行位置,以便繼續(xù)執(zhí)行主程序。指令RET的操作為:如果是段內(nèi)返回,則從堆棧中彈出調(diào)用之前壓入的IP。如果是段間返回,從堆棧中彈出調(diào)用之前壓入的IP和CS。返回指令RET條件轉(zhuǎn)移指令是根據(jù)上一條指令執(zhí)行后,CPU設(shè)置的狀態(tài)標(biāo)志作為判別測試條件來決定是否轉(zhuǎn)移。當(dāng)它的測試條件成立,便控制程序轉(zhuǎn)向指令中給出的目的地址,去執(zhí)行那里的指令,否則,程序仍順序執(zhí)行。格式:
Jxx
標(biāo)號 ;xx為條件名稱縮寫條件轉(zhuǎn)移指令共有18條,可以歸類成以下兩大類:標(biāo)志轉(zhuǎn)移指令間接標(biāo)志轉(zhuǎn)移指令2、條件轉(zhuǎn)移指令——Jxx(1)標(biāo)志轉(zhuǎn)移指令這類指令直接給出標(biāo)志狀態(tài)的測試條件,以CF、ZF、SF、OF和PF等5個標(biāo)志的10種狀態(tài)為判斷條件,共形成10條指令:JC ;CF=1,則轉(zhuǎn)移JNC ;CF=0,則轉(zhuǎn)移JP/JPE;奇偶標(biāo)志PF=1(偶),則轉(zhuǎn)移JNP/JPO;奇偶標(biāo)志PF=0(奇),則轉(zhuǎn)移JZ/JE;結(jié)果為零(ZF=1),則轉(zhuǎn)移JNZ/JNE;結(jié)果不為零(ZF=0),則轉(zhuǎn)移JS;SF=1,則轉(zhuǎn)移JNS;SF=0,則轉(zhuǎn)移JO ;OF=1,則轉(zhuǎn)移JNO ;OF=0,則轉(zhuǎn)移舉例如下。。。例4-26求AL和BL寄存器中的兩數(shù)之和,若有進位,則AH置1,否則AH清0。請寫出其代碼?解:可用如下程序段來實現(xiàn)該操作: ADD AL,BL ;兩數(shù)相加
JC NEXT ;若有進位,轉(zhuǎn)NEXT MOV AH,0 ;無進位,AH清0 JMP EXIT ;往下執(zhí)行NEXT:MOV AH,1 ;有進位,AH置1EXIT:HLT ;停機(2)間接標(biāo)志轉(zhuǎn)移間接轉(zhuǎn)移指令通常放在比較指令CMP之后,通過測試狀態(tài)位來比較兩個數(shù)的大小。格式:CMPdest,src ;比較
Jxx標(biāo)號 ;根據(jù)比較結(jié)果轉(zhuǎn)移對兩個無符號數(shù)進行比較后,一定要用無符號數(shù)比較測試指令決定程序走向;對帶符號數(shù)比較后,則要用帶符號數(shù)比較測試指令。使用時要嚴(yán)格加以區(qū)分,否則會得到錯誤的結(jié)果。判斷無符號數(shù)的大小——無符號數(shù)的大小用高(Above)低(Below)表示,常用的有如下4條指令:JA 高于則轉(zhuǎn)移(dest>src) 轉(zhuǎn)移條件為:CF=0∧ZF=0JAE 高于或等于則轉(zhuǎn)移(dest≥src) 轉(zhuǎn)移條件為:CF=0JB 低于則轉(zhuǎn)移(dest<src) 轉(zhuǎn)移條件為:CF=1JBE 低于或等于則轉(zhuǎn)移(dest≤src
) 轉(zhuǎn)移條件為:CF=1∨ZF=1(2)間接標(biāo)志轉(zhuǎn)移指令例:ax和bx中有兩個無符號數(shù),比較這兩個無符號數(shù),將較大的存ax中
cmpax,bx ;比較ax和bx
jaenext ;若ax≥bx,轉(zhuǎn)移
xchgax,bx ;若ax<bx,交換next:hlt ;停機結(jié)果:ax保存較大的無符號數(shù)——有符號數(shù)的大小用大(Greater)小(Less)表示,常用的有如下4條指令:JG大于則轉(zhuǎn)移(dest>src)
轉(zhuǎn)移條件為:(SF⊕OF=0)∧ZF=0JGE 大于或等于則轉(zhuǎn)移(dest≥src)
轉(zhuǎn)移條件為:(SF⊕OF=0)∨ZF=1JL 小于則轉(zhuǎn)移(dest<src)
轉(zhuǎn)移條件為:(SF⊕OF=1)∧ZF=0JLE小于或等于則轉(zhuǎn)移(dest≤src)
轉(zhuǎn)移條件為:(SF⊕OF=1)∨ZF=1
判斷有符號數(shù)的大小例:ax和bx中有兩個有符號數(shù),比較兩個有符號數(shù),將較大的存ax中
cmpax,bx ;比較ax和bx
jgenext ;若ax≥bx,轉(zhuǎn)移
xchgax,bx ;若ax<bx,交換next:hlt ;停機結(jié)果:ax保存較大的有符號數(shù)3.循環(huán)控制指令循環(huán)控制指令是一組增強型的條件轉(zhuǎn)移指令,用來控制一個程序段的重復(fù)執(zhí)行,重復(fù)次數(shù)由CX寄存器中的內(nèi)容決定。循環(huán)控制指令均不影響任何標(biāo)志,這類指令共有4條:LOOP循環(huán)指令(LOOP)
LOOPE/LOOPZ(LoopIFEqual/Zero)LOOPNE/LOOPNZ(LoopIfNOTEqual/NOTZero)JCXZ(JumpIfCXZero)(1)LOOP循環(huán)指令(LOOP)格式:LOOP標(biāo)號功能:這條指令用于控制重復(fù)執(zhí)行一系列指令。執(zhí)行前事先將重復(fù)次數(shù)放在CX寄存器中,每執(zhí)行一次LOOP指令,CX自動減1。如果減1后CX≠0,則轉(zhuǎn)移到指令中給定的標(biāo)號處繼續(xù)循環(huán);若自動
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 薯類批發(fā)商市場供需分析考核試卷
- 貿(mào)易代理國際市場進入與擴張策略考核試卷
- 集成服務(wù)在智能電網(wǎng)分布式能源管理的實現(xiàn)考核試卷
- 拍賣行拍賣業(yè)務(wù)智能化發(fā)展路徑考核試卷
- 熱扎帶剛車間設(shè)計
- 麻醉科無痛技術(shù)臨床應(yīng)用與發(fā)展
- 寓言故事匯報展示
- 服裝設(shè)計產(chǎn)品開發(fā)全流程
- Siphonaxanthin-生命科學(xué)試劑-MCE
- Anticonvulsant-agent-10-生命科學(xué)試劑-MCE
- GB/T 14536.12-2024電自動控制器第12部分:能量調(diào)節(jié)器的特殊要求
- 門診部醫(yī)療糾紛預(yù)防與處理
- 六年級語文下冊 期末復(fù)習(xí)非連續(xù)性文本閱讀專項訓(xùn)練(一)(含答案)(部編版)
- 美學(xué)原理學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 《實踐論》(原文)毛澤東
- 電力分包項目合同范本
- 貴州省遵義市道德與法治中考試卷及答案指導(dǎo)(2025年)
- 2023-2024學(xué)年內(nèi)蒙古呼和浩特市回民區(qū)高二下學(xué)期期中考試生物試題(解析版)
- 歷史人教部編版八年級(上冊)第13課五四運動課件(23張)2024版新教材
- 文化在社會發(fā)展中的作用
- DB15-T 3651-2024 光伏項目防沙治沙技術(shù)規(guī)程
評論
0/150
提交評論