版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第三章指令系統(tǒng)1第三章指令系統(tǒng)1、指令的概念和結(jié)構(gòu)2、8086/8088的尋址方式3、8086/8088的指令系統(tǒng)21、指令的概念和結(jié)構(gòu)數(shù)字計算機是按照程序規(guī)定的流程工作的,而程序由CPU的指令序列組成。不同類型的CPU,指令系統(tǒng)不同,程序的格式也不同。但計算機的指令、指令系統(tǒng)、程序等基本概念是完全相同的,它們的工作方式和過程也是類似的。指令:一特定的二進制編碼,與時序發(fā)生器配合,控制計算機完成某種操作的命令。指令系統(tǒng):一組唯一的二進制編碼的集合,處理器所能識別的所有指令的集合。31、指令的概念和結(jié)構(gòu)Ex:實驗中第一條指令:MOVAX,0040它完成的功能是將16位立即數(shù)0040(H),送到寄存器AX中。換算成16進制,其指令碼為:B84000(H)
101110000100000000000000(B)這種二進制代碼表示既不易理解,也不易記憶。但卻是微處理器唯一能執(zhí)行的代碼。用指令助記符,上述指令可寫成:這種用助記符表示的指令叫匯編語言指令或符號指令。41、指令的概念和結(jié)構(gòu)8086指令格式51、指令的概念和結(jié)構(gòu)8086指令格式61、指令的概念和結(jié)構(gòu)
標號:指令助記符(操作碼)操作數(shù);注釋
,★指令助記符是指令名稱的代表符號,它是指令語句中的關(guān)鍵字,不可缺省,它表示本指令的操作類型,必要時可在指令助記符的前面加上一個或多個“前綴”,從而實現(xiàn)某些附加操作。★標號是給該指令所在地址取的名字,必須后跟冒號“:”,它可以缺省,是可供選擇的標識符。8086/8088匯編語言中可使用的標識符必須遵循一定的規(guī)則。★操作數(shù)是參加本指令運算的數(shù)據(jù),有些指令不需要操作數(shù),可以缺省;有些指令需要兩個操作數(shù),這時必須用逗號(,)將兩個操作數(shù)分開;有些操作數(shù)可以用表達式來表示。★注釋部分是可選項,允許缺省,如果帶注釋則必須用分號(;)開頭,注釋本身只用來對指令功能加以說明,給閱讀程序帶來方便,匯編程序不對它做任何處理。71、指令的概念和結(jié)構(gòu)操作碼與操作數(shù)指令:做什么?如何做?絕大部分的指令都由操作碼和操作數(shù)兩部分組成操作碼(也稱為指令碼)說明要執(zhí)行的操作,如數(shù)據(jù)傳送,加法、減法、乘法、除法等等。操作數(shù)則指明數(shù)據(jù)的來源,和結(jié)果的去向。操作數(shù)也稱為地址碼
。也可以說,指令由指令碼(命令碼)和地址碼組成。如指令:
MOVAX,0A6D1H;立即數(shù)
MOVAX,[0A6D1H];存儲器地址
MOV[0A6D1H],AX
MOV0A6D1H,AX81、指令的概念和結(jié)構(gòu)指令舉例單字節(jié)指令:NOP:無操作(空操作)90HPUSHAX將AX寄存器內(nèi)容壓入堆棧
50HPUSHDS將段寄存器DS內(nèi)容壓入堆棧
1EH91、指令的概念和結(jié)構(gòu)復雜指令集與精簡指令集處理器指令中地址碼個數(shù)越多,指令的功能越強;地址碼的組合變化方式越豐富,指令系統(tǒng)的功能越強。指令組合變化方式多,每一條指令所完成的工作越多,程序代碼越短。指令條數(shù)和指令的組合變化,均要靠不同的電路組合(微操作電路)的支持,因此導致電路設(shè)計越復雜,對指令的學習、記憶要求高。
8086/8088指令中只能包含一個存儲器地址。精簡指令集(RISC)CPU,使用精心挑選的指令,簡化CPU設(shè)計,提高指令執(zhí)行速度。相對于精簡指令集(RISC)CPU,8086為復雜指令集(CISC)CPU,101、指令的概念和結(jié)構(gòu)復雜指令集與精簡指令集8086/8088CPU稱為復雜指令集(CISC)CPU,它的指令變化方法較多,導致指令數(shù)量多。8086/8088CPU指令系統(tǒng)采用可變字長的指令格式,最短的指令僅一個字節(jié),最長的指令有六個字節(jié)。11122、8086/8088的尋址方式操作碼與操作數(shù)程序(指令)存放在程序區(qū),由CPU按條讀入并順序執(zhí)行。指令由操作碼和操作數(shù)(地址碼)組成。操作數(shù)就是參與運算或待加工處理的數(shù)據(jù)(保存的地方-地址)。操作數(shù)可存放在下面三個地方的某一處:寄存器,存儲器(包括堆棧),程序區(qū)(代碼區(qū))。立即操作數(shù):指令的組成部分,存放在程序區(qū)。寄存器操作數(shù):存放在CPU內(nèi)部的某個寄存器中。存儲器操作數(shù):存放在存儲器的某個單元中。
132、8086/8088的尋址方式尋址方式確定操作數(shù)存放位置的算法1、指令的操作數(shù)就是參加運算的數(shù)據(jù),立即數(shù)尋址方式。2、指令的操作數(shù)代表一個地址,稱為直接尋址方式。3、指令的操作數(shù)為寄存器中的數(shù),稱為寄存器尋址方式。4、若指令中操作數(shù)是寄存器,而其中的內(nèi)容才是真正的數(shù)據(jù)存儲單元的地址,稱為間接尋址方式。5、若操作數(shù)要經(jīng)過計算,在某個基本地址上加上一個偏移量,稱為變址尋址方式。(基址+變址)有少數(shù)指令只有操作碼,沒有操作數(shù),如WAIT、NOP等指令
142、8086/8088的尋址方式復習:8086/8088的存儲器組織8088/8086微處理器內(nèi)部寄存器和內(nèi)部總線均為16位二進制,地址總線為20位。采用段地址加段內(nèi)偏移地址,組成20位地址,因此可以直接訪問1M存儲器空間。輸入輸出指令只用低16位地址線,可以直接訪問64K外部接口空間。8086/8088程序可分成四個獨立的部分(段):代碼段、數(shù)據(jù)段、堆棧段、擴展(數(shù)據(jù))段。每一段仍為64K。152、8086/8088的尋址方式復習:8086/8088的存儲器組織8086/8088有四個段寄存器:CS、DS、SS和ES。CS稱為代碼段寄存器,它是程序存儲區(qū)的基地址(起始地址)。其中的內(nèi)容一般不可改變。DS稱為數(shù)據(jù)段寄存器,它是保留程序運行時所需要的數(shù)據(jù)和結(jié)果的存儲區(qū)的基地址。SS稱為堆棧段寄存器,特殊存儲器段。ES稱為擴展(數(shù)據(jù))段寄存器,它同樣是保留程序運行時所需要的數(shù)據(jù)和結(jié)果的存儲區(qū)的基地址(與DS類似)。162、8086/8088的尋址方式尋址方式----立即數(shù)尋址數(shù)據(jù)直接出現(xiàn)在指令中,存儲在程序段中(只能為常數(shù))。
MOVAX,1234H指令存儲的地址:CS*10H+IPEx:172、8086/8088的尋址方式尋址方式----直接尋址操作數(shù)地址的16位偏移量在指令中,實際的地址為數(shù)據(jù)段寄存器(DS)左移4位,加上指令中的這16位偏移量。形成數(shù)據(jù)的物理地址。數(shù)據(jù)在數(shù)據(jù)空間內(nèi)。MOVAX,[1000H]182、8086/8088的尋址方式直接尋址與立即數(shù)尋址與立即數(shù)尋址不同的是這里1000H帶括號[],它表示1000H是一個地址(直接尋址)。立即數(shù)尋址沒有括號,1000H為常數(shù)(立即數(shù))。存儲在緊隨指令碼的存儲器單元內(nèi)。數(shù)據(jù)存儲空間不同。假定段寄存器DS=2000H,則操作數(shù)地址為[DS]×10H+1000H=21000H,實際占用系統(tǒng)物理地址為21000H和2100lH兩個字節(jié)的存儲單元。直接尋址是以數(shù)據(jù)段寄存器DS的地址為基址,指令中操作數(shù)的尋址范圍為64K字節(jié)。192、8086/8088的尋址方式尋址方式----寄存器尋址操作數(shù)存放在CPU內(nèi)部的寄存器中。例
MOVCX,AXMOVAH,AL速度快,代碼短202、8086/8088的尋址方式尋址方式----寄存器間接尋址以寄存器中的數(shù)為存儲單元地址,稱為寄存器間接尋址。指令中操作數(shù)地址的16位偏移量可以存放在四個寄存器(SI,DI,BP,BX)之中的某一個。若以SI,DI尋址,這種尋址方式稱變址尋址(IndexAddressing)。若以BX,BP尋址時,稱基址尋址(BasedAddressing)。其中SI、DI、BX尋址時,以DS作為段基地址,BP以SS作為段基地址。212、8086/8088的尋址方式尋址方式----寄存器間接尋址MOVAX,[SI]DS=2100H,SI=1200HMOVAX,[BP]SS=1200H,BP=2100Ex:222、8086/8088的尋址方式尋址方式----寄存器間接尋址
段超越根據(jù)需要,也可以指定其它的段寄存器,作為操作數(shù)的基地址。這種指令稱段超越指令,即SI,DI,BX的內(nèi)容也可以與其它段寄存器的內(nèi)容相加,形成操作數(shù)的地址。例如:
MOVES:[DI],AXMOVDX,DS:[BP]232、8086/8088的尋址方式尋址方式----寄存器尋址
段超越242、8086/8088的尋址方式尋址方式----寄存器相對尋址(變址尋址)數(shù)據(jù)地址由寄存器加上固定的偏移量確定。固定偏移量在程序中指定(常數(shù))。MOVAX,1000H[SI]MOVAX,[SI+1000H]252、8086/8088的尋址方式尋址方式----基址加變址尋址數(shù)據(jù)地址由兩個寄存器的內(nèi)容在加常數(shù)偏移量給出。假定[DS]=1200H[SI]=1400HMOVAX,[BX+SI+l030H]Ex:262、8086/8088的尋址方式尋址方式總結(jié)8088/8086中存儲器采用分段管理。每一段長度為64K。程序永遠以CS為段基地址。操作數(shù),可以存儲在以DS、ES或SS為段基地址的存儲器單元中,也可能在以CS為段基地址的存儲器單元中(與指令碼在一起)。以哪個寄存器進行間址、變址與基址加變址尋址,在8068/8088中有一個基本約定,操作數(shù)在相應的段區(qū)域中。無論何種尋址方式,操作數(shù)只能在某一個段的64K字節(jié)范圍內(nèi)。只要在指令中不特別說明要超越這個約定,則缺省情況就按這個基本約定尋找操作數(shù),這就是所謂的缺省(default)狀態(tài)。為了編程靈活,8068/8088允許改變段寄存器,稱為段超越。表3.4是8088/8086中的基本約定和允許段超越的說明。
272、8086/8088的尋址方式尋址方式總結(jié)282、8086/8088的尋址方式Ex:movax,34hmov34h,axmovax,[34h]movax,[cx]movax,[si+1234h]movax,blmov[di+1234h],axmovax,1234h[si]mov1234h[di],axmovax,23h[si][bx]movax,es:23h[si][bx]movax,es:[bx+si+23h]293、8086/8088的指令系統(tǒng)8086/88微處理器指令分類數(shù)據(jù)傳送類指令(只進行傳送而不改變數(shù)值)數(shù)據(jù)處理類指令:算術(shù)、邏輯字符串操作指令程序控制類指令:轉(zhuǎn)移,調(diào)用,返回,循環(huán)
其他指令:
CPU控制指令:暫停、等待、空操作中斷控制指令:開中斷,關(guān)中斷,中斷返回303、8086/8088的指令系統(tǒng)數(shù)據(jù)傳送類指令傳送類指令可分為:
通用數(shù)據(jù)傳送指令:MOV
交換指令:XCHG;
堆棧操作指令:PUSH,POP
地址傳送指令:LEA,LDS,LES
累加器專用傳送指令:IN,OUT,XLAT
標志寄存器傳送指令:LAHF,SAHF,PUSHF,POPF313、8086/8088的指令系統(tǒng)數(shù)據(jù)傳送類----通用數(shù)據(jù)傳送指令MOV指令格式:MOVDST,SRC指令功能:DST←
(SRC)DST:目的操作數(shù)SRC:源操作數(shù)立即數(shù)向通用寄存器傳送
MOVCL,055H;立即數(shù)055H傳送到8位寄存器CL中
MOVAX,1234H;立即數(shù)1234H傳送到寄存器AX中MOV指令不影響標志寄存器狀態(tài)。Ex:323、8086/8088的指令系統(tǒng)數(shù)據(jù)傳送類----通用數(shù)據(jù)傳送指令MOVEx:立即數(shù)向內(nèi)存單元傳送:MOV[BX],1234H立即數(shù)1234H傳送到段寄存器DS指明的,以BX內(nèi)容為偏移量的存儲器單元中(寄存器間接尋址)。若DS寄存器中的內(nèi)容是1000H,BX=0016H,則指令執(zhí)行完之后存儲單元10016H的內(nèi)容是34H,10017H單元的內(nèi)容為12H。
MOV1234H,[BX]333、8086/8088的指令系統(tǒng)通用寄存器之間傳送:MOVSI,BP;結(jié)果[SI]=[BP](SI中的值與BP中的值相同)(寄存器尋址)。MOVCX,AX;結(jié)果[CX]=[AX]通用寄存器與段寄存器之間傳送:
MOVDS,BX;結(jié)果[DS]=[BX]MOVDX,ES;結(jié)果[DX]=[ES]與段寄存器之間只能進行字傳送,并且程序中不能直接對代碼段寄存器CS賦值。數(shù)據(jù)傳送類----通用數(shù)據(jù)傳送指令MOV343、8086/8088的指令系統(tǒng)段寄存器與內(nèi)存單元之間的傳送:MOVDS,[SI+BX]以SI和BX中內(nèi)容之和為偏移量,DS為段地址,將該字地址中的數(shù)據(jù),傳送到數(shù)據(jù)段寄存器DS?;芳幼冎穼ぶ?。只能進行字傳送。內(nèi)存單元與通用寄存器之間的傳送:
MOVAX,[2000H]以[DS]為段地址,2000H為段內(nèi)偏移地址的內(nèi)存單元中數(shù)據(jù)送AX寄存器。數(shù)據(jù)傳送類----通用數(shù)據(jù)傳送指令MOV353、8086/8088的指令系統(tǒng)36數(shù)據(jù)傳送類----通用數(shù)據(jù)傳送指令MOV小結(jié)使用MOV指令應注意以下幾點:立即數(shù)只能作為源操作數(shù),不能作為目的操作數(shù)。CS只能作為源操作數(shù),不能作為目的操作數(shù)。CPU中的寄存器除IP外都可通過MOV指令訪問。立即數(shù)不能直接傳送到段寄存器,但可通過其它寄存器或堆棧傳送。例:MOVDS,1000H;錯而:MOVAX,1000HPUSH1000HMOVDS,AX;正確POPDSMOVES,AX;正確段寄存器之間不能直接傳送。3、8086/8088的指令系統(tǒng)37數(shù)據(jù)傳送類----通用數(shù)據(jù)傳送指令MOV小結(jié)兩個內(nèi)存單元之間不能直接傳送。這是因為8086的任何一條指令最多只能有一個內(nèi)存操作數(shù)。
MOV[1000H],[2000H];錯
MOVAX,BL;錯,數(shù)據(jù)類型不匹配
MOVAX,[1000H];正確
MOVAL,[1000H];正確
MOVAL,100H;?3、8086/8088的指令系統(tǒng)38數(shù)據(jù)傳送類----XCHG指令指令格式:XCHGOPR1,OPR2指令功能:OPR1←→OPR2本指令將兩個指定的寄存器或寄存器與存儲單元的內(nèi)容相互進行交換??蛇M行8位或16位交換。但段寄存器的內(nèi)容不能交換。XCHGBX,[BP十SI];[SS]*10H+[BP]+[SI]←→[BX]XCHGCX,SI;[SI]←→[CX]XCHGAX,DS:[70H];[AX]←→DS為段地址,偏移量70H單元的內(nèi)容XCHGAX,ES:[70H]該指令不影響標志寄存器3、8086/8088的指令系統(tǒng)39數(shù)據(jù)傳送類----棧操作指令PUSH和POP
堆棧是在內(nèi)存中按照后進先出原則組織的一個專門區(qū)域。它有一個指針SP。有了存儲區(qū)域與堆棧指針就可以組成堆棧。8088/8086中規(guī)定SP始終指向堆棧的頂部。SP的初值,通常在程序開始時,由傳送指令
MOVSP,data來設(shè)定。在程序執(zhí)行過程中一般不再改變。指令格式:PUSH源操作數(shù)/POP目的操作數(shù)指令功能:完成對寄存器的值的保存和恢復操作過程3、8086/8088的指令系統(tǒng)40數(shù)據(jù)傳送類----棧操作指令PUSH和POPEx:指令PUSHAX若執(zhí)行前:執(zhí)行后:
AX=1256HSP=0FFEHSS=2F00HSS=2F00HSP=1000HAX=1256HPUSHAXNOPNOP操作時序:3、8086/8088的指令系統(tǒng)41數(shù)據(jù)傳送類----棧操作指令PUSH和POPPOPDST
彈出指令的操作數(shù)也是16位,執(zhí)行過程與壓入過程正好反,彈出數(shù)據(jù)也分兩步執(zhí)行:先彈出棧頂數(shù)據(jù),再修改堆棧指針,SP+2→SP。PUSHAXPOPBX
把AX數(shù)據(jù)經(jīng)過堆棧操作送到了BX寄存器中,經(jīng)過一次壓入,一次彈出,SP指針不變。
3、8086/8088的指令系統(tǒng)42數(shù)據(jù)傳送類----地址傳送指令(三種)1、傳送有效地址指令LEA(LoadEffectiveAdress);2、有效地址送寄存器,段地址送DS指令
LDS(LoadDSwithPointer);3、有效地址送寄存器,段地址送ES指令
LES(LoadESwithPointer)
三條指令均不影響標志寄存器。
3、8086/8088的指令系統(tǒng)43數(shù)據(jù)傳送類----地址傳送指令LEA
執(zhí)行前BX=1800HSI=20EH,LEABX,[BX+SI+10H]
執(zhí)行指令后
BX=1800H+20EH+10H=1A1EH。它是將BX、SI和指定的偏移量之和的值傳送到目的寄存器中,而不是將它們所對應的存儲單元的內(nèi)容傳送到目的寄存器。
對比movbx,[bx+si+10h],若沒有LEA指令,如何完成相同的工作?3、8086/8088的指令系統(tǒng)44數(shù)據(jù)傳送類----地址傳送指令LDS執(zhí)行前DS=B000H,
LDSSI,[20H]則存放操作數(shù)地址的單元為B0020H、B0022H。假定(B0020H)=0180H,(B0022H)=2000H,則指令執(zhí)行后
SI=0180H,DS=2000H。本指令在將地址傳送到目的寄存器同時,也改變了數(shù)據(jù)段寄存器DS的內(nèi)容。本指令改變了數(shù)據(jù)段在內(nèi)存中的區(qū)域。3、8086/8088的指令系統(tǒng)45數(shù)據(jù)傳送類----地址傳送指令LESLESDI,[BX]若執(zhí)行前DS=C000H,BX=060AH,則存放地址的單元為C060AH、C060CH。假定(C060AH)=06BEH,
(C060CH)=4567H,則指令執(zhí)行后DI=06BEH,ES=4567H。本指令功能與上一條相同,只是段寄存器改為擴展段寄存器ES。
3、8086/8088的指令系統(tǒng)46數(shù)據(jù)傳送類----端口I/O指令I(lǐng)/O端口指令有IN和OUT兩條。INDST,SRCOUTDST,SRC其中:SRC為8位或16位8位口地址可直接在指令中說明(立即數(shù))。16位口地址用DX寄存器,DST為內(nèi)部寄存器(可以是8位,也可以為16位)。該指令訪問的口地址范圍為0000H~FFFFH。兩條指令均不影響標志寄存器指令格式:指令功能:對端口輸入或輸出,過程與MOV指令類似,只是地址范圍不同
3、8086/8088的指令系統(tǒng)47數(shù)據(jù)傳送類----端口I/O指令Ex1:DX=1234H,端口1234H在I/O緩沖器中的內(nèi)容低字節(jié)是73H,高字節(jié)是F4HINAX,DX;結(jié)果AL=73H,AH=F4H。Ex2:INAX,28H;將端口地址為28H,29H的內(nèi)容讀入寄存器AX。Ex3:OUT5,AL;將AL的內(nèi)容輸出到端口5。
OUT100H,AL?Ex4:3、8086/8088的指令系統(tǒng)48數(shù)據(jù)傳送類----查表換碼指令XLAT 指令格式:XLAT指令功能:它可以使累加器中的一個值變換為內(nèi)存表格中的某一個值,一般用來實現(xiàn)編碼制的轉(zhuǎn)換。指令說明:使用換碼指令時,要求BX寄存器指向表的首地址,AL中為表中某一項與表格首地址之間的偏移量,指令執(zhí)行時,會將BX和AL中的值相加,把得到的值作為地址,然后將此地址所對應的單元中的值取到AL中去。XLAT指令就是通過查表方式來完成翻譯功能的,因此,在執(zhí)行該指令之前,必須建立好一張翻譯表,該表的最大容量為256字節(jié)。3、8086/8088的指令系統(tǒng)49數(shù)據(jù)傳送類----查表換碼指令XLAT示例
數(shù)據(jù)段中存放有一張ASCII碼轉(zhuǎn)換表,設(shè)首地址為2000H,現(xiàn)欲查出表中第11個代碼的ASCII碼(設(shè)DS=4000H)303132...394142...4546...42000H+042000H+11‘0’‘1’‘2’‘9’‘A’‘B’‘E’‘F’Ex:3、8086/8088的指令系統(tǒng)50數(shù)據(jù)傳送類----查表換碼指令XLAT示例
可用如下指令實現(xiàn):MOVBX,2000H;(BX)←表首地址MOVAL,0BH;(AL)←序號XALT;查表轉(zhuǎn)換
執(zhí)行后得到:(AL)=42H3、8086/8088的指令系統(tǒng)51數(shù)據(jù)傳送類----標志寄存器傳送指令
標志寄存器傳送指令共有四條。用于標志寄存器FR與AX或堆棧之間進行數(shù)據(jù)傳送:LAHF;AH←(PSWL)(
FR低8位)SAHF;PSWL←AHPUSHF;16位標志寄存器壓入堆棧POPF;16位數(shù)據(jù)從堆棧彈出到標志寄存器用于對標志寄存器修改與保護。標志寄存器中只有CF、DF和IF三個標志有專門的指令可修改其狀態(tài)。CLI←→STICLD←→STDCLC←→STC3、8086/8088的指令系統(tǒng)52算術(shù)運算類指令
8086/8088有五種算術(shù)運算指令:加法指令:ADD,ADC,INC。減法指令:SUB,SBB,DEC,NEG。乘法指令:MUL,IMUL,AAM。除法指令:DIV,IDIV,AAD,CBW,CWD。
BCD碼調(diào)整指令:AAA,DAA,AAS,DAS。3、8086/8088的指令系統(tǒng)53算術(shù)運算類指令----加法指令
1)不帶進位位加法指令格式:ADDDST,SRC
指令功能:DST←
(DST)+(SRC)2)帶進位位加法指令格式:ADCDST,SRC
指令功能:DST←
(DST)+(SRC)+CF3)加1
指令格式:INCOPR
指令功能:OPR←
(OPR)+1上述指令中:SRC可為寄存器、內(nèi)存單元、或常數(shù)。DST,OPR可為寄存器,內(nèi)存單元等。指令可影響標志位:SF,ZF,AF,PF,CF,OF。其中加1指令不影響CF,而影響其它5個標志。3、8086/8088的指令系統(tǒng)54算術(shù)運算類指令----減法指令
1)不帶借位位減法指令格式:SUBDST,SRC
指令功能:DST←(DST)-
(SRC)2)帶借位位減法指令格式:SBBDST,SRC
指令功能:DST←(DST)-
(SRC)-CF3)減1
指令格式:DECOPR
指令功能:OPR←
(OPR)-1影響的標志位與加法同3、8086/8088的指令系統(tǒng)55算術(shù)運算類指令----減法指令
4)取補指令格式:NEGOPR
指令功能:OPR←
-(OPR)+15)比較指令格式:CMPOPR1,OPR2
指令功能:OPR1–OPR2,執(zhí)行過程同減法,但結(jié)果不保留,僅改變標志位。指令可影響的標志位:SF,ZF,AF,PF,CF,OF。其中減1指令不影響CF,而影響其它5個標志。
3、8086/8088的指令系統(tǒng)56無符號數(shù)運算舉例
例1:假定AX=7EC0H,BX=5368HADDAX,BX;結(jié)果AX=D228H例2:假定AL=7CH,BL=55HSUBAL,BL;結(jié)果AL=27H例3:假定AX=7EC0H,BX=A368HADDAX,BX;AX=2228H,結(jié)果錯例4:假定AL=65H,BL=0AAHSUBAL,BL;AL=0BBH。結(jié)果錯。3、8086/8088的指令系統(tǒng)57有符號數(shù)運算舉例
例1假定AX=2753H,BX=4A80HADDAX,BX;AX=71D3H例2假定AX=275AH,BX=5A80HSUBAX,BX;AX=0CCDAH小數(shù)減大數(shù)結(jié)果為負,正確例3假定AX=7EC0H,BX=7A00HADDAX,BX;AX=F8C0H結(jié)果為負數(shù),錯例4假定AL=97H,BL=5AHSUBAL,BL;A=3DH負數(shù)減正數(shù),結(jié)果為正數(shù),錯3、8086/8088的指令系統(tǒng)58溢出及判斷
(正數(shù)-
負數(shù))得出負數(shù)(正溢出)(負數(shù)-正數(shù))得出正數(shù)(負溢出)(正數(shù)+正數(shù))得到負數(shù)(下溢出)(負數(shù)+負數(shù))得到正數(shù)(負溢出)CPU根據(jù)運算結(jié)果,自動對溢出標志OF置位。實際上,在8位運算時,微處理器是根據(jù)次高位向最高位C7的進(借)位Cy6與最高位C7向進(借)位位CF的進位Cy7的模2加(異或)來置OF的。而在16位數(shù)運算時,用的是Cy14和Cy15。即:
OF=Cy7⊕Cy6
或OF=Cy15⊕Cy143、8086/8088的指令系統(tǒng)59算術(shù)運算類指令----乘法指令
1)無符號數(shù)乘法指令乘法指令指定的一個寄存器為AX(或AL),結(jié)果在DX:AX或AX中,另一個數(shù)在指令中指出,其中SRC不能為立即數(shù)。指令格式:MULSRC指令功能:AX←AL*(SRC)(8位乘法)
DX、AX←AX*(SRC)(16位乘法)2)帶符號數(shù)乘法指令指令格式:IMULSRC指令功能:AX←AL*(SRC)
DX、AX←AX*(SRC)該指令只影響標志OF與CF。乘法不會溢出(最高位不會有進位),這里OF與CF與加減法定義的意義不同,表示結(jié)果的位數(shù)。3、8086/8088的指令系統(tǒng)60對MUL,若運算結(jié)果的高半部分為全0,則標志OF=CF=0;否則OF=CF=1,以表示高半部分有結(jié)果(乘積超過8位或16位)。對IMUL,高半部分的每一位及與低半部分的最高位都相同時,OF=CF=0,表示高半部分為符號位擴展;否則OF=CF=1。OF=CF=1:高半部分有數(shù)據(jù)。
算術(shù)運算類指令----乘法指令
3、8086/8088的指令系統(tǒng)61乘法指令舉例
例1設(shè)(AL)=0FBH,(BL)=02H,(AL)為無符號數(shù)252,或帶符號-5(BL)為無符號數(shù)2,帶符號2MULBL;AX=01F6H,CF=OF=1,結(jié)果502。IMULBL;AX=0FFF6H,CF=OF=0,結(jié)果-10。(符號擴展)例2設(shè)(AL)=0B4H,(BL)=11H,(AL)為無符號數(shù)180,帶符號-76(BL)為無符號數(shù)17,帶符號17MULBL;AX=0FAF4H,CF=OF=1。結(jié)果3060。IMULBL;AX=0FAF4H,CF=OF=1。結(jié)果-1292。3、8086/8088的指令系統(tǒng)62算術(shù)運算類指令----除法指令
1)無符號數(shù)除法指令除法指令同樣用DX:AX或AX做被除數(shù),除數(shù)在指令中說明。指令格式:DIVSRC根據(jù)SRC確定字節(jié),還是字。指令功能:AL←(AX)/(SRC),余數(shù)在AH中。AX←(DX)(AX)/(SRC),余數(shù)在DX中。2)帶符號數(shù)除法指令指令格式:IDIVSRC指令功能:AL←(AX)/(SRC),余數(shù)在AH中。AX←(DX)(AX)/(SRC),余數(shù)在DX中。除法對所有標志均沒定義,但若結(jié)果為0或溢出,產(chǎn)生0號中斷。要專門編程序處理。633、8086/8088的指令系統(tǒng)算術(shù)運算類指令----符號擴展指令
3)擴展AL中的符號(ConvertBytetoWord)指令格式:CBW指令功能:(AL)7=1,(AH)=0FFH;(AL)7=0,(AH)=00H。這條指令用在兩個字節(jié)相除之前,產(chǎn)生一個雙倍長度的被除數(shù)。此指令不影響標志位。4)擴展AX中的符號(ConvertWordtoDoubleword)指令格式:CWD指令功能:(AX)15=1,(DX)=0FFFFH;(AX)15=0,(DX)=0000H該指令用在兩個字相除之前.將AX中字的符號擴展至DX中,形成雙倍長度的被除數(shù)。此指令不影響標志位。
643、8086/8088的指令系統(tǒng)算術(shù)運算類指令----BCD碼調(diào)整指令
BCD碼:是一種用二進制編碼的十進制數(shù),包括:
壓縮BCD碼(組合BCD碼):即用一個字節(jié)表示兩位BCD碼;
非壓縮BCD碼(分離BCD碼):即用一個字節(jié)表示一位BCD碼,高四位為零。十進制數(shù)通常采用BCD碼表示。計算機只能用二進制計算,不能直接進行BCD碼運算。十進制調(diào)整指令是為了實現(xiàn)對BCD碼的調(diào)整而設(shè)計。653、8086/8088的指令系統(tǒng)算術(shù)運算類指令----BCD碼調(diào)整指令
例:8+7=15。用組合的BCD碼表示,運算結(jié)果為:
即結(jié)果為0FH。在BCD碼中,只允許0~9這10個數(shù)字出現(xiàn),0FH不代表任何BCD碼,因此要對它進行變化。BCD碼應該是逢10進1,但計算機在這里是逢16進1。因此,可以在個位上補一個6,讓其產(chǎn)生進位,而此進位作為十位數(shù)出現(xiàn)。
結(jié)論:如果一位BCD碼所對應的4位二進制超過9,那就應該補上一個6產(chǎn)生進位來進行調(diào)整。663、8086/8088的指令系統(tǒng)算術(shù)運算類指令----BCD碼調(diào)整指令
9+9=18,用組合BCD碼表示運算過程為:+0000100100001001————-------00010010+0000011000001001————-------00011110錯誤的原因是:計算機在運算時,遇到低四位往高四位產(chǎn)生進位時是按照逢16進1的規(guī)則進行的,但BCD碼要求逢10進1,可見,BCD碼運算時只要產(chǎn)生了進位,就會丟失一個6。因此,在出現(xiàn)進位時要進行調(diào)整。
結(jié)論:對BCD碼進行運算時,只要AF變?yōu)?就要在低6位進行調(diào)整。673、8086/8088的指令系統(tǒng)算術(shù)運算類指令----BCD碼調(diào)整指令
總結(jié):凡是遇上某4位二進制碼對應的BCD碼大于9時,則加6進行調(diào)整;凡是遇上低4位產(chǎn)生了進位時,則加6進行調(diào)整。當對多個字節(jié)進行BCD碼運算時,如果低位字節(jié)往高位字節(jié)產(chǎn)生進位則CF=1,而當一個字節(jié)的低4位往高4位產(chǎn)生進位時,AF=1。十進制調(diào)整指令會根據(jù)CF和AF的值判斷是否進行“加6調(diào)整”,并進行具體的調(diào)整操作。然后,程序再對高位字節(jié)進行運算,再進行十進制調(diào)整。683、8086/8088的指令系統(tǒng)算術(shù)運算類指令----BCD碼調(diào)整指令
BCD碼運算指令主要有以下:壓縮的BCD碼調(diào)整指令:
DAA——
加法十進制調(diào)整指令
DAS——
減法十進制調(diào)整指令非壓縮的BCD碼調(diào)整指令:
AAA——
加法的ASCII調(diào)整指令
AAS——
減法的ASCII調(diào)整指令
AAM——
乘法的ASCII調(diào)整指令
AAD——
除法的ASCII調(diào)整指令共6條,均為隱含尋址方式,隱含的操作數(shù)是AL或AL、AH;不能單獨使用,要緊跟在相應的算術(shù)運算指令之前后;執(zhí)行結(jié)果為壓縮BCD碼或擴展BCD碼表示的十進制數(shù)。693、8086/8088的指令系統(tǒng)算術(shù)運算類指令----壓縮BCD碼調(diào)整指令
十進制加法調(diào)整:指令格式:DAA調(diào)整過程:若(AL∧0FH)>9或(AF)=1則AL←(AL)+6,AF←1。若(AL)>9FH或(CF)=1則AL←(AL)+60H,CF←1。注意:執(zhí)行本指令前,必須先執(zhí)行ADD或ADC指令,將兩個壓縮的BCD碼相加。標志寄存器中的輔助進位位AF的作用703、8086/8088的指令系統(tǒng)算術(shù)運算類指令----壓縮BCD碼調(diào)整指令
十進制加法調(diào)整例:設(shè)AL=66H,BL=66H,均為BCD碼。執(zhí)行DAAAL加66H,得132H。[AL=32H,CF=1]AL中為BCD碼32,BCD碼的100在進位標志CF中,產(chǎn)生3位十進制數(shù)。執(zhí)行ADDAL,BLAL=0CCH,CF=0,AF=0。完整的指令格式:……ADDAL,BLDAA……713、8086/8088的指令系統(tǒng)算術(shù)運算類指令----壓縮BCD碼調(diào)整指令
十進制減法調(diào)整:指令格式:DAS調(diào)整過程:若(AL∧0FH)>9或(AF)=1
則AL←(AL)-6AF←1。若(AL)>9FH或(CF)=1
則AL←(AL)-60HCF←1。注意:執(zhí)行本指令前,必須先執(zhí)行SUB或SBB指令,將兩個壓縮的BCD碼相減。723、8086/8088的指令系統(tǒng)算術(shù)運算類指令----非壓縮BCD碼調(diào)整指令
指令格式:AAA(加法調(diào)整)調(diào)整過程:若(AL∧0FH)>9或(AF)=1則AL←(AL)+6,AH←(AH)+1,并且清除AL的高四位;十進制加法調(diào)整(指令隱含的寄存器為AX):AAA指令對AL高4位不影響。例:設(shè)AX=0005H,BL=09H,順序執(zhí)行指令
ADDAL,BL
;00000101
+0000100100001110,AL=0EH;經(jīng)AAA調(diào)整后,AL=04H,AH=01H,CF=AF=1。AAA733、8086/8088的指令系統(tǒng)算術(shù)運算類指令----非壓縮BCD碼調(diào)整指令
十進制減法調(diào)整:指令格式:AAS調(diào)整過程:
若(AL∧0FH)>9或(AF)=1則AL←(AL)-6,AH←(AH)-1,清除AL高四位;例:AX=0103H,BL=04HSUBAL,BL;AL=0FFHAH=1HAAS;AL=09H,AH=0743、8086/8088的指令系統(tǒng)算術(shù)運算類指令----非壓縮BCD碼調(diào)整指令
十進制乘法調(diào)整:指令格式:AAM調(diào)整過程:(先執(zhí)行MUL指令,并要求AL和BL的高4位為0,結(jié)果在AL。)(AL)/0AH,商在AH,余數(shù)在AL。(十位數(shù)在AH,個位數(shù)在AL)
例:AL=07H,BL=09HMULBL;AX=003FHAAM;AH=06H,AL=03H753、8086/8088的指令系統(tǒng)算術(shù)運算類指令----非壓縮BCD碼調(diào)整指令
十進制除法調(diào)整:指令格式:AAD(除法調(diào)整)調(diào)整過程:與其它十進制調(diào)整指令不同,除法調(diào)整為先執(zhí)行AAD,將AX中的被除數(shù)調(diào)整成二進制數(shù),并存在AL中。調(diào)整前AH、AL高4位均為0例如:AX=0905H,BL=06HAAD;AX=005FHDIVBL;AL=0FHAH=05HMOVDL,AH;保留余數(shù)05HAAM;AX=0105H763、8086/8088的指令系統(tǒng)邏輯運算類指令
邏輯運算的特點是按位運算沒有進位。邏輯變量中,各位之間沒有關(guān)系。邏輯與運算(AND):全“1”得“1”邏輯或運算
(OR):有“1”得“1”邏輯非運算(NOT):單數(shù)運算,“1”變“0”,“0”變“1”邏輯異或運算
(XOR):相同為“0”,不同為“1”測試(TEST)(執(zhí)行與運算,但不送回結(jié)果,只影響標志)
移位(分算術(shù)移位、邏輯移位、左移、右移等)
773、8086/8088的指令系統(tǒng)邏輯運算類指令
標志位CF和OF恒為0,AF未定義,其中邏輯非運算結(jié)果不影響標志寄存器。其它邏輯運算結(jié)果會影響SF、ZF、PF標志。1.
邏輯與運算指令格式:ANDDST,SRC指令功能:DST←(DST)∧(SRC)2.
邏輯或運算指令格式:ORDST,SRC指令功能:DST←(DST)∨(SRC)783、8086/8088的指令系統(tǒng)邏輯運算類指令
3.
邏輯非運算指令格式:NOTOPR指令功能:OPR←()4.
邏輯異或運算指令格式:XORDST,SRC指令功能:DST←(DST)⊕(SRC)5.測試(執(zhí)行與運算,但不送回結(jié)果,只影響標志)指令格式:TESTOPR1,OPR2指令功能:(OPR1)∧(OPR2)793、8086/8088的指令系統(tǒng)邏輯運算類指令
判斷某一位的狀態(tài)?取出某一位的狀態(tài)?改變某一位的狀態(tài)?取一個數(shù)的補碼?803、8086/8088的指令系統(tǒng)邏輯移位指令
移位指令主要由以下兩大類指令組成:循環(huán)移位指令非循環(huán)移位指令算術(shù)左移指令SAL邏輯左移指令SHL算術(shù)右移指令SAR邏輯右移指令SHR不帶進位的循環(huán)左移指令ROL不帶進位的循環(huán)右移指令ROR帶進位的循環(huán)左移指令RCL帶進位的循環(huán)右移指令RCR813、8086/8088的指令系統(tǒng)邏輯移位指令
算術(shù)左移指令SAL指令格式:SALOPR,CNT指令功能:OPR可以是除立即數(shù)以外的任何尋址方式。移位次數(shù)由CNT決定,CNT可以是1或CL。注意如移位次數(shù)大于1,則可在該指令之前把移位次數(shù)置于CL寄存器中。高
低CF0邏輯左移指令SHL指令格式:SHLOPR,CNT;與SAL指令功能完全相同說明:(1)SHL指令和SAL指令功能相同,可實現(xiàn)有符號數(shù)和無符號數(shù)乘2,如果左移后,最高位和CF不同,則溢出標志OF為1。(2)根據(jù)OF的值判斷左移操作是否造成了溢出。823、8086/8088的指令系統(tǒng)邏輯移位指令
算術(shù)右移指令SAR邏輯右移指令SHR指令格式:SAROPR,CNT指令功能:高
低CF說明:右移時,最高位保持不變。用途:用于帶符號數(shù)除2。指令格式:SHROPR,CNT指令功能:高
低CF0說明:邏輯右移時,最高位補零。用途:用于無符號數(shù)除2。833、8086/8088的指令系統(tǒng)邏輯移位指令
不帶進位的循環(huán)左移指令ROL指令格式:ROLOPR,CNT指令功能:高
低CF不帶進位的循環(huán)右移指令ROR指令格式:ROROPR,CNT指令功能:高
低CF843、8086/8088的指令系統(tǒng)邏輯移位指令
帶進位的循環(huán)左移指令RCL帶進位的循環(huán)右移指令RCR指令格式:RCLOPR,CNT指令功能:高
低CF指令格式:RCROPR,CNT指令功能:高
低CF853、8086/8088的指令系統(tǒng)邏輯移位指令
所有移位指令影響標志位:CF,OF,PF,SF,ZF,無AF。如果要移動若干位,則必須在CL中指出移動位數(shù),若移動一位,可在指令中直接給出??蓪ψ止?jié)或字操作,操作數(shù)可以是寄存器或內(nèi)存單元。說明:863、8086/8088的指令系統(tǒng)字符串操作指令
串操作指令就是用一條指令實現(xiàn)對一串字符或數(shù)據(jù)的操作。主要由以下幾種指令組成:字符串傳送指令:MOVSB/MOVSW字符串比較指令:CMPSB/CMPSW字符串檢索指令:SCASB/SCASW取字符串指令:LODSB/LODSW存字符串指令:STOSB/STOSW873、8086/8088的指令系統(tǒng)字符串操作指令說明
針對數(shù)據(jù)塊或字符串的操作可實現(xiàn)存儲器到存儲器的數(shù)據(jù)傳送,是唯一的一組能直接處理源和目的操作數(shù)都在存儲單元的指令待操作的數(shù)據(jù)串稱為源串,源串一般存放在數(shù)據(jù)段,偏移地址由SI指定。目標地址稱為目標串,必須在附加段,偏移地址由DI指定指令自動修改地址指針,修改方向由DF決定。DF=0為增地址方向;DF=1為減地址方向,數(shù)據(jù)塊長度值由CX指定,可增加自動重復前綴以實現(xiàn)自動修改CX內(nèi)容883、8086/8088的指令系統(tǒng)字符串操作指令—重復前綴
REP無條件重復REPE相等重復REPZ為零重復REPNE不相等重復REPNZ不為零重復條件重復CX≠0ZF=1CX≠0ZF=0CX≠0重復任何一個串操作指令,都可以在其前面加上一個重復執(zhí)行前綴(REP),于是指令就重復執(zhí)行。重復執(zhí)行次數(shù)在寄存器CX中規(guī)定。直到[CX]=0結(jié)束。893、8086/8088的指令系統(tǒng)字符串操作指令
字符串傳送MOVSB/MOVSW指令格式:MOVSDST,SRC指令功能:把DS段由SI指出的字節(jié)或字傳送到ES段由DI指出存儲單元中,并修改SI和DI地址指針,加還是減取決于DF標志。用CLD指令將DF清零,地址指針自動加,增址;用STD指令將DF置1,地址指針自動減,減址MOVSB完成字節(jié)操作,MOVSW完成字操作,通常指令前面加重復前綴REP,數(shù)據(jù)串長度送CX寄存器。903、8086/8088的指令系統(tǒng)字符串傳送舉例:
編寫程序?qū)崿F(xiàn):將BUFFER1中的17個數(shù)傳送到BUFFER2中去。LEASI,BUFFER1LEADI,BUFFER2MOVCX,17CLDREPMOVSBLEASI,BUFFER1LEADI,BUFFER2MOVCX,17CLDAGAIN:
MOVSBDECCXJNZAGAINLEASI,BUFFER1LEADI,BUFFER2MOVCX,17AGAIN:MOVAL,[SI]MOV[DI],ALINCSIINCDI
DECCXJNZAGAINREP執(zhí)行的操作:1)如(CX)=0則退出REP,否則往下執(zhí)行.2)(CX)=(CX)-13)執(zhí)行其后的串指令4)重復1)~~3)913、8086/8088的指令系統(tǒng)字符串操作指令
字符串比較CMPSB/CMPSW指令格式:CMPSDST,SRC指令功能:把DS段由SI指出的字節(jié)或字和ES段由DI指出的字或字節(jié)相比較,并比較后修改SI和DI地址指針。指令影響標志位。若指令加上前綴REPE或REPZ,則操作可解釋為:“當串未結(jié)束(CX≠0),且串是相等的(ZF=1),繼續(xù)比較”。若指令前加上前REPNE或REPNZ,則表示“當串未結(jié)束(CX≠0),且串不等于搜索值(ZF≠0)時,繼續(xù)搜索”此指令可用來檢查兩個字符串(或數(shù)據(jù)塊)是否相等,或?qū)ふ覂蓚€字符串中第一個不相同的字符,或?qū)ふ覂蓚€字符串中第一個相同的字符等。923、8086/8088的指令系統(tǒng)字符串比較舉例:
比較兩個字符串是否相等,并找出其中第一個不相等字符的首地址,將該地址送到BX中,不相等字符送到AL中。設(shè)MEM1為源串首地址,MEN2為目的串首地址,兩個字串長度均為200。LEASI,MEM1LEADI,MEM2MOVCX,200CLDREPECMPSBTESTCX,00FFHJZSTOPDECSIMOVAL,[SI]MOVBX,SISTOP:HLT933、8086/8088的指令系統(tǒng)字符串操作指令
字符串搜索SCASB/SCASW指令格式:SCASDST,SRC指令功能:實現(xiàn)在內(nèi)存的某一字符串中尋找指定字符(關(guān)鍵字)。要尋找的關(guān)鍵字在AL或AX中。若指令前加上前綴REPE或REPZ,則表示“當串未結(jié)束(CX≠0),且串元素等于搜索值(ZF=1)時,繼續(xù)搜索”。若指令前加上前REPNE或REPNZ,則表示“當串未結(jié)束(CX≠0),且串不等于搜索值(ZF≠0)時,繼續(xù)搜索”。該指令執(zhí)行AL(字節(jié))或AX(字)的與由DI作為地址指針的串中某數(shù)比較,不改變目的串元素及AX(AL)的值,僅改變標志位。串指針DI的值同時修改,是增量修改還是減量修改,決定于DF標志。943、8086/8088的指令系統(tǒng)字符串操作指令
取字符串LODSB/LODSW指令格式:LODSDST,SRC指令功能:該指令將存儲單元的內(nèi)容裝入到AL或AX中。即把由SI作為地址指針的串元素,裝入到AL(字節(jié))或AX(字)中去,同時修改SI,指向下一個串元素。該指令一般不使用重復前綴,因為每重復一次,累加器的內(nèi)容都要改寫,因此,只保留了最后一次的數(shù)據(jù)。該指令在循環(huán)程序中,往往是很有用的。例如要統(tǒng)計一個數(shù)據(jù)塊中有多少個正數(shù),負數(shù)或0,非壓縮BCD碼改為ASCII碼,統(tǒng)計字符串中大寫字母個數(shù)等。953、8086/8088的指令系統(tǒng)字符串操作指令
存字符串STOSB/STOSW指令格式:STOSDST,SRC指令功能:該指令將AL(8位數(shù))或AX(16位數(shù))寄存器的內(nèi)容存入到由DI尋址的存儲器單元中。DI指針的增減取決于DF標志位。利用重復操作,可以在內(nèi)存中填充一串相同的字符或數(shù)據(jù)。
963、8086/8088的指令系統(tǒng)程序控制類指令
主要由以下幾種指令組成:子程序調(diào)用和返回指令無條件轉(zhuǎn)移和條件轉(zhuǎn)移指令循環(huán)控制指令973、8086/8088的指令系統(tǒng)程序控制類指令----子程序調(diào)用和返回指令
子程序結(jié)構(gòu)相當于高級語言中的過程。為了方便模塊化程序設(shè)計,往往把程序中某些具有獨立功能的部分編寫成獨立的程序模塊,稱之為程序。子程序調(diào)用和返回指令都不影響標志位。調(diào)用指令(CALL);返回指令(RET);983、8086/8088的指令系統(tǒng)程序控制類指令----子程序調(diào)用和返回指令
將調(diào)用指令的下一條指令的地址(斷點)壓入堆棧獲取子過程的入口地址(子過程第1條指令的偏移地址)(執(zhí)行子過程,含相應參數(shù)的保存及恢復)將斷點偏移地址由堆棧彈出,返回原程序段內(nèi)直接調(diào)用指令、段內(nèi)間接調(diào)用指令、段間直接調(diào)用指令、段間間接調(diào)用指令。子程序調(diào)用過程:該類指令提供了:993、8086/8088的指令系統(tǒng)程序控制類指令----子程序調(diào)用和返回指令
1、段內(nèi)直接調(diào)用指令例:
CALL1000H;段內(nèi)直接調(diào)用,調(diào)用地址在指令中給出子過程與原調(diào)用程序在同一代碼段,在調(diào)用之前只需保護斷點的偏移地址指令格式:CALLDST;指令功能:(SP)(SP)-2,((SP)-2,(SP)-1)(IP)(IP)(IP)+16位偏移量1003、8086/8088的指令系統(tǒng)程序控制類指令----子程序調(diào)用和返回指令
2、段內(nèi)間接調(diào)用指令例:
CALLAX;段內(nèi)間接調(diào)用,調(diào)用地址由AX給出。(IP)(AX)子過程與原調(diào)用程序在同一代碼段,在調(diào)用之前只需保護斷點的偏移地址指令格式:CALLDST;指令功能:(SP)(SP)-2,((SP)-2,(SP)-1)(IP)(IP)(EA)1013、8086/8088的指令系統(tǒng)程序控制類指令----子程序調(diào)用和返回指令
3、段間直接調(diào)用指令指令格式:CALLDST;指令功能:(SP)(SP)-2,((SP)-2,(SP)-1)(CS)段地址(SP)(SP)-2,((SP)-2,(SP)-1)(IP)偏移地址例:
CALL2500:3600;段間直接調(diào)用,調(diào)用段地址和偏移量在指令中給出子過程與原調(diào)用程序不在同一代碼段,在調(diào)用之前需保護斷點的段基地址和偏移地址。先將斷點的CS壓棧,再壓入IP1023、8086/8088的指令系統(tǒng)程序控制類指令----子程序調(diào)用和返回指令
4、段間間接調(diào)用指令指令格式:CALLDST;指令功能:
(SP)(SP)-2,((SP)-2,(SP)-1)(CS)(SP)(SP)-2,((SP)-2,(SP)-1)(IP)(IP)(EA)尋址方式確定的有效地址
(CS)(EA+2)例:
CALLDWORDPTR[DI];段間間接調(diào)用,指令給出調(diào)用段地址和偏移量的存放地址1033、8086/8088的指令系統(tǒng)程序控制類指令----子程序調(diào)用示例
設(shè)(DS)=6000H,(SI)=0560H,指令
CALLDWORDPTR[DI]
的操作示意圖IPCS代碼段數(shù)據(jù)段60560HXXHXXHXXHCALL┇┇┇┇XXH1043、8086/8088的指令系統(tǒng)程序控制類指令----子程序返回指令
指令格式:
RET
指令功能:返回指令RET作為子程序的最后一條指令用來返回高一層的程序。執(zhí)行時,會從堆棧頂部彈出返回地址出棧送IP寄存器(段內(nèi)或段間)和CS寄存器(段間)。8086指令系統(tǒng)中,段內(nèi)返回指令和段間返回指令形式是一樣的。不影響標志位。(IP)((SP)+1,(SP))(SP)(SP)+21053、8086/8088的指令系統(tǒng)程序控制類指令----子程序返回指令
指令格式:
RET
EXP
指令功能:(IP)((SP)+1,(SP))(SP)(SP)+2(SP)(SP)+D16EXP是一個表達式,根據(jù)它的值計算出常數(shù)為指令中的位移量n。n可以表示為0~FFFFH范圍中的任何一個偶數(shù)。應用范圍:主程序為某個子程序提供一定的參數(shù)或參數(shù)地址,在進入子程序之前,主程序?qū)⑦@些參數(shù)或參數(shù)的地址壓入堆棧中,通過堆棧供子程序調(diào)用,子程序使用后,這些參數(shù)已無使用價值,堆棧中不需要保存這些參數(shù),因而在返回指令RET中提供參數(shù)n在返回同時堆棧指針自動增加幾個字節(jié),以去掉堆棧中的幾個字節(jié)。1063、8086/8088的指令系統(tǒng)程序控制類指令----轉(zhuǎn)移指令
無條件轉(zhuǎn)移指令無條件轉(zhuǎn)移到目標地址,執(zhí)行新的指令條件轉(zhuǎn)移指令在具備一定條件的情況下轉(zhuǎn)移到目標地址通過修改指令的偏移地址或段地址及偏移地址實現(xiàn)程序的轉(zhuǎn)移1073、8086/8088的指令系統(tǒng)程序控制類指令----無條件轉(zhuǎn)移指令
指令功能:無條件轉(zhuǎn)移指令可以轉(zhuǎn)移到內(nèi)存中存放的任何程序段。指令必須指定轉(zhuǎn)移的目標地址(或稱轉(zhuǎn)移地址)。無條件轉(zhuǎn)移指令不影響標志位。指令分類:段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移。段內(nèi)轉(zhuǎn)移只須改變IP寄存器的內(nèi)容,用新的轉(zhuǎn)移目標地址代替原有的IP的值就可以。段間則轉(zhuǎn)到另一段去執(zhí)行程序,因此,不僅要修改IP寄存器的內(nèi)容,而且還要修改CS寄存器的內(nèi)容。1083、8086/8088的指令系統(tǒng)程序控制類指令----無條件轉(zhuǎn)移指令
指令格式:
JMPLABEL段內(nèi)直接短轉(zhuǎn)移:
格式:JMPSHORTOPR;
功能:(IP)(IP)+8位移量;8位移量是一個帶符號數(shù),轉(zhuǎn)移范圍在–128--+127
例:JMPSHORT10H;轉(zhuǎn)移地址偏移量在指令中給出(2)段內(nèi)直接近轉(zhuǎn)移:
格式:JMPNEARPTROPR
功能:(IP)(IP)+16位移量;16位移量是一個帶符號數(shù),轉(zhuǎn)移范圍在段內(nèi)任意位置例:JMP1000H;段內(nèi)直接轉(zhuǎn)移,轉(zhuǎn)移地址偏移量在指令中給出1093、8086/8088的指令系統(tǒng)程序控制類指令----無條件轉(zhuǎn)移指令
(3)段內(nèi)間接轉(zhuǎn)移:
格式:JMPWORDPTROPR;
功能:(IP)(EA);EA值由OPR的尋址方式確定。它可以使用除立即數(shù)以外的任一種尋址方式。例:JMPCX;段內(nèi)間接轉(zhuǎn)移,轉(zhuǎn)移地址偏移量由CX給出
(4)段間直接(遠)轉(zhuǎn)移:
格式:JMPFARPTROPR;
功能:(IP)OPR的段內(nèi)偏移地址;(CS)OPR所在段的段地址例:JMP2000:0100H;段間直接轉(zhuǎn)移,轉(zhuǎn)移段地址和偏移量在指令中給出1103、8086/8088的指令系統(tǒng)程序控制類指令----無條件轉(zhuǎn)移指令
(5)段間間接轉(zhuǎn)移:格式:JMPDWORDPTROPR;
功能:(IP)(EA)(CS)(EA+2)EA值由OPR的尋址方式確定。它可以使用除立即數(shù)以外的任一種尋址方式。例:JMPDWORDPTR[SI]段間間接轉(zhuǎn)移,轉(zhuǎn)移地址
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度生物顆粒生物質(zhì)顆粒燃料生產(chǎn)與銷售合同3篇
- 2025年度住宅小區(qū)綠化帶開荒保潔與景觀維護合同3篇
- 二零二五年度影視制作與影視制作技術(shù)支持合同3篇
- 2025年度太陽能光伏組件安裝及售后保障服務合同
- 2025年度一手房買賣中介合同版(特色小鎮(zhèn))3篇
- 2025年度文化演出活動組織委托書合同范文
- 2024版公司委任獨立董事合同
- 二零二五年度國際石油期貨交易合同2篇
- 二零二五年度國際電信設(shè)備采購合同(含技術(shù)支持與服務)3篇
- 二零二五年度個人珠寶首飾設(shè)計質(zhì)押借款合同3篇
- 角的概念推廣說課課件.
- 壓密注漿施工工藝
- 2019-2020學年江蘇省徐州市九年級(上)期末英語試卷(解析版)
- 蘇教版八年級下《二次根式》單元測試卷(含答案)
- 履帶吊驗收表
- AAEM的應用機理
- 2018-2019學年第一學期西城小學三年級數(shù)學期末試題
- GB-T-12137-2015-氣瓶氣密性試驗方法
- 學生學習挑戰(zhàn)書
- 煙葉種植及加工項目可行性研究報告寫作范文
- 員工知識產(chǎn)權(quán)歸屬協(xié)議
評論
0/150
提交評論