第三章-80x86指令系統(tǒng)_第1頁
第三章-80x86指令系統(tǒng)_第2頁
第三章-80x86指令系統(tǒng)_第3頁
第三章-80x86指令系統(tǒng)_第4頁
第三章-80x86指令系統(tǒng)_第5頁
已閱讀5頁,還剩103頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

主要內(nèi)容8086指令格式和尋址方式操作數(shù)的尋址方式轉(zhuǎn)移地址的尋址方式8086指令系統(tǒng)數(shù)據(jù)傳送指令算術(shù)運(yùn)算指令位操作指令串操作指令控制轉(zhuǎn)移指令處理器控制指令115一條指令對應(yīng)一種規(guī)定操作,設(shè)計(jì)微處理器時(shí)已經(jīng)設(shè)計(jì)好!3.18086/8088指令系統(tǒng)的尋址方式1.操作數(shù)的種類指令中操作的對象數(shù)據(jù)操作數(shù)地址操作數(shù)立即數(shù)操作數(shù):指令中要操作的數(shù)據(jù)在指令中。寄存器操作數(shù):指令中要操作的數(shù)據(jù)在指定的寄存器中。存儲(chǔ)器操作數(shù):指令中要操作的數(shù)據(jù)存放在指定的存儲(chǔ)單元中。I/O操作數(shù):指令中要操作的數(shù)據(jù)來自或送到I/O端口。:程序要轉(zhuǎn)移的目標(biāo)地址立即數(shù)操作數(shù)寄存器操作數(shù)存儲(chǔ)器操作數(shù)有的指令有2個(gè)操作數(shù),分別為源操作數(shù)和目的操作數(shù);有的指令有1個(gè)操作數(shù),或沒有操作數(shù)。指令只有一個(gè)目的操作數(shù)地址2.尋址方式所謂尋址方式是指指令中給出的尋找操作數(shù)(包括數(shù)據(jù)操作數(shù)和地址操作數(shù))的方法。1)數(shù)據(jù)尋址方式(1)立即數(shù)尋址方式所提供的操作數(shù)直接包含在指令中,緊跟在操作碼之后,作為指令的一部分。立即數(shù)可以是8位;也可以為16位,高位字節(jié)存放在高地址存儲(chǔ)單元,低位字節(jié)存放在低地址單元MOVBL,80HMOVAX,1090H只適用于雙操作數(shù)指令中的源操作數(shù)尋址,而且多用來為寄存器賦初值或者目的操作數(shù)與一個(gè)常數(shù)運(yùn)算。80HAH10HAL90H(2)寄存器尋址方式操作數(shù)存放在指令規(guī)定的寄存器中,寄存器的名字在指令中給出。16位操作數(shù),寄存器為AX、BX、CX、DX、SI、DI、SP、BP8為操作數(shù),寄存器為AH、AL、BH、BL、CH、CL、DH、DLMOVCL,DLMOVAX,BX假設(shè)(DL)=50H,(BX)=1234H50HAH12HAL34H若指令的源操作數(shù)和目的操作數(shù)都采用寄存器尋址方式,由于除取指操作外,不需要訪問存儲(chǔ)器,因而指令執(zhí)行的速度快。寄存器數(shù)量越多,程序的執(zhí)行速度越快。(3)存儲(chǔ)器尋址方式操作數(shù)存放在存儲(chǔ)單元中。唯一性?由段地址左移4位與操作數(shù)在段內(nèi)的偏移地址相加得到的。存儲(chǔ)器操作數(shù)在段內(nèi)的偏移地址(EA)位移量(Displacement):存放在指令中的一個(gè)8位或16位的數(shù),

但不是立即數(shù),而是一個(gè)地址?;罚˙aseAddress):存放在基址寄存器BX或BP中的內(nèi)容。變址(IndexAddress):存放在變址寄存器SI或DI中的內(nèi)容。直接尋址方式寄存器間接尋址方式寄存器相對尋址方式基址變址尋址方式基址變址相對尋址方式①直接尋址方式(DirectAddressing)操作數(shù)位于存儲(chǔ)器中,指令中給出存儲(chǔ)器的地址,且為段內(nèi)偏移(有效地址)。操作數(shù)的完整地址還應(yīng)包含段地址,若無特殊說明,隱含的段地址由DS寄存器提供。EA=位移量例:MOVAL,[1064H]表示地址時(shí),必須加上方括號若(DS)=2000H,執(zhí)行情況如圖所示:45H8086/8088允許段超越MOVAL,ES:[1064H]ES:MOV[1064H],AX在匯編語言指令中,可以用符號地址表示位移量:MOVAL,[Value]或MOVAL,value②寄存器間接尋址方式操作數(shù)位于存儲(chǔ)器中,該存儲(chǔ)器的地址存放于指令指定的寄存器中,指令對存儲(chǔ)器中的內(nèi)容進(jìn)行運(yùn)算。若無特殊說明,隱含的段地址由DS提供,只有BP做間接尋址的時(shí)候,隱含的段地址為SS。EA=(SI)源變址寄存器(DI)目的變址寄存器(BX)基址寄存器(BP)基地址指針寄存器用作間址的寄存器必須加上方括號存儲(chǔ)器…50H40H30000H32000HAX(DS)×10H=30000H(SI)=2000H32000H+存儲(chǔ)器…30000H31000HAL50H(DS)×10H=30000H(BX)=1000H31000H+例:MOVAX,[SI]MOV[BX],AL若(DS)=3000H,(SI)=2000H,(BX)=1000H,(AL)=64HAH40HAL50H50H執(zhí)行結(jié)果(AX)=4050H執(zhí)行結(jié)果(31000)H=50H寄存器間接尋址允許段超越:MOVES:[DI],AXEA=(SI)源變址寄存器(DI)目的變址寄存器(BX)基址寄存器(BP)基址地址指針寄存器+disp-8/disp-16③寄存器相對尋址方式操作數(shù)位于內(nèi)存單元中,若指令中規(guī)定的寄存器為SI、DI、BX,則操作數(shù)默認(rèn)存在數(shù)據(jù)段中;若指令中規(guī)定的寄存器是BP,則操作數(shù)默認(rèn)存在堆棧段中。指令書寫形式:MOVAL,[BP+TABLE]MOVAL,[BP]+TABLEMOVAL,TABLE[BP]其中TABLE是一個(gè)8位或16位的位移量。此方式常用于訪問一維表格和數(shù)組的元素,用表格和數(shù)組首地址(是一個(gè)具體的地址值,表明數(shù)組或表格第一個(gè)元素在數(shù)據(jù)段中的段內(nèi)偏移)作偏移量,基址寄存器存放數(shù)組元素的下標(biāo),指明被訪問元素在表格或數(shù)組中的位置。允許段超越CX操作碼50H10H存儲(chǔ)器…30H30000H32050H+操作碼40H(DS)×10H=30000H(BX)=1000HCOUNT=1050H32050H50HAX操作碼10H存儲(chǔ)器…30000H32010H+操作碼(DS)×10H=30000H(SI)=2000H10H32010H40HMOV[SI+10H],AXMOVCX,[BX+COUNT]若(DS)=3000H,(SI)=2000H,(BX)=1000H,COUNT=1050H,(AX)=4050H50H40HCH40HCL30H執(zhí)行結(jié)果:(32010H)=4050H執(zhí)行結(jié)果(CX)=4030H④基址變址尋址方式操作數(shù)位于內(nèi)存單元中EA=(SI)源變址寄存器(DI)目的變址寄存器+(BX)基址寄存器(BP)基址指針寄存器一般情況下,由基址寄存器決定操作數(shù)在哪個(gè)段中:BX的內(nèi)容作為基址操作數(shù)在數(shù)據(jù)段中BP的內(nèi)容作為基址操作數(shù)在堆棧段中此尋址方式可用于處理一維表格或數(shù)組,基址寄存器存放數(shù)組首址,變址寄存器存放欲訪問元素在數(shù)組中的位置(下標(biāo));也可用于處理二維表格或數(shù)組,要求二維數(shù)組位于指令規(guī)定的段的開始,基址寄存器和變址寄存器分別存放數(shù)組元素的行列下標(biāo)。指令書寫形式:

MOVAX,[BP+SI]MOVAX,[BP][SI]允許段超越MOV[BX+DI],AXMOVAH,[BP][SI]若(DS)=3000H,(SS)=4000H,(BX)=1000H,(DI)=1100H,(AX)=0050H,(BP)=2000H,(SI)=1200H存儲(chǔ)器…56H40000H43200HAH(SS)×10H=40000H(BP)=2000H(SI)=1200H43200H+存儲(chǔ)器…30000H32100H00HAX50H(DS)×10H=30000H(BX)=1000H(DI)=1100H32100H+50H00H56H執(zhí)行結(jié)果:(32100H)=0050H執(zhí)行結(jié)果(AH)=56H⑤基址變址相對尋址方式操作數(shù)位于內(nèi)存單元中EA=(SI)源變址寄存器(DI)目的變址寄存器+(BX)基址寄存器(BP)基地址指針寄存器+disp-8/disp-16基址寄存器為BX時(shí)操作數(shù)在數(shù)據(jù)段中基址寄存器為BP時(shí)操作數(shù)在堆棧段中此尋址方式常用于處理二維表格或數(shù)組。表格或數(shù)組的首址作偏移量,基址寄存器和變址寄存器存放數(shù)組的行、列下標(biāo),指明元素在數(shù)組中的位置。指令書寫形式:MOVAX,[BX+SI+COUNT]MOVAX,[BX][SI+COUNT]MOVAX,[BX+SI]COUNTMOVAX,[BX][SI]COUNTMOVAX,COUNT[BX][SI]允許段超越MOVAH,[BX+DI+1234H]MOV[BP+SI+DATA],CX若(DS)=4000H,(SS)=5000H,(BX)=1000H,(DI)=1500H,(BP)=2000H,(SI)=1050H,(CX)=2050H,DATA=10H存儲(chǔ)器…64H40000H43734HAH(DS)×10H=40000H(BX)=1000H(DI)=1500H1234H43734H+存儲(chǔ)器…50000H53060H20HCX50H(SS)×10H=50000H(BP)=2000H(SI)=1050HDATA=10H53060H+64H50H20H執(zhí)行結(jié)果:(AH)=64H執(zhí)行結(jié)果:(53060H)=2050H尋址方式源操作數(shù)格式使用段寄存器指令舉例立即數(shù)尋址data(CS)MOVAX,1064H寄存器尋址r無MOVAH,AL直接尋址[data]DSMOVAX,[1064H]

存儲(chǔ)器尋址寄存器間接尋址[SI]、[DI]、[BX][BP]DSSSMOVAX,[SI]寄存器相對尋址[BX]+disp[SI]+disp[DI]+disp[BP]+dispDSDSDSSSMOVAX,[BX]+1064H基址變址尋址[BX]+[SI][BX]+[DI][BP]+[SI][BP]+[DI]DSDSSSSSMOVAX,[BX][SI]基址變址相對尋址[BX]+[SI]+disp[BX]+[DI]+disp[BP]+[SI]+disp[BP]+[DI]+dispDSDSSSSSMOVAX,[BX][DI]+1064H(4)I/O端口尋址方式端口直接尋址方式端口間接尋址方式①端口直接尋址方式端口地址用8位(0~255)立即數(shù)INAL,21H7FH②端口間接尋址方式當(dāng)端口地址大于FFH時(shí),必須事先將端口地址放在DX寄存器MOVDX,120HOUTDX,AX10F0H2)地址尋址方式找出程序轉(zhuǎn)移的地址。轉(zhuǎn)移地址可以在段內(nèi)(段內(nèi)轉(zhuǎn)移);轉(zhuǎn)移地址也可以跨段(段間轉(zhuǎn)移)。僅更改IP的內(nèi)容。(1)段內(nèi)直接尋址方式(相對尋址方式)指令內(nèi)含有目標(biāo)地址距本轉(zhuǎn)移指令的偏移量。該偏移量是8位或16位的有符號數(shù),正數(shù)表明要向前轉(zhuǎn)移,常用于跳過一段程序;負(fù)數(shù)表明要向回轉(zhuǎn)移,常用于構(gòu)成循環(huán)!當(dāng)位移量是8位時(shí),稱為短轉(zhuǎn)移,轉(zhuǎn)移范圍為-128~+127;位移量是16位時(shí),稱為近轉(zhuǎn)移,轉(zhuǎn)移范圍為-32768~+32767。此尋址方式適用于無條件轉(zhuǎn)移或條件轉(zhuǎn)移JMPNEARPTRPROGIA如果位移量為16位,目標(biāo)地址前加操作符NEARPTRJMPSHORTQUEST如果位移量為8位,目標(biāo)地址前加操作符SHORT如果目標(biāo)地址標(biāo)號已經(jīng)定義,可不寫SHORT(2)段內(nèi)間接尋址程序轉(zhuǎn)移地址存放在寄存器或存儲(chǔ)單元中,存儲(chǔ)器可用各種數(shù)據(jù)尋址方式表示,僅更改IP的內(nèi)容。指令格式:JMPBXJMPWORDPTR[BP+TABLE]WORDPTR為操作符,用以指出其后的尋址方式所取得的目標(biāo)地址是一個(gè)字的有效地址。(3)段間直接尋址方式指令中直接給出16位的段地址和16位的偏移地址用來更新當(dāng)前的CS和IP的內(nèi)容。指令格式:JMPLABEL_NAMEJMPFARPTRNEXTROUTINT(4)段間間接尋址由指令中給出的存儲(chǔ)器尋址方式求出存放轉(zhuǎn)移地址的四個(gè)連續(xù)存儲(chǔ)單元的地址。指令的操作是將存儲(chǔ)器的前兩個(gè)單元的內(nèi)容送給IP,后兩個(gè)單元的內(nèi)容送給CS。指令格式:JMPVAR_DOUBLE

WORDJMPDWORDPTR[BP][DI]此三種方式都不可用于條件轉(zhuǎn)移指令轉(zhuǎn)移范圍尋址方式段內(nèi)轉(zhuǎn)移(段內(nèi)偏移送入IP)段間轉(zhuǎn)移(段地址送CS,段內(nèi)偏移送IP)直接方式(指令中直接給出目標(biāo)地址或目標(biāo)地址距當(dāng)前IP的偏移量)段內(nèi)直接尋址(相對尋址)Eg:JMP0136JMP1000段間直接尋址Eg:JMPFFFF:0000間接方式(指令中給出存放目標(biāo)地址的寄存器或存放目標(biāo)地址的存儲(chǔ)單元的地址)段內(nèi)間接尋址Eg:JMPBXJMP[BX]JMP[0136]段間間接尋址Eg:JMPFAR[BX]JMPFAR[0136]轉(zhuǎn)移指令目標(biāo)地址的尋址方式尋址方式數(shù)據(jù)尋址方式地址尋址方式立即數(shù)尋址方式寄存器尋址方式存儲(chǔ)器尋址方式I/O端口尋址方式直接尋址方式寄存器間接尋址方式寄存器相對尋址方式基址變址尋址方式基址變址相對尋址方式端口直接尋址方式端口間接尋址方式段內(nèi)直接尋址方式段內(nèi)間接尋址方式段間直接尋址方式段間間接尋址方式3.28086/8088指令系統(tǒng)數(shù)據(jù)傳送類指令算術(shù)運(yùn)算類指令位操作指令串操作指令程序控制指令處理器控制指令通用數(shù)據(jù)傳送指令輸入輸出指令目標(biāo)地址傳送指令標(biāo)志傳送指令對狀態(tài)標(biāo)志位不發(fā)生影響!1、數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令MOV堆棧操作指令數(shù)據(jù)交換指令XCHG字節(jié)轉(zhuǎn)換指令XLAT壓入堆棧指令PUSH彈出堆棧指令POP輸入指令I(lǐng)N輸出指令OUT取有效地址指令LEA地址指針裝入DS指令LDS地址指針裝入ES指令LES取標(biāo)志指令LAHF置標(biāo)志指令SAHF標(biāo)志壓入堆棧指令PUSHF標(biāo)志彈出堆棧指令POPF通用數(shù)據(jù)傳送指令輸入輸出指令目標(biāo)地址傳送指令標(biāo)志傳送指令1、數(shù)據(jù)傳送指令1)通用數(shù)據(jù)傳送指令(1)數(shù)據(jù)傳送指令MOV(MOVement)指令格式及操作:MOVdst,src;(dst)←(src)dst表示目的操作數(shù),src表示源操作數(shù)源操作數(shù)可以是:立即數(shù)、寄存器以及各種尋址的內(nèi)存單元內(nèi)容。源操作數(shù)和目的操作數(shù)不能同時(shí)為內(nèi)存單元。目的操作數(shù)可以是寄存器或者各種尋址的內(nèi)存單元。不可以是立即數(shù)、IP、CS。正確的指令舉例:MOVAL,BL ;BL中的8位數(shù)送ALMOVDS,AX;AX中的16位數(shù)送DSMOV[DI],AX;累加器內(nèi)容送DI和DI+1所指的兩個(gè)單元(數(shù)據(jù)段)MOVCX,[1000H];將數(shù)據(jù)段1000和1001兩單元內(nèi)容送CXMOVBL,20H;將立即數(shù)20H送BLMOVDX,5020H;將立即數(shù)5020H送DXMOVAX,[BP+SI+04H];將(BP+SI+4)和(BP+SI+5)兩單元(堆棧段);內(nèi)容送AX以下的指令是錯(cuò)誤的:MOV52H,AHMOVCS,AXMOV[DI],[SI]MOV[1000],[SI]MOVIP,BX;立即數(shù)不能作為目的操作數(shù);CS不能作為目的操作數(shù);內(nèi)存單元之間不能直接傳送;內(nèi)存單元之間不能直接傳送;IP不能作為目的操作數(shù)(2)堆棧操作指令堆棧是按照“后進(jìn)先出”原則使用的一片內(nèi)存區(qū)域。數(shù)據(jù)裝入堆棧的過程稱為“壓入(PUSH)”,從堆棧中取出數(shù)據(jù)的過程稱為“彈出(POP)”。順序:先壓入堆棧的數(shù)據(jù)后彈出堆棧;后壓入堆棧的數(shù)據(jù)將先彈出堆棧!堆棧SP棧底棧頂?shù)偷刂犯叩刂稰USHPOP8086的堆棧建立在內(nèi)存的堆棧段中。堆棧的開辟和使用是借助于堆棧指針寄存器SP及相關(guān)硬件實(shí)現(xiàn)的。SP的內(nèi)容指向棧頂內(nèi)存單元的地址,SP初值指向的內(nèi)存稱為棧底。(用MOV指令更改SP的值,實(shí)際上就是從新設(shè)置棧底,開辟新的堆棧)。程序執(zhí)行時(shí),SP的值始終指向棧頂,當(dāng)有數(shù)據(jù)壓入堆棧時(shí),SP的值向遠(yuǎn)離棧底的方向變化,SP值減??;當(dāng)有數(shù)據(jù)彈出堆棧時(shí),SP值向靠近棧底的方向變化,SP值增大。堆棧操作中的操作數(shù)類型必須是字操作數(shù),即16位操作數(shù)。①壓入堆棧指令PUSH(PUSHwordontostack)PUSHsrc;(SP)←(SP)–2,((SP)+1:(SP))←(src)先將堆棧指針SP減2,使SP始終指向棧頂,然后再將操作數(shù)src壓入(SP)+1和(SP)兩個(gè)存儲(chǔ)單元PUSHAX ;(SP)←(SP)–2,(SP)+1←(AH),(SP)←(AL)PUSHCSPUSH[SI]源操作數(shù)可以為通用寄存器、段寄存器、某種尋址方式所指示的存儲(chǔ)單元,但是不能為立即數(shù)?、趶棾龆褩V噶頟OP(POPwordoffstack)POPdst ;(dst)←((SP)+1,(SP)),(SP)←(SP)+2POPBXPOPES目的操作數(shù)可以為存儲(chǔ)器、通用寄存器或段寄存器(但不能為CS),不能為立即數(shù)!在子程序的開頭保護(hù)寄存器的順序?yàn)椋篜USHAXPUSHBXPUSHCXPUSHDX則子程序返回前,應(yīng)按如下順序恢復(fù)寄存器值:POPDXPOPCXPOPBXPOPAX(3)數(shù)據(jù)交換指令XCHG(eXCHanGe)XCHGdst,src ;(dst)←→(src)源操作數(shù)和目的操作數(shù)均可以是寄存器或存儲(chǔ)器,但不能同時(shí)為存儲(chǔ)器,而且,段寄存器的內(nèi)容不能參加交換。交換的內(nèi)容可以是一個(gè)字節(jié),也可以是一個(gè)字!XCHGAL,BL ;AL和BL之間進(jìn)行字節(jié)交換XCHGBX,CX;BX和CX之間進(jìn)行字交換XCHG[2500H],DX;DX和2500H、2501兩個(gè)單元內(nèi)容交換(數(shù)據(jù)段)(4)字節(jié)查表轉(zhuǎn)換指令XLAT(transLATe)XLATsrc_table ;(AL)←((BX)+(AL)) 字節(jié)查表轉(zhuǎn)換指令,根據(jù)表中元素的序號,查出表中相應(yīng)元素的內(nèi)容。為了實(shí)現(xiàn)查表轉(zhuǎn)換,預(yù)先應(yīng)將表的首地址,即表頭地址傳送到BX寄存器,元素的序號即位移量送AL,表中第一個(gè)元素的序號為0,然后依次是1,2,3,…。執(zhí)行XLAT指令后,表中指定序號的元素存于AL,AL中的內(nèi)容被取代。這是一種特殊的基址變址尋址方式,基址寄存器為BX,變址寄存器為AL。利用XLAT指令實(shí)現(xiàn)不同數(shù)制或編碼系統(tǒng)之間的轉(zhuǎn)換。

被尋址表的最大長度為255個(gè)字節(jié)MOVBX,OFFSETHex_tableMOVAX,0AHXLATHex_table偏移地址XLATXLATsrc_tableXLATES:src_table;重設(shè)段寄存器ES,必須寫操作數(shù)(AL)=41H2)輸入輸出指令輸入指令從外設(shè)端口讀入數(shù)據(jù),輸出指令向端口發(fā)送數(shù)據(jù)。無論是讀入的數(shù)據(jù)或是準(zhǔn)備發(fā)送的數(shù)據(jù)必須放在寄存器AL(字節(jié))或AX(字)中。端口直接尋址的輸入輸出指令,可尋址256個(gè)端口(0~255)端口通過DX寄存器間接尋址的輸入輸出指令,可尋址64K個(gè)端口(0~65535)(1)輸入指令I(lǐng)N(Inputbyteorword)

口地址為8位時(shí),口地址直接出現(xiàn)在指令中。格式:INAX/AL,PORT8位口地址既可以傳送8位數(shù)據(jù),也可以傳送16位數(shù)據(jù),取決于具體設(shè)備的接口芯片。功能:從PORT口輸入8位或16位數(shù)據(jù)到AL或AX寄存器。口地址為16位時(shí),口地址存放在DX寄存器中。格式:INAX/AL,DX功能:從以DX內(nèi)容為口地址的接口輸入8位或16位數(shù)據(jù)到AL或AX寄存器。從DX和DX+1所指出的兩個(gè)端口讀一個(gè)字,較低地址端口中的值讀到AL中,較高地址端口中的值讀到AH中。(2)輸出指令口地址為8位時(shí),口地址直接出現(xiàn)在指令中。格式:OUTPORT,AX/AL功能:將AL或AX寄存器中的8位或16位數(shù)據(jù)輸出到PORT口。口地址為16位時(shí),口地址存放在DX寄存器中。格式:OUTDX,AX/AL功能:將AL/AX寄存器中的8位或16位數(shù)據(jù)輸出到以DX內(nèi)容為口地址的接口。將AL中的字節(jié)輸出到DX所指的端口中,將AH中的字節(jié)輸出到DX+1所指的端口中。3)目標(biāo)地址傳送指令(1)取有效地址指令LEA(LoadEffectiveAddress)指令格式: LEAreg16,mem

將近地址指針寫入到指定的寄存器。

目的操作數(shù)必須為16位通用寄存器,源操作數(shù)必須是一個(gè)存儲(chǔ)器操作數(shù)。結(jié)果是把源操作數(shù)的有效地址傳送到目標(biāo)寄存器。LEABX,BUFFER ;(BX)←OFFSETBUFFERLEAAX,[BP][DI] ;(AX)←(BP)+(DI)LEADX,BETA[BX][SI];(DX)←(BX)+(SI)+BETALEABX,BUFFERMOVBX,BUFFER前者將BUFFER的偏移地址送到BX;后者將存儲(chǔ)器變量BUFFER的內(nèi)容傳送到BX。LEABX,BUFFERMOVBX,OFFSETBUFFER(2)地址指針裝入DS指令LDS(LoadpointerDS)指令格式:LDSreg16,mem32用于寫入遠(yuǎn)地址指針。源操作數(shù)是存儲(chǔ)器操作數(shù),目的操作數(shù)可以是任一個(gè)16位通用寄存器把一個(gè)存放在4個(gè)存儲(chǔ)單元中共計(jì)32位的目標(biāo)地址(段地址和偏移量)傳送到兩個(gè)目的寄存器,其中,后兩個(gè)字節(jié)(高地址)內(nèi)容,即段地址送到DS;前兩個(gè)字節(jié)(低地址)內(nèi)容,即偏移量送到指令中所出現(xiàn)的目的寄存器中。設(shè)當(dāng)前(DS)=C000H,有關(guān)的存儲(chǔ)單元的內(nèi)容為(C0010H)=80H,(C0011H)=01H,(C0012H)=00H,(C0013H)=20H執(zhí)行LDSSI,[0010H]C0010HC0011HC0012HC0013H20H80H01H00H送入SI送入DS執(zhí)行完后(DS)=2000H(SI)=0180H(3)地址指針裝入ES指令LES(LoadpointerintoES)指令格式:LESreg16,mem32與LDS類似,裝入一個(gè)32位的遠(yuǎn)地址指針,位移地址送指定寄存器,段地址送附加段寄存器ES。mem內(nèi)存單元內(nèi)容(四個(gè)字節(jié))分別賦值給reg寄存器和ES寄存器,低兩字節(jié)送入reg寄存器,高兩字節(jié)送入ES寄存器。LESreg,memmem內(nèi)存單元內(nèi)容(四個(gè)字節(jié))分別賦值給reg寄存器和DS寄存器,低兩字節(jié)送入reg寄存器,高兩字節(jié)送入DS寄存器LDSreg,memmem內(nèi)存單元的地址的段內(nèi)偏移部分賦值給reg寄存器LEAreg,mem功能格式目標(biāo)地址傳送指令4)標(biāo)志傳送指令FLAGS,其中包括6個(gè)狀態(tài)標(biāo)志位和3個(gè)控制標(biāo)志位。共有4條標(biāo)志傳送指令,都為單字節(jié)指令,指令的操作數(shù)為隱含形式。(1)取標(biāo)志指令LAHF(LoadAHfromFlags)指令格式:LAHFAH××××OFDFIFTFSFZF×AF×PF×CFFLAGSSFZFAFPFCF(2)置標(biāo)志指令SAHF(StoreAHintoFlags)指令格式:SAHFAHSFZFAFPFCF××××OFDFIFTFSFZF×AF×PF×CFFLAGSSAHF將影響標(biāo)志寄存器(3)標(biāo)志壓入堆棧指令PUSHF(PUSHFlagsontostack)指令格式:PUSHF ;(SP)←(SP)?2,((SP)+1):(SP))←(FLAGS)(4)標(biāo)志彈出堆棧指令POPF(POPFlagsoffstack)指令格式:POPF ;(FLAGS)←((SP)+1:(SP)),(SP)←(SP)+2

LAHF

SAHF修改AH寄存器如何修改標(biāo)志寄存器的高8位或者低8位呢先用LAHF指令把標(biāo)志寄存器的低8位賦值給AH寄存器,然后用程序修改AH寄存器,最后再用SAHF指令把修改后的AH寄存器的內(nèi)容傳送回標(biāo)志寄存器的低8位。PUSHFPOPAX ;借助堆棧,將FLAG賦值給AXPUSHAX;借助堆棧,將AX賦值給FLAGPOPF修改AX內(nèi)容長度可以為8位或16位,若為帶符號數(shù),用補(bǔ)碼表示2、算術(shù)運(yùn)算指令1)算術(shù)運(yùn)算的數(shù)據(jù)類型無符號的二進(jìn)制數(shù)帶符號的二進(jìn)制數(shù)壓縮型十進(jìn)制數(shù)(壓縮型BCD碼)非壓縮型十進(jìn)制數(shù)(非壓縮型BCD碼)只有加/減運(yùn)算壓縮型BCD碼,每個(gè)字節(jié)存兩位數(shù),即兩位BCD碼,對于一個(gè)字節(jié)來說,壓縮型BCD碼的范圍是0~99;非壓縮型BCD碼,每個(gè)字節(jié)存一位數(shù),即由字節(jié)的低4位決定存放的數(shù)字,對于高四位,進(jìn)行乘/除運(yùn)算時(shí)必須全為0,加/減運(yùn)算時(shí)可以為任意值。2)算術(shù)運(yùn)算指令對標(biāo)志位的影響標(biāo)志位中的絕大多數(shù)可由跟在算術(shù)指令后的條件轉(zhuǎn)移指令進(jìn)行測試,改變程序的流程。算術(shù)運(yùn)算類指令共有20條:①加法指令②帶進(jìn)位加法指令③加一指令④減法指令⑤帶借位減法指令⑥減一指令⑦求補(bǔ)指令⑧比較指令⑨無符號數(shù)乘法指令⑩帶符號數(shù)乘法指令無符號數(shù)除法指令帶符號數(shù)除法指令字節(jié)擴(kuò)展指令字?jǐn)U展指令非壓縮型BCD碼加法調(diào)整指令壓縮型BCD碼加法調(diào)整指令非壓縮型BCD碼減法調(diào)整指令壓縮型BCD碼減法調(diào)整指令非壓縮型BCD碼乘法調(diào)整指令非壓縮型BCD碼除法調(diào)整指令段寄存器不能參加加、減、乘、除運(yùn)算①加法指令A(yù)DD(ADDition)指令格式及操作:ADDdst,src;(dst)←(dst)+(src)ADD指令將目的操作數(shù)與源操作數(shù)相加,并將結(jié)果送給目的操作數(shù)。加法指令將影響狀態(tài)標(biāo)志位。目的操作數(shù):寄存器、存儲(chǔ)器源操作數(shù):寄存器、存儲(chǔ)器、立即數(shù)兩者不能同時(shí)為存儲(chǔ)器ADDCL,10HADDDX,SIADDAX,MEMADDDATA[BX],ALADDALPHA[DI],30H數(shù)據(jù)可以為8位,也可以為16位。數(shù)據(jù)類型若為無符號數(shù),結(jié)果超出范圍,則CF位為1;若為帶符號數(shù),超出補(bǔ)碼表示范圍,則OF位為1。(1)加法指令:不帶進(jìn)位加法指令、帶進(jìn)位加法指令、加1指令②帶進(jìn)位加法指令A(yù)DC(ADditionwithCarry)操作格式及操作:ADCdst,src ;(dst)←(dst)+(src)+(CF)影響狀態(tài)標(biāo)志位目的操作數(shù):寄存器、存儲(chǔ)器源操作數(shù):寄存器、存儲(chǔ)器、立即數(shù)兩者不能同時(shí)為存儲(chǔ)器帶進(jìn)位加法指令主要用于多字節(jié)數(shù)據(jù)的加法運(yùn)算,如果低字節(jié)相加時(shí)產(chǎn)生進(jìn)位,則在下一次高字節(jié)相加時(shí)將這個(gè)進(jìn)位加進(jìn)去。③加1指令I(lǐng)NC(INCrementby1)指令格式及操作:INCdst;(dst)←(dst)+1INC將目的操作數(shù)加1,并將結(jié)果送回目的操作數(shù)。影響SF、ZF、AF、PF、OF,不影響CF。目的操作數(shù):寄存器、存儲(chǔ)器,不能為段寄存器和立即數(shù)。INCDLINCSIINCBYTEPTR[BX][SI]INCWORDPTR[DI]BYTEPTR指定隨后的存儲(chǔ)器操作數(shù)的類型是字節(jié)型WORDPTR指定隨后的存儲(chǔ)器操作數(shù)是字型常用于循環(huán)程序中修改地址(2)減法指令:不帶借位減法指令、帶借位減法指令、減1指令、求補(bǔ)指令、比較指令①減法指令SUB(SUBtraction)指令格式及操作:SUBdst,src ;(dst)←(dst)?(src)用目的操作數(shù)減源操作數(shù),結(jié)果送回目的操作數(shù)目的操作數(shù):寄存器、存儲(chǔ)器源操作數(shù):立即數(shù)、寄存器、存儲(chǔ)器允許字節(jié)相減,也允許字相減兩者不能同時(shí)為存儲(chǔ)器SUBAL,37HSUBDX,BXSUBCX,VARE1SUBARRAY[DI],AXSUBBETA[BX][DI],512H當(dāng)無符號數(shù)的較小數(shù)減較大數(shù)時(shí),因不夠減而產(chǎn)生借位,此時(shí)進(jìn)位標(biāo)志CF置1。當(dāng)帶符號數(shù)的較小數(shù)減較大數(shù)時(shí),將得到負(fù)的結(jié)果,則符號標(biāo)志SF置1。帶符號數(shù)相減如果結(jié)果溢出,則OF置1。②帶借位減法指令SBB(SuBtractionwithBorrow)指令格式及操作:SBBdst,src ;(dst)←(dst)-(src)-(CF)對標(biāo)志位影響同SUB目的操作數(shù):寄存器、存儲(chǔ)器源操作數(shù):立即數(shù)、寄存器、存儲(chǔ)器允許字節(jié)相減,也允許字相減兩者不能同時(shí)為存儲(chǔ)器SBBBX,1000HSBBCX,DXSBBAL,DATA[SI]SBBDISP[BP],BLSBBBYTEPTR[SI+6],97H主要用于多字節(jié)減法,可以考慮進(jìn)位。③減1指令DEC(DECrementby1)指令格式及操作:DECdst ;(dst)←(dst)?1操作數(shù)可以為寄存器或者是存儲(chǔ)器,但不能為立即數(shù)和段寄存器影響SF、ZF、AF、PF、OF,不影響CFDECBLDECCXDECBYTEPTR[BX]DECWORDPTR[BP][DI]MOVAX,0FFFFHCYC:DEC?AXJNZCYCHLT延時(shí)!計(jì)算兩個(gè)多字節(jié)十六進(jìn)制數(shù)之和:3B74AC60F8H+20D59E36C1H=?程序如下:

MOVCX,5;設(shè)置循環(huán)次數(shù)

MOVSI,0;置位移量初值

CLC ;清進(jìn)位CFLOOPER:MOVAL,DATA2[SI];取一個(gè)加數(shù)

ADCDATA1[SI],AL;和一個(gè)被加數(shù)相加

INCSI;位移量加1

DECCX;循環(huán)次數(shù)減1

JNZLOOPER;加完否,若沒完,;轉(zhuǎn)LOOPER,繼續(xù)相加

HLT ;程序暫停

④求補(bǔ)指令NEG(NEGate)指令格式及操作:NEGdst;(dst)←0??(dst)只有一個(gè)目的操作數(shù),存放運(yùn)算的最終結(jié)果。操作數(shù)可以為寄存器、存儲(chǔ)器,對8位數(shù)或16位數(shù)求補(bǔ)。NEG BLNEG AXNEG BYTEPTR[BP][SI]NEG WORDPTR[DI+20]用NEG可以得到負(fù)數(shù)的絕對值!⑤比較指令CMP(CoMPare)。指令格式及操作:CMPdst,src ;(dst)?(src)比較指令后兩個(gè)操作數(shù)內(nèi)容均不變,比較結(jié)果反映在狀態(tài)標(biāo)志位上目的操作數(shù):寄存器、存儲(chǔ)器源操作數(shù):立即數(shù)、寄存器、存儲(chǔ)器兩者不能同時(shí)為存儲(chǔ)器?。?!CMPAL,0AH ;寄存器與立即數(shù)比較CMPCX,DI ;寄存器之間比較CMPAH,AREA1;寄存器與存儲(chǔ)器比較CMP[BX+5],SI;存儲(chǔ)器與寄存器比較內(nèi)存數(shù)據(jù)段存放了200個(gè)帶符號數(shù),首地址為TAB1,要求將各數(shù)取絕對值后存入以TAB2為首址的內(nèi)存區(qū)。開始傳送源地址,目標(biāo)地址設(shè)置循環(huán)次數(shù)判斷符號位符號位為1?為1求補(bǔ)存入目標(biāo)地址源地址加1,目標(biāo)地址加1循環(huán)次數(shù)減1循環(huán)次數(shù)到?不為1到結(jié)束LEASI,TAB1 ;(SI)←源地址指針

LEADI,TAB2 ;(DI)←目標(biāo)地址指針

MOVCX,200 ;(CX)←循環(huán)次數(shù)

CHECK:MOVAL,[SI];取一個(gè)帶符號數(shù)到ALORAL,AL;AL內(nèi)容不變,但使之影響標(biāo)志

JNSNEXT;若(SF)=0,則轉(zhuǎn)NEXTNEGAL;否則求補(bǔ)NEXT:MOV[DI],AL;傳送到目標(biāo)地址INCSI;源地址加1INCDI;目標(biāo)地址加1DECCX;循環(huán)次數(shù)減1JNZCHECK;如不等于零,則轉(zhuǎn)CHECKHLT ;停止在數(shù)據(jù)段從MYDATA開始的存儲(chǔ)單元中分別存放了兩個(gè)8位無符號數(shù),試比較它們的大小,并將大者傳送到MAX單元。 LEA BX,MYDATA ;MYDATA偏移地址送BX MOV AL,[BX] ;第一個(gè)無符號數(shù)送AL INC BX ;BX指向第二個(gè)無符號數(shù)

CMP AL,[BX] ;兩個(gè)數(shù)比較

JNC DONE ;如CF=0,則轉(zhuǎn)DONE,即無借位 MOV AL,[BX] ;否則,第二個(gè)無符號數(shù)送ALDONE: MOVMAX,AL ;較大的無符號數(shù)送MAX單元

HLT ;停止

格式功能影響標(biāo)志位INCdst加1送入目的操作數(shù)AF、OF、ZF、SF、PFDECdst減1送入目的操作數(shù)AF、OF、ZF、SF、PF(3)乘法指令只有一個(gè)源操作數(shù),另外一個(gè)操作數(shù)在累加器中,目的操作數(shù)隱含!可以進(jìn)行字或字節(jié)的乘法運(yùn)算無符號數(shù)乘法指令帶符號數(shù)乘法指令①無符號數(shù)乘法指令MUL(MULtiplicationunsigned)。指令格式及操作:MULsrc;(AX)←(AL)

(src) (字節(jié)乘法) ;(DX:AX)←(AX)

(src) (字乘法)

一個(gè)操作數(shù)(乘數(shù))在累加器中8位乘法時(shí)乘數(shù)在AL中16位乘法時(shí)乘數(shù)在AX中src必須在寄存器或存儲(chǔ)單元中范圍:0~255;0~65535MUL AL MUL BX MUL BYTEPTR[DI+6] MUL WORDPTRALPHA源操作數(shù)是存儲(chǔ)器時(shí),應(yīng)說明數(shù)據(jù)長度MOV AL,14HMOV CL,05HMUL CL;(AX)=0064H,(CF)=(OF)=0高半部分(AH或DX)為零,則狀態(tài)標(biāo)志位(CF)=(OF)=0;若高半部分(AH或DX)包含乘積的有效數(shù)字,狀態(tài)標(biāo)志位(CF)=(OF)=1執(zhí)行速度慢?、趲Х枖?shù)的乘法IMUL(IntegerMULtiplication)指令格式如下:IMUL src ;(AX)←(AL)

(src)(字節(jié)乘法) ;(DX:AX)←(AX)

(src) (字乘法)8位帶符號數(shù)的取值范圍:-128~+127;16位帶符號數(shù)的取值范圍:-32768~+32767乘積的高半部分僅是低半部分符號位的擴(kuò)展:狀態(tài)標(biāo)志位(CF)=(OF)=0乘積的高半部分包含乘積的有效數(shù)字而不僅是符號的擴(kuò)展:狀態(tài)標(biāo)志位(CF)=(OF)=1乘積為正時(shí):符號位為0,AH或DX的高半部分為8位全零或16位全0乘積為負(fù)時(shí):符號位為1,AH或DX的高半部分為8位全零或16位全1MOVAX,04E8HMOVBX,4E20HIMULBX;(DX:AX)=(AX)×(BX)執(zhí)行結(jié)果為:(DX)=017FH,(AX)=4D00H,且(CF)=(OF)=1。(4)除法指令除數(shù)只能是被除數(shù)的一半被除數(shù)為16位時(shí),除數(shù)應(yīng)該為8位;被除數(shù)為32位時(shí),除數(shù)應(yīng)該為16位。ALAH商余數(shù)AX操作數(shù)(8位)除數(shù)被除數(shù)(16位)(a)AXDX商余數(shù)AX操作數(shù)(16位)除數(shù)被除數(shù)(32位)(b)DX被除數(shù)為16位,存放于AX中。除數(shù)為8位,可存放于寄存器/存儲(chǔ)器中。8位商放在AL中,8位余數(shù)放在AH中。被除數(shù)為32位,存放于DX:AX中。除數(shù)為16位,可存放于寄存器/存儲(chǔ)器中。16位商放在AX中,16位余數(shù)放在DX中。除法指令對狀態(tài)標(biāo)志位SF、ZF、AF、PF、CF和OF的影響不確定。要求:①無符號數(shù)除法指令DIV(DIVisionunsigned)指令格式及操作:DIVsrc;(AL)←(AX)/(src)的商 (字節(jié)除法) ;(AH)←(AX)/(src)的余數(shù) ;(AX)←(DX:AX)/(src)的商 (字除法) ;(DX)←(DX:AX)/(src)的余數(shù)除數(shù)為0時(shí),則CPU自動(dòng)產(chǎn)生0號內(nèi)部中斷DIV BL ;AX除以BLDIV CX ;(DX:AX)除以CXDIV BYTEPTRDATA ;AX除以存儲(chǔ)器(8位)DIV WORDPTR[DI+BX] ;(DX:AX)除以存儲(chǔ)器(16位)MOV AX,0F05H ;MOV DX,068AH ;MOV CX,08E9H ;DIV CX ;(DX:AX)除以CX執(zhí)行結(jié)果:(AX)=BBE1H(商)(DX)=073CH(余數(shù))若被除數(shù)與除數(shù)位數(shù)相同需要將被除數(shù)進(jìn)行擴(kuò)展MOVAL,0FBHXORAH,AH將8位擴(kuò)展為16位?、趲Х枖?shù)除法指令I(lǐng)DIV(IntegerDIVision)P92指令格式及操作:IDIVsrc;(AL)←(AX)/(src)的商(字節(jié)除法) ;(AH)←(AX)/(src)的余數(shù) ;(AX)←(DX:AX)/(src)的商(字除法) ;(DX)←(DX:AX)/(src)的余數(shù)除數(shù)為0時(shí),則CPU自動(dòng)產(chǎn)生0號內(nèi)部中斷(除法出錯(cuò)中斷)若被除數(shù)和除數(shù)字長相等,在做IDIV之前,必須先用符號擴(kuò)展指令CBW、CWD將被除數(shù)的符號位擴(kuò)展,使之成為16位數(shù)或32位數(shù)。(5)符號擴(kuò)展指令正數(shù)的符號位為零,在高位全添上零;負(fù)數(shù)的符號位為1,高位全添上1。保證原數(shù)據(jù)的大小和符號不變。①字節(jié)擴(kuò)展指令CBW(ConvertBytetoWord)指令格式及操作:CBW;如果(AL)<80H,則(AH)←00H,;否則(AH)←0FFHMOVAL,4FHCBW(b)

MOVAL,0F4HCBW 結(jié)果:(a)(AL)=01001111B(AH)=00000000B(b)(AL)=11110100B(AH)=11111111B隱含操作數(shù)②字?jǐn)U展指令CWD(ConvertWordtoDoubleword)指令格式及操作:CWD ;如果(AX)<8000H, ;則(DX)←0000H,否則(DX)←FFFFH隱含的操作數(shù)為AX和DX將一個(gè)字(16位)按其符號位擴(kuò)展為雙字(32位)。CWD和CBW一樣,不影響狀態(tài)標(biāo)志位!字長相等的帶符號數(shù)除法:MOV AX,-2000;(AX)=-2000CWD ;(DX)=0FFFFHMOV BX,-421;(BX)=-421 IDIV BX ;(AX)=4(商),(DX)=-316(余數(shù))字長不相等的帶符號數(shù)乘法:MOV AL,MUL_BYTE ;(AL)←8位被乘數(shù)(帶符號數(shù))CBW ;將AL擴(kuò)展成16位帶符號數(shù),在AX中IMUL BX ;兩個(gè)16位帶符號數(shù)相乘,結(jié)果在DX:AX中4)十進(jìn)制數(shù)(BCD碼)運(yùn)算指令利用二進(jìn)制數(shù)的運(yùn)算指令算出結(jié)果,再用專門的指令對結(jié)果進(jìn)行修正。34+23=57 0011010034的BCD碼+0010001123的BCD碼0101011157的BCD碼壓縮型BCD碼非壓縮型BCD碼48+29=77 0100100048的BCD碼+0010100129的BCD碼0111000171的BCD碼

01001000+0010100101110001中間結(jié)果AF=1+00000110加06H調(diào)整01110111正確結(jié)果,77的BCD碼72+91=163

01110010 10010001CF?←100000011中間結(jié)果CF=1+01100000 01100011正確結(jié)果

01010111 +01000110 10011101中間結(jié)果 +00000110 10100011中間結(jié)果 +01100000CF←100000011正確結(jié)果CF=157+46=103低4位>9高4位>9(1)十進(jìn)制加法的調(diào)整指令①非壓縮型BCD碼加法調(diào)整指令A(yù)AA(ASCIIAdjustforAddition)指令格式如下: AAA隱含操作數(shù)為累加器:AL和AH如果 (AL)∧0FH>9,或(AF)=1則 (AL)←(AL)+06H (AH)←(AH)+1 (AF)←1 (CF)←(AF) (AL)←((AL)∧0FH)否則 (AL)←((AL)∧0FH)

∧相與影響AF、CF計(jì)算兩個(gè)非壓縮型BCD碼7+8=?MOV AX,0007H ;(AL)=07H,(AH)=00HMOV BL,08H ;(BL)=08HADD AL,BL ;(AL)=0FHAAA ;(AL)=05H,(AH)=01H,(CF)=(AF)=1

個(gè)位十位②壓縮型BCD碼加法調(diào)整指令DAA(DecimalAdjustforAddition)指令格式如下:

DAA隱含操作數(shù)為AL,任何時(shí)候都不會(huì)更改AH中內(nèi)容。如果 ((AL)∧0FH)>9或(AF)=1則 (AL)←(AL)+06H (AF)←1如果 (AL)>90H或(CF)=1則 (AL)←(AL)+60H (CF)←1

影響標(biāo)志位:SF、ZF、AF、PF、CF計(jì)算兩個(gè)2位的十進(jìn)制數(shù)之和:68+59=?MOVAL,68H ;(AL)=68HMOVBL,59H ;(BL)=59HADDAL,BL ;(AL)=C1H,(AF)=1DAA ;(AL)=27H,(CF)=1計(jì)算7+8=?MOVAX,0007H;(AL)=07H,(AH)=00H MOVBL,08H;(BL)=08HADDAL,BL ;(AL)=0FHDAA;(AL)=15H,(AH)=00H, ;(AF)=1,(CF)=0

(2)十進(jìn)制減法的調(diào)整指令非壓縮型BCD碼減法調(diào)整指令壓縮型BCD碼減法調(diào)整指令①非壓縮型BCD碼減法調(diào)整指令A(yù)AS(ASCIIAdjustforSubtraction)指令格式如下: AAS隱含操作數(shù)為AL、AH影響狀態(tài)標(biāo)志AF、CF如果 (AL)∧0FH>9或(AF)=1則 (AL)←(AL)?06H (AH)←(AH)?1 (AF)←1 (CF)←(AF) (AL)←((AL)∧0FH)否則 (AL)←((AL)∧0FH)兩位十進(jìn)制數(shù)的減法運(yùn)算:13?4=?均以非壓縮型BCD碼存放MOV AX,0103H;(AH)=01H,(AL)=03HMOV BL,04H;(BL)=04HSUB AL,BL;(AL)=03H?04H=FFHAAS;(AL)=09H,(AH)=0個(gè)位十位②壓縮型BCD碼減法調(diào)整指令DAS(DecimalAdjustforSubtraction)指令格式如下: DAS如果 ((AL)∧0FH)>9或(AF)=1則 (AL)←(AL)?06H (AF)←1如果 (AL)>90H或(CF)=1則 (AL)←(AL)?60H (CF)←1隱含操作數(shù)為AL;只改變AL中的內(nèi)容。影響狀態(tài)標(biāo)志位SF、ZF、AF、PF、CF兩個(gè)2位的十進(jìn)制數(shù)的減法運(yùn)算:83?38=?采用壓縮型BCD碼的形式來存放原始數(shù)據(jù)MOV AL,83H ;(AL)=83HMOV BL,38H ;(BL)=38HSUB AL,BL ;(AL)=4BHDAS ;(AL)=45H(3)十進(jìn)制乘除法的調(diào)整指令指令系統(tǒng)中只提供了非壓縮型BCD碼的調(diào)整指令,因此,CPU只能進(jìn)行非壓縮型BCD的乘除法運(yùn)算。①非壓縮型BCD碼的乘法調(diào)整指令A(yù)AM(ASCIIAdjustforMultiply)指令格式如下: AAM先用MUL指令將兩個(gè)真正的非壓縮型BCD碼相乘,結(jié)果放在AX中:(AH)←(AL)/0AH的商 即AL除以10,商送AH(AL)←(AL)/0AH的余數(shù) 即AL除以10,余數(shù)送AL隱含操作數(shù)為AL、AH,影響SF、ZF、PF兩個(gè)十進(jìn)制數(shù)的乘法運(yùn)算:7

9=?MOVAL,07H ;(AL)=07HMOVBL,09H ;(BL)=09HMULBL ;(AX)=07H

09H=003FHAAM ;(AH)=06H,(AL)=03H十位個(gè)位非壓縮型BCD碼AAM實(shí)質(zhì)是將AL寄存器中的二進(jìn)制數(shù)轉(zhuǎn)換為非壓縮型BCD碼,十位存放在AH,個(gè)位存放在AL。②非壓縮型BCD碼的除法調(diào)整指令A(yù)AD(ASCIIAdjustforDivision)指令格式如下: AAD操作:(AL)←(AH)

0AH+(AL)(AH)←0AAD是在除法之前進(jìn)行調(diào)整,然后用DIV指令進(jìn)行除法,所得之商還需用AAM指令進(jìn)行調(diào)整,才能得到正確的非壓縮型BCD碼。隱含操作數(shù)AL、AH,根據(jù)AL的結(jié)果影響SF、ZF、PF兩個(gè)十進(jìn)制數(shù)的除法運(yùn)算:73÷2=?將被除數(shù)和除數(shù)以非壓縮型BCD碼的形式分別存放在AX和BL寄存器中,被除數(shù)的十位在AH,個(gè)位在AL,除數(shù)在BL。MOVAX,0703H;(AH)=07H,(AL)=03HMOVBL,02H;(BL)=02HAAD ;(AL)=49H(即十進(jìn)制數(shù)73)DIVBL ;(AL)=24H(商)(AH)=01H(余數(shù))AAM ;(AH)=03H,(AL)=06H商的十位商的個(gè)位余數(shù)丟失AAD操作實(shí)質(zhì)上是將AX寄存器中非壓縮型BCD碼轉(zhuǎn)換為真正的二進(jìn)制數(shù),存放在AL中。3、位操作指令邏輯“與”AND測試指令TEST邏輯“或”O(jiān)R邏輯“異或”XOR邏輯“非”邏輯左移SHL/算術(shù)左移SAL邏輯右移SHR算術(shù)右移SAR循環(huán)左移ROL循環(huán)右移ROR帶進(jìn)位循環(huán)左移RCL帶進(jìn)位循環(huán)右移RCR邏輯運(yùn)算指令移位指令循環(huán)移位指令對8位或16位寄存器或存儲(chǔ)單元中的內(nèi)容按位操作1)邏輯運(yùn)算指令000101110110110000011011XANDYXORYXXORYNOTXXY邏輯運(yùn)算返回的值(1)邏輯“與”指令A(yù)ND(logicalAND)指令格式及操作:ANDdst,src;(dst)←(dst)∧(src)目的操作數(shù):寄存器、存儲(chǔ)器源操作數(shù):立即數(shù)、寄存器、存儲(chǔ)器兩個(gè)操作數(shù)不能同時(shí)為存儲(chǔ)器!操作對象可以為字節(jié)、可以為字!影響SF、ZF、PF,同時(shí)將CF和OF置0。不影響標(biāo)志位ANDAL,00001111H ;寄存器"與"立即數(shù)ANDCX,DI;寄存器"與"寄存器ANDSI,MEM_NAME ;寄存器"與"存儲(chǔ)器ANDALPHA[DI],AX ;存儲(chǔ)器"與"寄存器AND[BX][SI],0FFFEH ;存儲(chǔ)器"與"立即數(shù)

AND指令可以用“0”屏蔽掉某些不關(guān)心的位,用“1”保留感興趣的位!MOV AL,’6’ ;(AL)=00110110AND AL,0FH;(AL)=00000110這種指令可將0~9的ASCII碼轉(zhuǎn)換為非壓縮型BCD碼?。?)測試指令TEST(TESTornon-destructivelogicalAND)指令格式及操作:TESTdst,src ;(dst)∧(src)操作與AND指令,但是不把相與的結(jié)果送回目的操作數(shù),只反映在狀態(tài)標(biāo)志位上!結(jié)果反映在SF、PF、ZF上,CF、OF清零!TESTBH,7;寄存器''與''立即數(shù)(結(jié)果不回送,下同)TESTSI,BP;寄存器''與''寄存器TEST[SI],CH ;存儲(chǔ)器''與''寄存器TEST[BX][DI],BYTEPTR6AH;存儲(chǔ)器''與''立即數(shù)

IN AL,PORT ;從端口PORT輸入數(shù)據(jù) TEST AL,00101010B ;測試第1、3、5位 JNZ NEXT ;任一位不為0,則轉(zhuǎn)移到NEXTNEXT:

進(jìn)行位測試,與條件轉(zhuǎn)移指令一起完成對特定位的測試!(3)邏輯“或”指令OR(logicalinclusiveOR)指令格式及操作: ORdst,src ;(dst)←(dst)∨(src)目的操作數(shù):寄存器、存儲(chǔ)器源操作數(shù):立即數(shù)、寄存器、存儲(chǔ)器ORBL,0F6H ;寄存器''或''立即數(shù)ORAX,BX ;寄存器''或''寄存器ORCL,BETA[BX][DI];寄存器''或''存儲(chǔ)器ORGAMMA[SI],DX ;存儲(chǔ)器''或''寄存器ORMEM_BYTE,80H;存儲(chǔ)器''或''立即數(shù)

大寫、小寫英文字母的相互轉(zhuǎn)換!大寫字母小寫字母'A'=41H=01000001B'B'=42H=01000010B…'Z'=5AH=01011010B'a'=61H=01100001B'b'=62H=01100010B…'z'=7AH=01111010B用AND指令可將小寫字母變?yōu)榇髮懽帜?;用OR指令可將大寫字母變?yōu)樾懽帜浮OVAX,DATA ;(AX)←DATAORAX,AX ;影響標(biāo)志(用ANDAX,AX指令亦可)JZ ZERO ;如為零,轉(zhuǎn)移到ZERO… ;否則,…ZERO:…不能同時(shí)為存儲(chǔ)器(4)邏輯“異或”指令XOR(logicaleXclusiveOR)指令格式及操作: XOR dst,src ;(dst)←(dst)

(src)目的操作數(shù):寄存器、存儲(chǔ)器源操作數(shù):立即數(shù)、寄存器、存儲(chǔ)器將寄存器或存儲(chǔ)器中某些特定位“求反”MOVAL,0FH ;(AL)=00001111BXORAL,0AAH;(AL)=10100101B(0A5H)將寄存器的內(nèi)容清空XORAX,AX ;AX清零XORCX,CX ;CX清零

LEA BX,TABLE ;(BX)←數(shù)據(jù)表地址指針 MOVCL,100 ;(CL)←數(shù)據(jù)塊長度 XOR AX,AX ;清AL、AH,并清進(jìn)位CFLOOPER:ADD AL,[BX] ;加一個(gè)數(shù)到ALJNC GOON ;如(CF)=0,轉(zhuǎn)移到GOONINC AH ;否則,AH加1GOON:INC BX ;地址指針加1

DEC CL ;計(jì)數(shù)值減1

JNZ LOOPER ;如(CL)≠0,轉(zhuǎn)移到LOOPER MOV SUM,AX ;否則,(SUM)←(AL),(SUM+1)←(AH) HLT ;停止從偏移地址TABLE開始的內(nèi)存區(qū)中,存放著100個(gè)字節(jié)型數(shù)據(jù),要求將這些數(shù)進(jìn)行累加,并將累加和的低位存SUM字節(jié)單元,高位存SUM+1字節(jié)單元在多字節(jié)累加程序中:將一個(gè)累加器清零,同時(shí)將進(jìn)位標(biāo)志清零!(5)邏輯“非”運(yùn)算NOT(logicalNOT)指令格式及操作:NOTdst ;(dst)←0FFH?(dst)(字節(jié)求反) ;(dst)←0FFFFH?(dst)(字求反)操作數(shù)可以是8位或16位寄存器或存儲(chǔ)器,但不可以是立即數(shù)!NOT AH ;8位寄存器操作數(shù)求反NOT CX ;16位寄存器操作數(shù)求反NOT BYTEPTR[BP] ;8位存儲(chǔ)器操作數(shù)求反NOT WORDPTRCOUNT ;16位存儲(chǔ)器操作數(shù)求反不影響狀態(tài)標(biāo)志位!2)移位指令邏輯左移SHL算術(shù)左移SAL邏輯右移SHR算術(shù)右移SAR移位操作可以一次移動(dòng)移位,也可以一次移動(dòng)多位(必須存放在CL中)(1)邏輯左移/算術(shù)左移指令SHL/SAL(SHiftlogicalLeft/ShiftArithmeticLeft)指令格式: SHLdst,1/SALdst,1 或SHLdst,CL/SALdst,CLCFdst0若移位次數(shù)等于1,且移位以后目的操作數(shù)新的最高位與CF不相等,則OF=1,否則,OF=0;若移位次數(shù)不為1,則OF值不確定。OF表示移位操作是否改變了符號位!SHLAH,1 ;寄存器左移1位SALSI,CL;寄存器左移(CL)位SALWORDPTR[BX+5],1;存儲(chǔ)器左移1位SHLBYTEPTRDATA,CL;存儲(chǔ)器左移(CL)位可以用乘法指令實(shí)現(xiàn)之!但是FACTOR

10=(FACTOR

8)+(FACTOR

2),故可用左移指令實(shí)現(xiàn)以上乘法運(yùn)算將一個(gè)16位無符號數(shù)乘以10。該數(shù)原來存放在以FACTOR為首地址的兩個(gè)連續(xù)的存儲(chǔ)單元中(低位在前,高位在后)。MOV AX,F(xiàn)ACTOR ;(AX)←被乘數(shù)SHL AX,1 ;(AX)=FACTOR

2MOV BX,AX ;暫存BXSHL AX,1 ;(AX)=FACTOR

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論