![第3章-8088指令系統(tǒng)_第1頁](http://file4.renrendoc.com/view/eab587b176fba329331d6ccea198b839/eab587b176fba329331d6ccea198b8391.gif)
![第3章-8088指令系統(tǒng)_第2頁](http://file4.renrendoc.com/view/eab587b176fba329331d6ccea198b839/eab587b176fba329331d6ccea198b8392.gif)
![第3章-8088指令系統(tǒng)_第3頁](http://file4.renrendoc.com/view/eab587b176fba329331d6ccea198b839/eab587b176fba329331d6ccea198b8393.gif)
![第3章-8088指令系統(tǒng)_第4頁](http://file4.renrendoc.com/view/eab587b176fba329331d6ccea198b839/eab587b176fba329331d6ccea198b8394.gif)
![第3章-8088指令系統(tǒng)_第5頁](http://file4.renrendoc.com/view/eab587b176fba329331d6ccea198b839/eab587b176fba329331d6ccea198b8395.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第三章8088指令系統(tǒng)§3.18088的尋址方式§3.28088的指令系統(tǒng)§3.3匯編語言與匯編程序§3.4匯編語言程序舉例習(xí)題§3-18088的尋址方式一、說明操作數(shù)所在地址的尋址方式1.立即尋址這種尋址方式所提供的操作數(shù)直接包含在指令中。它緊跟在操作碼的后面,與操作碼一起放在代碼段區(qū)域中。如圖3-1所示。例:MOVAX,im圖3-1立即尋址示意圖立即數(shù)im可以是8位的,也可以是16位的。若是16位的,則imL在低地址字節(jié),imH在高地址字節(jié)。若是字操作數(shù),而且它的高位字節(jié)是由低位字節(jié)符號(hào)擴(kuò)展的,則
在指令中的立即數(shù)只有低位字節(jié)。立即尋址主要是用來給寄存器或存貯器賦初值。2.直接尋址操作數(shù)地址的16位段內(nèi)偏移地址直接包含在指令中,它與操作碼一起存放在代碼段區(qū)域。操作數(shù)一般在數(shù)據(jù)段區(qū)域中,它的地址為數(shù)據(jù)段寄存器DS加上這16位的段內(nèi)偏移地址。如圖3-2所示。例:MOVAX,DS:[2000H]
指令中的16位段內(nèi)偏移地址的低字節(jié)在前,高字節(jié)在后。這種尋址方法是以數(shù)據(jù)段的段地址為基礎(chǔ),故可在多達(dá)64k字節(jié)的范圍內(nèi)尋找操作數(shù)。圖3-2直接尋址示意圖3.寄存器尋址操作數(shù)包含在CPU的內(nèi)部寄存器中,例如AX、BX、CX、DX等,如圖3-3所示。例:MOVDS,AX
雖然操作數(shù)可存放在CPU內(nèi)部任意一個(gè)通用寄存器中,而且它們都能參與算術(shù)或邏輯運(yùn)算并存放運(yùn)算結(jié)果,但是,AX是累加器,若結(jié)果存放在AX的話,通常指令執(zhí)行時(shí)間要短一些。圖3-3寄存器尋址方式示意圖4.寄存器間接尋址在這種尋址方式中,操作數(shù)存放在存貯器中。但是,操作數(shù)的16位段內(nèi)偏移地址卻放在以下四個(gè)寄存器SI、DI、BP、BX之一中。由于上述四個(gè)寄存器所默認(rèn)的段寄存器不同,這樣又可以分成兩種情況:①若以SI、DI、BX進(jìn)行間接尋址,則操作數(shù)通常存放在現(xiàn)行數(shù)據(jù)段中,數(shù)據(jù)段寄存器內(nèi)容加上SI、DI、BX中的16位段內(nèi)偏移地址,即為操作數(shù)的地址。如圖3-4所示。例:MOVAX,[SI]圖3-4寄存器間接尋址示意圖②若以寄存器BP間接尋址,則操作數(shù)存放在堆棧段區(qū)域中,即堆棧段寄存器內(nèi)容加上BP中的16位段內(nèi)偏移地址,即為操作數(shù)的地址,如圖3-5所示。例:MOVAX,[BP]
若在指令中規(guī)定是段超越的,則BP也可以與其它的段寄存器內(nèi)容相加,形成操作數(shù)的地址。圖3-5以BP作為間接尋址示意圖5.寄存器相對(duì)尋址在這種尋址方式中,操作數(shù)存放在存貯器中,操作數(shù)的地址是由段寄存器內(nèi)容加崐上SI、DI、BX、BP之一的內(nèi)容再加上由指令中所指出的8位或16位相對(duì)地址偏移量得到的。如圖3-6所示。圖3-6寄存器相對(duì)尋址示意圖6.基址、變址尋址在8088中,通常把BX和BP作為基址寄存器,而把SI、DI作為變址寄存器。將這兩種寄存器聯(lián)合起來進(jìn)行尋址就稱為基址、變址尋址。這時(shí),操作數(shù)的地址應(yīng)該是段寄存器內(nèi)容加上基址寄存器內(nèi)容[BF](BX或BP內(nèi)容)再加上變址寄存器內(nèi)容(SI或DI內(nèi)容)得到的,如圖3-7所示。同理,若用BX作為基地址,則操作數(shù)應(yīng)放在數(shù)據(jù)段DS區(qū)域中;若用BP作為基地址,則操作數(shù)應(yīng)放在堆棧段SS區(qū)域中。例:MOVAX,[BX][SI]圖3-7基址、變址尋址示意圖7.基址、變址、相對(duì)尋址這種方式實(shí)際上是第6種尋址方式的擴(kuò)充。即操作數(shù)的地址是由基址、變址方式得到的地址再加上由指令指明的8位或16位的相對(duì)偏移地址而得到。如圖3-8所示。例:MOVAX,DISP[BX][SI]圖3-8基址、變址、相對(duì)尋址示意圖8.隱含尋址在有些指令的指令碼中,不僅僅有操作碼信息,而且還隱含了操作數(shù)地址的信息。例如乘法指令MUL的指令碼中只需指明一個(gè)乘數(shù)的地址,另一個(gè)乘數(shù)和積的地址是隱含固定的。二、說明轉(zhuǎn)移地址的尋址方法1.段內(nèi)相對(duì)尋址在這種尋址方式中,指令應(yīng)指明一個(gè)8位或16位的相對(duì)地址偏移量DISP(它有正負(fù)符號(hào),用補(bǔ)碼表示)。那么轉(zhuǎn)移地址應(yīng)該是代碼段寄存器CS內(nèi)容加上指令指針I(yè)P內(nèi)容再加上相對(duì)地址偏移量DISP三者的和,如圖3-9所示。例:JMPDISP1圖3-9段內(nèi)相對(duì)尋址示意圖2.段間直接尋址在這種尋址方式中,指令碼中將直接給出16位的段地址和16位的段內(nèi)偏移地址。例:JMPFARPTRADD1
在執(zhí)行這條段間直接尋址指令時(shí),指令操作碼后的第二個(gè)字將賦于代碼段寄存器CS,第一個(gè)字將賦于指令指針寄存器IP。最后CS內(nèi)容和IP內(nèi)容相加則就是轉(zhuǎn)移地址,如圖3-10所示。圖3-10段間直接尋址示意圖3.段內(nèi)間接尋址在這種尋址方式中,轉(zhuǎn)移地址的段內(nèi)偏移地址要么存放在一個(gè)16位的寄存器中;要么存放在存貯器的兩個(gè)相鄰單元中。存放偏移地址的寄存器和存貯器的地址將按指令碼中規(guī)定的尋址操作數(shù)的方法給出。此時(shí),尋址所得到的不是操作數(shù),而是轉(zhuǎn)移地址,如圖3-11所示。例:JMPCX
JMPWORDPTR圖3-11段內(nèi)間接尋址示意圖4.段間間接尋址這種尋址方式和段內(nèi)間接尋址相似,但是由于轉(zhuǎn)移地址的確定需要32位信息,因此只適用于存貯器尋址方式。用這種尋址方式可計(jì)算出存放轉(zhuǎn)移地址的存貯單元首地址,與此相鄰的4個(gè)單元中,前兩個(gè)單元存放16位的段內(nèi)偏移地址;而后兩單元存放的是16位的段地址,如圖3-12所示。
例:JMPDWORDPTR[BP][DI]
圖3-12段間間接尋址示意圖§3-28088的指令系統(tǒng)8088的指令系統(tǒng)大致可以分成以下的六種類型:①數(shù)據(jù)傳送指令;②算術(shù)運(yùn)算指令;③邏輯運(yùn)算指令;④串操作指令;⑤程序控制指令;⑥處理器控制指令。一、數(shù)據(jù)傳送指令1.MOVOPRD1,OPRD2MOV是操作碼,OPRD1和OPRD2分別是目的操作數(shù)和源操作數(shù)。該指令可把一個(gè)字節(jié)或一個(gè)字操作數(shù)從源地址傳送到目的地址。源操作數(shù)可以是累加器、寄存器、存貯器以及立即操作數(shù),而目的操作數(shù)可以是累加器、寄存器和存貯器。數(shù)據(jù)傳送方向的示意圖,如圖3-13所示。圖3-13數(shù)據(jù)傳送方向示意圖各種數(shù)據(jù)傳送指令例舉如下:①在CPU各內(nèi)部寄存器之間傳送數(shù)據(jù)(除代碼段寄存器CS和指令指針I(yè)P以外)。
MOVAL,BL
MOVDL,CH
8位數(shù)據(jù)傳送指令(1個(gè)字節(jié))MOVAX,DXMOVCX,BXMOVDX,BXMOVDX,ESMOVBX,DIMOVSI,BP16位數(shù)據(jù)傳送指令(1個(gè)字)②立即數(shù)傳送至CPU的內(nèi)部通用寄存器(即AX、BX、CX、DX、BP、SP、SI、DI),給這些寄存器賦值。
MOVCL,4;8位數(shù)據(jù)傳送(1個(gè)字節(jié))
MOVAX,03FFH;
MOVSI,057BH;16位數(shù)據(jù)傳送(1個(gè)字)③CPU內(nèi)部寄存器(除了CS和IP以外)與存貯器(所有尋址方式)之間的數(shù)據(jù)傳送,與前述一樣可以傳送一個(gè)字節(jié)也可以傳送一個(gè)字?!PU的通用寄存器與存貯器之間傳送數(shù)據(jù)。
MOVAL,BUFFER
MOVAX,[SI]
MOV[DI],CXMOVSI,BLOCK[BP]·CPU寄存器與存貯器之間傳送數(shù)據(jù)。
MOVDS,DATA[SI+BX]MOVDEST[BP+DI],ES需要注意的是,MOV指令不能進(jìn)行兩個(gè)存貯器單元之間的數(shù)據(jù)直接傳送。為了實(shí)現(xiàn)存貯器單元之間的數(shù)據(jù)傳送,必須通過內(nèi)部寄存器作為中介。例如,為了將在同一個(gè)段內(nèi)的偏移地址為AREA1的數(shù)據(jù)傳送到偏移地址為AREA2單元中去,就需要執(zhí)行以下二條傳送指令:
MOVAL,AREA1MOVAREA2,AL如果要求將內(nèi)存中一個(gè)數(shù)據(jù)塊搬移到另一個(gè)內(nèi)存數(shù)據(jù)區(qū)中去時(shí),例如要將以AREA1為首地址的100個(gè)字節(jié)數(shù)據(jù)搬移到以AREA2為首地址的內(nèi)存中去。同樣可以用帶有循環(huán)控制的數(shù)據(jù)傳送程序來實(shí)現(xiàn)。為此采用間接尋址方法,用SI存放源數(shù)據(jù)地址,DI存放目的數(shù)據(jù)地址,用CX作為循環(huán)計(jì)數(shù)控制單元。其程序如下:
MOVSI,OFFSETAREA1MOVDI,OFFSETAREA2MOVCX,100AGAIN:MOVAL,[SI]MOV[DI],ALINCSIINCDIDECCXJNZAGAIN程序中INC,DEC分別為加1和減1指令;OFFSETAREA1是指地址單元AREA1在段內(nèi)的地址偏移量。在尋址方式介紹中已經(jīng)提到,在8088中,要尋址內(nèi)存中的操作數(shù)時(shí),必須以段地址(放于某個(gè)段寄存器中)加上該單元的段內(nèi)地址偏移量,才能確定內(nèi)存單元的實(shí)際物理地址。2.交換指令
XCHGOPRD1,OPRD2
目的源交換指令把一個(gè)字節(jié)或一個(gè)字的源操作數(shù)與目的操作數(shù)相交換。這種交換能在通用寄存器與累加器之間,通用寄存器之間,通用寄存器與存貯器之間進(jìn)行,但是段寄存器不能作為一個(gè)操作數(shù)。例如:XCHGAL,CLXCHGAX,DIXCHGBX,SIXCHGAX,BUFFERXCHGBX,DATA[SI]3.地址傳送指令8088有三條地址傳送指令:①LEA指令例如:
LEAOPRD1,OPRD2
該指令把源操作數(shù)OPRD2的地址偏移量傳送至目的操作數(shù)OPRD1中。源操作數(shù)必須是一個(gè)內(nèi)存操作數(shù),目的操作數(shù)必須是一個(gè)16位的通用寄存器。這條指令通常用來建立串指令操作所需的寄存器指針。例如:
LEABX,BUFR
它是把變量BUFR的地址偏移量送到BX中。②LDS指令該指令完成一個(gè)地址指針的傳送。地址指針包括段地址和地址偏移量。指令執(zhí)行時(shí),將段地址送入DS,地址偏移量送入一個(gè)16位的指針寄存器或變址寄存器。例如:
LDSSI,[BX]
它把BX所指的32位地址指針的段地址送入DS,偏移地址送入SI。③LES指令這條指令除將地址指針的段地址送入ES外,其它與LDS類似。例如:
LESDI,[BX+CONT]
它把BX+CONT所指的32位地址指針的段地址送入ES,偏移地址送入DI。二、算術(shù)運(yùn)算指令8088可提供加、減、乘、除四種基本算術(shù)運(yùn)算的操作指令。這些指令可實(shí)現(xiàn)字節(jié)或字的運(yùn)算,也可以用于符號(hào)數(shù)和無符號(hào)數(shù)的運(yùn)算。8088還提供各種校正操作,故可以進(jìn)行十進(jìn)制的算術(shù)運(yùn)算。進(jìn)行加、減運(yùn)算的源操作數(shù)和目的操作數(shù)的關(guān)系示意圖如圖3-14所示。圖3-14加、減運(yùn)算操作數(shù)之間的關(guān)系1.加法指令①ADDOPRD1,OPRD2
這條指令完成兩個(gè)操作數(shù)相加,結(jié)果送至目的操作數(shù)OPRD1,即
OPRD1←——OPRD1+OPRD2
目的操作數(shù)可以是累加器,任一通用寄存器,以及存貯器中的操作數(shù)。具體地說,可以實(shí)現(xiàn)累加器與立即數(shù),累加器與任一通用寄存器,累加器與存貯單元內(nèi)容相加,其和放回累加器中。例如:
ADDAL,30ADDAX,3000HADDAX,SI
DDAL,DATA[BX]
也可以實(shí)現(xiàn)任一通用寄存器與立即數(shù)相加,與累加器或別的寄存器相加,與存貯單元的內(nèi)容相加,其和放回寄存器中。例如:
ADDBX,3FFH
ADDSI,AXADDDI,CXADDDX,DATA[BX+SI]
還可以實(shí)現(xiàn)存貯器操作數(shù)與立即數(shù)相加,與累加器或別的寄存器相加,其和放回存貯單元中。例如:
ADDBETA[SI],100ADDBETA[SI],AXADDBETA[SI],DX
這些指令執(zhí)行時(shí),對(duì)標(biāo)志位CF、OF、PF、SF、ZF和AF都會(huì)產(chǎn)生影響。②ADC指令這條指令與ADD指令類同,只是在對(duì)兩個(gè)操作數(shù)進(jìn)行相加運(yùn)算中還應(yīng)加上進(jìn)位位的當(dāng)前值,然后再將結(jié)果送至目的操作數(shù)。例如:兩個(gè)四字節(jié)數(shù)已分別放在首地址為FIRST和SECOND的內(nèi)存區(qū)中。每個(gè)數(shù)占4個(gè)存貯單元,存放時(shí)低字節(jié)在前,高字節(jié)在后。那么用如下ADD和ADC指令就可實(shí)現(xiàn)四字節(jié)數(shù)的相加,相加結(jié)果放入THIRD為首地址的單元中。
MOVAX.FIRSTADDAX,SECOND
MOVTHIRD,AXMOVAX,FIRST+2
ADCAX,SECOND+2MOVTHIRD+2,AX③INCOPRD指令這條指令對(duì)指定的操作數(shù)進(jìn)行加1操作,它常用于循環(huán)程序中修改地址指針和循環(huán)次數(shù)等。其操作數(shù)可以在通用寄存器中,也可以在內(nèi)存單元中。該指令執(zhí)行結(jié)果對(duì)標(biāo)志位AF、OF、PF、SF和ZF有影響,而對(duì)CF位不產(chǎn)生影響。例如:
INCAL
INC[SI]2.減法指令①SUBOPRD1,OPRD2
該指令進(jìn)行兩個(gè)操作數(shù)的相減,即從OPRD1中減去OPRD2,其結(jié)果放于OPRD1中。具體地說,可以從累加器中減去立即數(shù);或從寄存器和內(nèi)存中的操作數(shù)中減去立即數(shù);或從寄存器中減去寄存器或內(nèi)存中的操作數(shù);或從寄存器或內(nèi)存操作數(shù)中減去寄存器操作數(shù)等,其類型完全與ADD指令時(shí)相同。例如:
SUBCX,BX
SUB[BP+2],CL②SBB指令該指令與SUB相類似,只不過在兩個(gè)操作數(shù)相減時(shí),還應(yīng)減去借位標(biāo)志CF的當(dāng)前值。③
DECOPRD指令
該指令實(shí)現(xiàn)對(duì)操作數(shù)的減1操作,所用的操作數(shù)可以是寄存器的,也可以是內(nèi)存的。在相減時(shí),把操作數(shù)看作為無符號(hào)的二進(jìn)制數(shù)。該指令執(zhí)行結(jié)果將影響標(biāo)志位AF、OF、PF、SF和ZF,但對(duì)CF標(biāo)志不產(chǎn)生影響。
④NEGOPRD
該指令用來對(duì)操作數(shù)進(jìn)行求補(bǔ)操作,即用零減去操作數(shù),然后再將結(jié)果送回。⑤CMPOPRD1,OPRD2
該指令為比較指令,完成兩個(gè)操作數(shù)的相減操作,這一點(diǎn)與減法指令相同,而且相減結(jié)果也同樣反映在標(biāo)志位上。比較指令可以用于累加器與立即數(shù),累加器與任一通用寄存器或任一內(nèi)存中的操作數(shù)之間的比較。例如:
CMPAL,100CMPAX,SICMPAX,DATA[BX]也可以用于任一寄存器與立即數(shù)或別的寄存器及任一內(nèi)存中的操作數(shù)之間的比較。例如:
CMPBX,04FEHCMPDX,DI
CMPCX,COUNT[BP]
還可以用于內(nèi)存操作數(shù)與立即數(shù)及任一寄存器中操作數(shù)之間的比較。例如:
CMPDATA,100CMPCOUNT[SI],AXCMPPOINTER[DI],BX綜上所述,可以歸納出如下結(jié)論:當(dāng)沒有溢出時(shí)(OF=0),若SF=0,則AX>BX
若SF=1,則AX<BX當(dāng)產(chǎn)生溢出時(shí)(OF=1),若SF=0,則AX<BX
若SF=1,則AX>BX用邏輯表達(dá)式又可簡(jiǎn)化為若OFSF=0,則AX>BX
若OFSF=1,則AX<BX3.乘法指令8088的乘法指令分為無符號(hào)數(shù)乘法指令和帶符號(hào)數(shù)乘法指令兩種。①無符號(hào)數(shù)乘法指令MUL
該指令可以完成字節(jié)與字節(jié)相乘,字與字相乘,并且默認(rèn)目的操作數(shù)放在AL或AX中,而源操作數(shù)由指令指出。當(dāng)16位乘法時(shí),32位的乘積,其高16位規(guī)定放在DX中,低16位放在AX中。該指令的一般格式為
MULOPRD;OPRD為源操作數(shù)例:字節(jié)乘以字節(jié)
MOVAL,LSRC-BYTE;被乘數(shù)送ALMULRSRC-BYTE;結(jié)果存于AX中字乘以字
MOVAX,LSRC-WORD;一個(gè)字送AX
MULRSRC-WORD;結(jié)果的高字節(jié)在DX中;低字節(jié)在AX中字節(jié)乘以字
MOVAL,MUL-BYTE;字節(jié)被乘數(shù)送ALCBW;AL中字節(jié)轉(zhuǎn)換成AX中的字
MULRSRC-WORD;②帶符號(hào)數(shù)乘法指令I(lǐng)MUL
這是一條帶符號(hào)數(shù)的乘法指令,它和MUL一樣可以進(jìn)行字節(jié)和字節(jié),字和字的乘法運(yùn)算。結(jié)果放在AX或DX、AX中。當(dāng)結(jié)果的高半部分不是結(jié)果的低半部分的符號(hào)擴(kuò)展時(shí),標(biāo)志位CF和OF將置位。4.除法指令8088有兩條除法指令,無符號(hào)除法指令和帶符號(hào)除法指令。它們都可以進(jìn)行字節(jié)或字的除法運(yùn)算,并且規(guī)定,8位除法,被除數(shù)在AX中;而對(duì)于16位除法,被除數(shù)則在DX與AX中,除數(shù)則由指令指出。除法結(jié)果,對(duì)8位數(shù)除法,商與余數(shù)分別放在AL與AH中,對(duì)16位除法商與余數(shù)分別放在AX與DX中。①無符號(hào)數(shù)除法指令DIV
執(zhí)行該指令,如果除法的結(jié)果值大于通過適當(dāng)?shù)募拇嫫骺梢员4娴闹禃r(shí),則產(chǎn)生0型中斷。例:字除以字節(jié)
MOVAX,NUMERATOR-WORD;被除數(shù)送AX
DIVDIVISOR-BYTE;商在AL中,余數(shù)在AH中字節(jié)除以字節(jié)
MOVAL,NUMERATOR-BYTE;被除數(shù)送ALCBW;AL中的字節(jié)擴(kuò)展成AX中的字
DIVDIVISOR-BYTE;字除以字
MOVAX,NUMERATOR-WORD;CWD;把字轉(zhuǎn)換成雙字DX、AXDIVDIVISOR-WORD;商在AX中,余數(shù)在DX中②帶符號(hào)除法指令I(lǐng)DIV
該指令是帶符號(hào)的除法指令,除后余數(shù)符號(hào)與被除數(shù)相同,其它同DIV指令。該指令一般格式為:
IDIVOPRD
例:雙倍字長(zhǎng)除以字
MOVDX,NUM-HI-WORD;被除數(shù)高位字送DXMOVAX,NUM-LO-WORD;被除數(shù)低位字送AX
IDIVDIVISOR-WORD[SI];5.校正指令8088的調(diào)整指令主要用于十進(jìn)制數(shù)的調(diào)整。
AAA——對(duì)AL中ASCII未壓縮的十進(jìn)制和進(jìn)行調(diào)整;
AAS——對(duì)AL中ASCII未壓縮的十進(jìn)制差進(jìn)行調(diào)整;
AAD——在除法指令前對(duì)AX中ASCII未壓縮的十進(jìn)制數(shù)進(jìn)行調(diào)整。
AAM——對(duì)AX兩個(gè)ASCII未壓縮十進(jìn)制相乘結(jié)果進(jìn)行調(diào)整。
DAA——對(duì)AL中的兩個(gè)壓縮十進(jìn)制數(shù)相加之和進(jìn)行調(diào)整,得到壓縮十進(jìn)制和。
DAS——對(duì)AL中的兩個(gè)壓縮十進(jìn)制數(shù)相減之差進(jìn)行調(diào)整,得到壓縮十進(jìn)制差。三、邏輯運(yùn)算和移位指令1.邏輯運(yùn)算指令①NOTOPRD
該指令對(duì)操作數(shù)進(jìn)行求反操作,然后將結(jié)果送回。操作數(shù)可以是寄存器或存貯器的內(nèi)容。該指令對(duì)標(biāo)志位不產(chǎn)生影響。例如:
NOTAL②AND指令該指令對(duì)兩個(gè)操作數(shù)進(jìn)行按位相“與”的邏輯運(yùn)算。即只有參加相與的兩位全為“1”時(shí),相“與”結(jié)果才為“1”;否則相“與”結(jié)果為“0”。相“與”結(jié)果送回。
AND指令可以進(jìn)行字節(jié)操作,也可以進(jìn)行字操作。
AND指令的一般格式為:
ANDOPRD1,OPRD2例如:
ANDAL,0FHANDAX,BXANDSI,BPANDAX,DATA-WORDANDDX,BUFFER[SI+BX]ANDDATA-WORD,00FFHANDBLOCK[BP+DI],DX③TEST指令該指令的操作功能與AND指令相同,其結(jié)果將反映在標(biāo)志位上,但結(jié)果不送回,即TEST指令將不改變操作數(shù)的值。這條指令通常是在不希望改變操作數(shù)的前提下,用來檢測(cè)某一位或某幾位的狀態(tài)。
TEST指令的一般格式為:
TESTOPRD,im;im是立即數(shù)立即數(shù)中哪一些為1,表示要對(duì)哪一位進(jìn)行測(cè)試。④OR指令該指令對(duì)兩個(gè)操作數(shù)進(jìn)行按位相“或”的邏輯操作。即進(jìn)行相“或”的兩位中的任一位如果為1時(shí),則相“或”的結(jié)果為1;如果兩位都為0時(shí),其結(jié)果才為0。OR指令操作結(jié)果將送回。
OR指令允許對(duì)字節(jié)或?qū)ψ诌M(jìn)行相“或”運(yùn)算。
OR指令使標(biāo)志位CF=0,OF=0;相“或”操作的結(jié)果反映在標(biāo)志位PF、SF和ZF上;對(duì)AF標(biāo)志位未定義。
OR指令的一般格式為:
OROPRD1,OPRD2其中,目的操作數(shù)OPRD1可以是累加器,可以是任一通用寄存器,也可以是一個(gè)內(nèi)存操作數(shù)。源操作數(shù)OPRD2可以是立即數(shù),也可以是寄存器,也可以是內(nèi)存操作數(shù)。例如:
ORAL,30H
ORAX,00FFHORBX,SIORBX,DATA-WORDORBUFFER[BX],SIORBUFFER[BX+SI],8000H⑤XOR指令該指令對(duì)兩個(gè)操作數(shù)進(jìn)行按位“異或”操作,即進(jìn)行“異或”操作的兩位值不同時(shí),其結(jié)果為“1”;否則就為0,操作結(jié)果送回。
XOR指令的一般形式為:
XOROPRD1,OPRD22.移位指令8088有三條移位指令:算術(shù)左移和邏輯左移指令:
SAL/SHLOPRD,m;m是移位次數(shù),可以是1或寄存器CL中的內(nèi)容算術(shù)右移指令:
SAROPRD,m
邏輯右移指令:
SHROPRD,m①SAL/SHL指令這兩條指令的操作結(jié)果是完全一致的。每移位一次在右面最低位補(bǔ)一個(gè)0,而左面的最高位則移入標(biāo)志位CF。如圖3-15所示。圖3-15左移指令示意圖②SAR指令該指令每執(zhí)行一次移位操作,就使操作數(shù)右移一位,但符號(hào)位保持不變,而最低位移至標(biāo)志位CF,如圖3-16所示。③SHR指令該指令每執(zhí)行一次移位操作,就使操作數(shù)右移一位,最低位移至標(biāo)志位CF。與SAR崐不同的是,左面的最高位將補(bǔ)0。如圖3-17所示。圖3-16算術(shù)右移指令示意圖圖3-17邏輯右移指令示意圖3.循環(huán)移位指令8088有四條循環(huán)移位指令:左循環(huán)移位指令ROLOPRD,m右循環(huán)移位指令ROROPRD,m帶進(jìn)位左循環(huán)移位指令RCLOPRD,m帶進(jìn)位右循環(huán)移位指令RCROPRD,m前兩條循環(huán)指令未把標(biāo)志位CF包含在循環(huán)中,后兩條循環(huán)指令把標(biāo)志位CF也包含在循環(huán)環(huán)中,作為整個(gè)循環(huán)環(huán)的一個(gè)部分。循環(huán)指令可以進(jìn)行字節(jié)操作,也可以進(jìn)行字操作。操作數(shù)可以是寄存器的,也可以是內(nèi)存的。可以循環(huán)一次,也可以由寄存器CL的內(nèi)容來決定循環(huán)次數(shù)。①ROL指令該指令每作一次移位,總是將最高位移入進(jìn)位位CF,并且還將最高位移入操作數(shù)的最低位,從而構(gòu)成一個(gè)環(huán)。如圖3-18(a)所示。圖3-18循環(huán)移位指令示意圖1圖3-18循環(huán)移位指令示意圖2②ROR指令該指令每作一次移位,總是將最低位移入進(jìn)位標(biāo)志位CF,另外,還將最低位移入操作數(shù)的最高位,從而構(gòu)成一個(gè)環(huán)。如圖3-18(b)所示。③RCL指令該指令是把標(biāo)志位CF包含在內(nèi)的一條循環(huán)左移指令。每移位一次,操作數(shù)的最高位移入進(jìn)位標(biāo)志位CF,而原來CF的內(nèi)容則移入操作數(shù)的最低位,從而構(gòu)成一個(gè)大環(huán)。如圖3-18(c)所示。④RCR指令該指令是把進(jìn)位標(biāo)志位CF包含在內(nèi)的一條右循環(huán)指令。每移位一次,標(biāo)志位CF中的原內(nèi)容就移入操作數(shù)的最高位,而操作數(shù)的最低位則移入標(biāo)志位CF。如圖3-18(d)所示。四、串操作指令在存貯器中存放的一串字或字節(jié),它們可以是二進(jìn)制數(shù),也可以是BCD碼或ASCII碼等有關(guān)的信息,它們存放在某一個(gè)連續(xù)的內(nèi)存區(qū)中,若對(duì)它們的每個(gè)字或字節(jié)均作同樣的操作,就稱為串操作,我們把能完成這樣功能的指令稱為字符串操作指令或簡(jiǎn)稱為串操作指令。1.MOVS/MOVSB/MOVSW
該類指令是串傳送指令,即用于內(nèi)存區(qū)之間字節(jié)串或字串的傳送。該類指令執(zhí)行時(shí),將把當(dāng)前數(shù)據(jù)串中用SI指針指出的源串的一個(gè)字節(jié)或一個(gè)字傳送到用DI指針指向的附加段的目的地址中去。當(dāng)DF=0時(shí),若是字節(jié)傳送,則SI、DI傳送后加1,以使指針指向下一個(gè)地址;若是字傳送,則SI、DI加2。若DF=1,則SI、DI作減1或減2。該類指令一般格式為:
MOVSOPDR1,OPDR2;OPDR2源串,OPDR1目的串
MOVSB;字節(jié)傳送
MOVSW;字傳送2.CMPS/CMPSB/CMPSW
該類指令是串比較指令,它常用于內(nèi)存區(qū)之間的數(shù)據(jù)、字符等的比較。該類指令執(zhí)行時(shí),將當(dāng)前數(shù)據(jù)段由SI所指出的字節(jié)和字同當(dāng)前附加段中由DI所指出的目的串的字節(jié)或字進(jìn)行比較,并把比較結(jié)果送標(biāo)志位,而對(duì)操作數(shù)不產(chǎn)生影響。從比較操作這一點(diǎn)來看它和CMP指令是一樣的,但是需要注意,這里的CMPS指令的比較操作是源操作數(shù)減去目的操作數(shù);而在CMP指令中的比較操作是目的操作數(shù)減去源操作數(shù)。因而兩者對(duì)標(biāo)志位的影響是不同的,特別在該類指令后面有條件轉(zhuǎn)移指令時(shí),其轉(zhuǎn)移條件應(yīng)與使用CMP指令時(shí)不同。該指令執(zhí)行后,也將使SI,DI加減1和2,具體由DF的值決定。該類指令一般格式為:
CMPSOPRD1,OPRD2;OPRD1為源串,OPRD2是目的串
CMPSB;字節(jié)比較
CMPSW;字比較3.SCAS/SCASB/SCASW
該類指令是串掃描指令,用于尋找內(nèi)存區(qū)中指定的數(shù)據(jù)和字符。該類指令執(zhí)行時(shí),將AL或AX的值減去在附加段中由DI所指定的目的串字節(jié)或字,結(jié)果將改變標(biāo)志位,但不改變操作數(shù)的值。目的串指針DI將作修改,修改規(guī)則同上。該類指令的一般格式為:
SCASOPRDSCASB;字節(jié)操作
SCASW;字操作4.LODS/LODSB/LODSW
該類指令是字串裝入指令,它將由SI所指定的源串字節(jié)或字裝入到累加器AL或AX中去,并根據(jù)DF的值修改指針SI,以指向下一個(gè)要裝入的字節(jié)或字。該類指令的一般格式為:
LODSOPRD;OPRD為源串
LODSB
LODSW5.STOS/STOSB/STOSW
該類指令是字串存貯指令。它將AL或AX中的字節(jié)或字存貯到由DI所指定的附加段中去,且根據(jù)DF的值來修改DI的值。該類指令一般格式為:
STOSOPRD;OPRD為目的串
STOSB;字節(jié)串
STOSW;字串6.REP
它是串指令的前綴,當(dāng)某一條串指令需要多次重復(fù)時(shí),就可以加上該前綴。重復(fù)次數(shù)應(yīng)放在寄存器CX中。這樣每重復(fù)執(zhí)行一次,CX內(nèi)容減1,直到CX=0為止,才停止重復(fù)。7.REPE/REPNE
它們是條件重復(fù)前綴,當(dāng)條件滿足時(shí),后面的串指令才重復(fù)執(zhí)行,一旦條件不滿足,重復(fù)就停止。例:將1000個(gè)字符的字符串從內(nèi)存的BUFFER1搬移到內(nèi)存的BUFFER2中去。
MOVSI,OFFSETBUFFER1;BUFFER1偏移地址送SIMOVDI,OFFSETBUFFER2;BUFFER2偏移地址送DIMOVCX,1000;傳送次數(shù)送CXREPMOVSBUFFER2,BUFFER1;重復(fù)搬移例:將數(shù)據(jù)段中100個(gè)字的數(shù)據(jù)塊BLOCK1搬移到同一個(gè)數(shù)據(jù)段的BLOCK2中去。
PUSHDSPOPES;使DS=ESLEASI,BLOCK1;源串地址送SILEADI,BLOCK2;目的串地址送DIMOVCX,0064H;重復(fù)次數(shù)送CXCLD[DW2];使DF=0,SI,DI工作加2操作
REPMOVSW;重復(fù)執(zhí)行,直到CX=0為止。例:比較DEST和SOURCE中的500個(gè)字節(jié),找出第一個(gè)不相同的字節(jié),如果找到,則將SOURCE中的這個(gè)數(shù)送AL中。
CLDLEADI,ES:DEST
LEASI,SOURCE
MOVCX,500
REPECMPB
JCXZMEXTMATCH:DECSIMOVAL,BYTEPTR[SI]…NEXT:五、程序控制指令該類指令主要是指程序轉(zhuǎn)移指令。8088使用CS段寄存器和IP指令指針寄存器的值來尋址,用以取出指令并執(zhí)行之。轉(zhuǎn)移類指令可改變CS與IP的值或僅改變IP的值,使得改變指令執(zhí)行的順序。1.無條件轉(zhuǎn)移、調(diào)用和返回指令這些指令都將引起程序執(zhí)行順序的改變。不過轉(zhuǎn)移有段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移之分,所謂段內(nèi)轉(zhuǎn)移是指段地址不變,只是IP改變;而段間轉(zhuǎn)移則CS和IP均發(fā)生改變。①無條件轉(zhuǎn)移指令JMP
該指令分直接轉(zhuǎn)移和間接轉(zhuǎn)移兩種。而在直接轉(zhuǎn)移中又可分短程(SHORT)、近程(NEAR)和遠(yuǎn)程(FAR)三種形式。當(dāng)程序執(zhí)行到JMP指令時(shí)就無條件地轉(zhuǎn)移到所指示的目的地址。該指令的一般格式為:
JMPOPRD;OPRD是轉(zhuǎn)移的目的地址直接轉(zhuǎn)移的三種形式為:·短程轉(zhuǎn)移JMPSHORTNEXT
在短程轉(zhuǎn)移中目的地址與JMP指令所處的地址距離應(yīng)在-128~127范圍之內(nèi)。
·近程轉(zhuǎn)移JMPNEARPTRLOOP1
或JMPLOOP1;NEAR可省略·遠(yuǎn)程轉(zhuǎn)移JMPFARPTRLOOP2·段內(nèi)間接轉(zhuǎn)移JMPCXJMPWORDPTR[BX]·段間間接轉(zhuǎn)移JMPDWORDPTR[BP][DI]②調(diào)用和返回指令
CALL指令用來調(diào)用一個(gè)過程或子程序。當(dāng)調(diào)用的過程或子程序結(jié)束后,可使用返回指令RET,使程序從調(diào)用的過程或子程序中返回。調(diào)用指令一般格式為
CALLNEARPTROPRD;段內(nèi)調(diào)用
CALLFARPTROPRD;段間調(diào)用;主程序(近程調(diào)用)…
CALLNEARPTRPROAD…;過程PROAD定義PROADPROCNEARPUSHAXPUSHCXPUSHSILEASI,ARYMOVCX,COUNTXORAX,AXNEXT:ADDAX,[SI]ADDSI,2LOOPNEXTMOVSUM,AXPOPSIPOPCXPOPAXRETPROADENDP;主程序(遠(yuǎn)程調(diào)用)…
CALLFARPTRPROADD…;過程PROADD定義(遠(yuǎn)調(diào)用過程)PROADDPROCFARPUSHAXPUSHCXPUSHSIPUSHDIMOVSI,[BX]MOVDI,[BX+2]MOVCX,[DI]MOVDI,[BX+4]XORAX,AXNEXT1:ADDAX,[SI]ADDSI,2LOOPNEXT1MOV[DI],AXPOPDIPOPSIPOPCXPOPAXRETPROADDENDP2.條件轉(zhuǎn)移指令8088有18條不同的條件轉(zhuǎn)移指令。它們是根據(jù)標(biāo)志寄存器中各標(biāo)志位的狀態(tài),決定程序是否進(jìn)行轉(zhuǎn)移,條件轉(zhuǎn)移指令的目的地址必須在現(xiàn)行的代碼段(CS)內(nèi),并且以當(dāng)前指針寄存器IP內(nèi)容為基準(zhǔn),其位移必須在+127~-128的范圍之內(nèi)。3.循環(huán)控制指令這類指令用于控制程序的循環(huán),其控制轉(zhuǎn)向的目的地址是在以當(dāng)前IP內(nèi)容為中心的+127~-128的范圍內(nèi)。這類指令用CX作計(jì)數(shù)器,每執(zhí)行一次指令CX內(nèi)容減1,直到減為0,循環(huán)才結(jié)束。該類指令的一般格式為:
LOOPOPRD;CX≠0循環(huán)
LOOPNEOPRD;CX≠0且ZF=0循環(huán)
LOOPEOPRD;CX≠0且ZF=1循環(huán)在LOOPE和LOOPNE二條指令中,只要兩個(gè)條件中任一個(gè)不滿足,循環(huán)就結(jié)束。例:
SUBDI,BXINCDIMOVCX,DIDECBXNEXT:INCBXCMPBYTEPTR[BX],0LOOPENEXT…4.軟中斷指令及中斷返回指令在8088的微機(jī)系統(tǒng)中,當(dāng)程序執(zhí)行到中斷指令I(lǐng)NT時(shí),便中斷當(dāng)前程序的執(zhí)行,轉(zhuǎn)向由256個(gè)中斷向量所提供的中斷入口地址之一去執(zhí)行。表3-1轉(zhuǎn)移指令(略)軟中斷指令的一般格式為:
INTOPRD;OPRD可以取00H~FFH256個(gè)值該指令執(zhí)行時(shí),首先將當(dāng)前的標(biāo)志寄存器的一個(gè)字壓入堆棧,并且清除標(biāo)志位IF和TF。接著壓入代碼段寄存器CS,而后再壓入IP。六、處理器控制指令該類指令用來控制處理器與協(xié)處理器之間的交互作用,修改標(biāo)志寄存器及與外部設(shè)備同步等。該類指令如表3-2所示。表3-2處理器控制指令1.標(biāo)志位操作指令該類指令共有7條,分別對(duì)CF位、DF位及IF位進(jìn)行操作。2.外部同步指令①暫停指令HLT
執(zhí)行該指令將使8088處于暫停狀態(tài),只有在重新啟動(dòng)或一個(gè)外部中斷發(fā)生時(shí),8088才能退出暫停狀態(tài),它常用來等待中斷的產(chǎn)生。②空操作指令NOP
執(zhí)行該指令并不產(chǎn)生任何結(jié)果,僅僅消耗3個(gè)時(shí)鐘周期的時(shí)間,常用于程序的延時(shí)等。③等待指令WAIT
執(zhí)行該指令,也使8088處于空操作狀態(tài),但它每隔5個(gè)時(shí)鐘周期要檢查一下8088的TEST線,若該線為1,則仍繼續(xù)等待;若為0時(shí),則退出等待狀態(tài)。該指令主要用于8088和協(xié)理器及外部設(shè)備之間的同步。④封鎖總線指令LOCKLOCK指令是一個(gè)前綴,可放在任何一條指令的前面,這條指令執(zhí)行時(shí),就封鎖了總線的控制權(quán),其它的處理器將得不到總線控制權(quán),這個(gè)過程一直持續(xù)到指令執(zhí)行完畢為止,它常用于多機(jī)系統(tǒng)。⑤處理器交權(quán)指令ESC
該指令執(zhí)行時(shí),可使協(xié)理器從8088的指令流中取出一部分指令,并在協(xié)理器上執(zhí)行。該指令的一般格式為
ESCEXTERNAL-OPCODE,OPRD七、輸入輸出指令一般輸入輸出指令歸屬于傳送指令,這里我們?yōu)榱藦?qiáng)調(diào)它的重要性,故將它另立一類專門詳細(xì)地作一介紹。8088在對(duì)端口進(jìn)行操作時(shí)就要用到輸入(IN)和輸出(OUT)指令。它可尋址的口地址可以多達(dá)64k個(gè),口地址可以用立即數(shù)表示,也可以用DX來表示。需要注意,若用立即數(shù)表示,只能尋址00H~FFH256個(gè)端口,另外,讀寫的數(shù)據(jù)必須崐由AX接收或發(fā)送。輸入輸出指令的一般格式為
INACC,OPRDOUTOPRD,ACC例如:
INAL,2FH;從2FH端口輸入一個(gè)字節(jié)
OUT5,AL;將AL內(nèi)容送到端口5…
MOVDX,3FCH;端口地址送DXINAX,DX;從3FCH端口讀一個(gè)字§3-3匯編語言與匯編程序用指令的助記符、符號(hào)地址、標(biāo)號(hào)、偽指令等符號(hào)書寫程序的語言稱為匯編語言。用這種匯編語言書寫的程序稱為匯編語言源程序或稱源程序。把匯編語言源程序翻譯成在機(jī)器上能執(zhí)行的機(jī)器語言程序(目的代碼程序)的過種叫做匯編,完成匯編過程的系統(tǒng)程序稱為匯編程序。匯編程序在對(duì)源程序進(jìn)行匯編過程中,除了將源程序翻譯成目的代碼外,還能給出源程序書寫過程中所出現(xiàn)的語法錯(cuò)誤信息,如非法格式,未定義的助記符、標(biāo)號(hào),漏掉操作數(shù)等。匯編程序可以用匯編語言書寫,也可以用其它高級(jí)語言書寫。匯編程序的種類很多,但主要的功能是一致的,例如:在IBM-PC中常配有兩種匯編程序ASM和MASM。根據(jù)運(yùn)行匯編程序的宿主機(jī)不同,匯編程序可以分為交叉匯編和駐留匯編兩種。①交叉匯編程序:運(yùn)行這種匯編程序的計(jì)算機(jī)與該匯編程序所要匯編成目的程序的機(jī)器是不同的。②駐留匯編程序:運(yùn)行這種匯編程序的微機(jī)系統(tǒng)就是執(zhí)行匯編后形成目的代碼程序的系統(tǒng)。一、匯編語言的語句格式由匯編語言編寫的源程序是由許多語句(也可稱為匯編指令)組成的,每個(gè)語句由1~4個(gè)部分組成,其格式是:[標(biāo)號(hào)]指令助記符[操作數(shù)][;注解]1.標(biāo)號(hào)(也叫做名稱)這是給指令或某一存貯單元地址所起的名字,名稱可由下列字符組成:字母:A~Z
數(shù)字:0~9特殊字符:?、·、@、-、$。當(dāng)名稱后跟冒號(hào)時(shí),表示是標(biāo)號(hào),它代表該行指令的起始地址,其它指令就可以引用該標(biāo)號(hào),作轉(zhuǎn)移的符號(hào)地址。當(dāng)名稱后不帶冒號(hào)時(shí),則可能是標(biāo)號(hào),也可能是變量。偽指令前的名稱不加冒號(hào),崐當(dāng)標(biāo)號(hào)是供段間調(diào)用時(shí),后面也不能跟冒號(hào)。例如,段內(nèi)調(diào)用OUTPUT:INAL,DX
段間調(diào)用OUTPUTINAL,DX2.指令助記符它表示不同操作的指令,可以是8088的指令助記符,也可以是偽指令。如果指令帶有前綴(如LOCK、REP、REPE/REPZ、REPNE/REPNZ),則指令前綴和指令助記符要用空格分開。3.操作數(shù)它是指令執(zhí)行的對(duì)象。依指令的要求,可能有一個(gè),兩個(gè)或者沒有,如:標(biāo)號(hào)指令助記符操作數(shù)注解
RET;無操作數(shù)
COUNT:INCCX;一個(gè)操作數(shù)
MOVCX,DI;二個(gè)操作數(shù)如果是偽指令,則可能有多個(gè)操作數(shù),如:
COSTDB3,4,5,6,7;5個(gè)操作數(shù)當(dāng)操作數(shù)超過1個(gè)時(shí),操作數(shù)之間應(yīng)用逗號(hào)分開。操作數(shù)可以是常數(shù)、寄存器名、標(biāo)號(hào)、變量、也可以是表達(dá)式,如:
MOVAX,[BP+4];第二個(gè)操作數(shù)為表達(dá)式4.注解該項(xiàng)可有可無,是為源程序所加的注解,使其易讀。在注解前面要加分號(hào),它可位于操作數(shù)之后,也可位于一行的開頭。匯編時(shí),對(duì)注解不作處理、僅在列源程序清單時(shí)列出,供編程人員閱讀。如:;讀端口B數(shù)據(jù)
INAL,PORTB;讀B口到AL中二、常數(shù)匯編語言語句中出現(xiàn)的常數(shù)可以有:1.二進(jìn)制數(shù)數(shù)字后跟字母B,如01000001B。2.八進(jìn)制數(shù)數(shù)字后跟字母Q或O,如202Q或202O。3.十進(jìn)制數(shù)數(shù)字后跟D或不跟字母,如85D或85。4.十六進(jìn)制數(shù)數(shù)字后跟H,如56H,0FFH。注意,當(dāng)數(shù)字的第一個(gè)字符是A~F時(shí),在字符前應(yīng)添加一個(gè)數(shù)字0,以示和變量的區(qū)別。5.十進(jìn)制浮點(diǎn)數(shù)浮點(diǎn)十進(jìn)制數(shù),如25E-2。6.十六進(jìn)制實(shí)數(shù)數(shù)字后跟R,數(shù)字的位數(shù)必須是8,16或20,在第一位是0的情況下,數(shù)字的位數(shù)可以是9,17或21,如0FFFFFFFFR。7.字符和字符串要求用單引號(hào)括起來,如‘BD’。
三、偽指令偽指令是用來對(duì)匯編程序進(jìn)行控制,以實(shí)現(xiàn)對(duì)程序中的數(shù)據(jù)實(shí)現(xiàn)條件轉(zhuǎn)移、列表、存貯空間分配等處理,其格式和匯編指令一樣,但是一般不產(chǎn)生目的代碼,即不直接命令CPU去執(zhí)行什么操作,這就是“偽”的含義。偽指令很多,約有50~60種,現(xiàn)僅介紹常用的幾種。1.定義數(shù)據(jù)偽指令該類偽指令用來定義存貯空間及其所存數(shù)據(jù)的長(zhǎng)度。DB——定義字節(jié),即每個(gè)數(shù)據(jù)是一個(gè)字節(jié)。DW——定義字,即每個(gè)數(shù)據(jù)占一個(gè)字(二個(gè)字節(jié))。DD——定義雙字,即每個(gè)數(shù)據(jù)占二個(gè)字。低字部分在低地址,高字部分在高地址。DQ——定義4字長(zhǎng),即每個(gè)數(shù)據(jù)占4個(gè)字。DT——定義10個(gè)字節(jié)長(zhǎng),用于壓縮式十進(jìn)制數(shù)。2.符號(hào)定義偽指令EQU和LABLE及包含偽指令I(lǐng)NCLUDE。EQU偽指令給符號(hào)定義一個(gè)值,這樣在程序中,凡是出現(xiàn)該符號(hào)的地方,匯編時(shí)均用其值代替,如:
TIMESEQU50DATADBTIMESDUP(?)
上述二個(gè)語句實(shí)際等效于如下一條語句:
DATADB50DUP(?)
LABLE這條偽指令不僅給名稱定義了一個(gè)屬性,而且隱含地給名稱定義了段的屬性和段內(nèi)偏移屬性,其段和偏移量就是匯編到這條語句時(shí),系統(tǒng)所在段和偏移地址。例如:
BYTE-ARRAYLABLEBYTE
WORD-ARRAYDW50DUP(0)這兩條語句將使變量BYTE-ARRAY和WORD-ARRAY都處在同一個(gè)段、同一個(gè)偏移位置上,即都指向具有100個(gè)字節(jié)數(shù)組的第一個(gè)位置上。但是,前者為字節(jié)屬性,后者為字屬性。這樣在執(zhí)行指令
MOVBYTE-ARRAY+2,0
時(shí),數(shù)組的第三字節(jié)就變成為0,而執(zhí)行指令
MOVWORD-ARRAY+2,0
時(shí),同一個(gè)數(shù)組的第三和第四字節(jié)均變成為0。又如:SUBRTELABLEFARSUBRT:SUBAX,AX…JMPSUBRT…FAR-PROPROCFAR…JMPSUBRTE…RETFAR-PROENDP3.段定義偽指令SEGMENT和ENDS
一個(gè)完整的匯編源程序由3個(gè)段組成,即堆棧段、數(shù)據(jù)段和代碼段,段定義偽指令可將源程序劃分成若干段,以便于生成目的代碼和連接時(shí)將各同名段進(jìn)行組合。段定義偽指令一般格式為段名SEGMENT[定位類型][組合類型][類別]…段名ENDSSEGMENT和ENDS應(yīng)成對(duì)使用,缺一不可,偽指令各部分書寫規(guī)定如下:①段名:段名是必須的不可省略的,其它是可選項(xiàng),是賦于段名的屬性,可以省略。段名是給定義的段所起的名稱。②定位類型:定位類型表示該段起始地址開始于何處,它可以是字節(jié)型的(BYTE),即段起始地址可位于任何地方;可以是字型(WORD)的,段起始地址必須位于偶地址,即地址最后一位是0(二進(jìn)制的);也可以是節(jié)型(PARA)的,即段起始地址必須能被16除盡;也可以是頁型的(PAGE),即段起始地址可被256除盡,因?yàn)橐豁摓?56個(gè)字節(jié);當(dāng)定位類型缺省時(shí),段起始地址便定位為PARA型的。③組合類型:組合類型是告訴連接程序,該段和其它段的組合關(guān)系,連接程序可以將不同模塊的同名段進(jìn)行組合。④類別:是用單引號(hào)括起來的字符串,以表明該段的類別,如代碼段(CODE)、數(shù)據(jù)段(DATA),堆棧段(STACK)等。上述的組合類型便于多個(gè)模塊的連接,若程序僅有一個(gè)模塊,即只包括代碼段、數(shù)據(jù)段和堆棧段時(shí),為了和其它段有區(qū)別,除了堆棧段用STACK說明外,其它段的組合類型、類別均可省略。例如有兩個(gè)模塊:模塊1STACKSEGMENTSTACKDW200DUP(?)STACKENDSDATASEGMENTCOMMON…DATAENDSCODESEGMENTPUBLIC…CODEENDS模塊2STACKSEGMENTSTACKDW30DUP(?)STACKENDSDATASEGMENTCOMMON
…DATAENDSCODESEGMENPUBLIC…CODEENDSEND圖3-19內(nèi)存分配示意圖4.定義過程的偽指令PROC和ENDP
在程序設(shè)計(jì)中,可將具有一定功能的程序段看成為一個(gè)過程(相當(dāng)于一個(gè)子程序)。它可以被別的程序調(diào)用(用CALL指令)或由JMP指令轉(zhuǎn)移到此執(zhí)行;也可以由程序順序執(zhí)行;也可以作為中斷處理程序,在中斷響應(yīng)后轉(zhuǎn)此執(zhí)行。一個(gè)過程由偽指令PROC和ENDP來定義,其格式為:過程名PROC[類型]…過程體
RET
過程名ENDP例如一個(gè)延時(shí)100ms的子程序,其過程可定義為:SOFTDLYPROCMOVBL,10;內(nèi)環(huán)延時(shí)10msDELAY:MOVCX,2801WAIT:LOOPWAITDECBLJNZDELAYRETSOFTDLYENDP上述過程為近過程,在接口程序中,常用于軟件延時(shí),改變BL和CX中的值,即可改變延時(shí)時(shí)間。為了不破壞主程序的工作狀態(tài),通常在過程中應(yīng)保護(hù)該過程所要用到的通用寄存器內(nèi)容??紤]到這種情況過程應(yīng)改為:SOFTDLYPROCPUSHBXPUSHCXMOVBL,10;內(nèi)循延時(shí)10msDELAY:MOVCX,2801WAIT:LOOPWAITDECBLJNZDELAYPOPCXPOPBXRETSOFTDLYENDP遠(yuǎn)過程調(diào)用時(shí)被調(diào)用過程必定是不在本段的。例如,有兩個(gè)程序段,其結(jié)構(gòu)如下:CODE1SEGMENTASSUMECS:CODE1…FARPROCRPOCFAR…RET…FARPROCENDPCODE1ENDSCODE2SEGMENTASSUMECS:CODE2…CALLFARPROC…CALLNEARPROC…NEARPROCPROCNEAR…RETNEARPROCENDPCODE2ENDS5.模塊間通訊的偽指令PUBLIC,EXTRN
當(dāng)多個(gè)目的程序連接時(shí),為了使連接程序完成正確的連接,必須互相提供一些信息:指出哪些標(biāo)識(shí)符(即名稱)是當(dāng)前模塊的,哪些標(biāo)識(shí)符是來自其它模塊的,模塊內(nèi)的哪些標(biāo)識(shí)符可供其它模塊使用,即通過標(biāo)識(shí)符的相互使用來交換信息。
PUBLIC和EXTRN偽指令可完成此功能,其一般格式為:
PUBLIC名稱[,名稱,……]
XTRN名稱:類型[,名稱:類型……]其中名稱可以是變量名或標(biāo)號(hào)。若是變量名,則類型可以是BYTE、WORD、DWORD;若是標(biāo)號(hào),則類型是NEAR或FAR。
PUBLIC偽指令所指出的名稱是在本模塊中定義的,可供其他模塊使用,凡沒有PUBLIC定義的名稱,不能被別的模塊采用,若采用則會(huì)出錯(cuò)。
EXTRN偽指令告知連接程序,其后面所指的名稱在本模塊中沒有定義,而是由外部其他模塊定義的名稱,但本模塊要使用它。;目的模塊1
EXTRNVAR1:WORD,OUTPUT:FAREXTRNVAR2:WORDLOCAL-DATASEGMENT…LOCAL-DATAENDSCODESEGMENTASSUMECS:CODE,DS:LOCAL-DATASTART:MOVAX,LOCAL-DATA
MOVDS,AX;初始化DS…MOVAX,SEGVAR1MOVES,AX;初始化ESADDBX,ES:VAR1;…MOVAX,SEGVAR2MOVEX,AXSUBES:VAR2,50…JMPOUTPUT;段間跳轉(zhuǎn)…CODEENDSENDSTART目的模塊2
PUBLICVAR1EXTDATA1SEGMENT;定義EXTDATA1數(shù)據(jù)段…VAR1:DW?;定義變量VAR1EXTDATA1ENDS…END;目的模塊3
PUBLICVAR2EXTDATA2SEGMENT;定義EXTDATA2數(shù)據(jù)段…VAR2:DW?…EXTDATA2ENDSENDPUBLICOUTPUTROUTINESEGNENTASSUMECS:ROUTINE…OUTPUTLABELFAR;定義OUTPTU標(biāo)號(hào)…ROUTINEENDSEND6.匯編結(jié)束偽指令END
該偽指令表示源程序的結(jié)束,令匯編程序停止匯編。因此,任何一個(gè)完整的源程序均應(yīng)有END指令,其一般格式為:
END[表達(dá)式]其中表達(dá)式表示該匯編程序的啟動(dòng)地址。例如:…
ENDSTART
則表明該程序的啟動(dòng)地址為START。四、匯編語言的運(yùn)算符匯編語言的運(yùn)算符有算術(shù)運(yùn)算符(如+、-、×、/等),邏輯運(yùn)算符(AND,OR,XOR,NOT)、關(guān)系運(yùn)算符(EQ、NE、LT、GT、LE、GE等)、取值運(yùn)算符和屬性運(yùn)算符。前面三種運(yùn)算符與高級(jí)語言中的運(yùn)算符類似,此處不再作介紹,后兩種運(yùn)算符是8088匯編語言特有的,下面對(duì)常用的幾種運(yùn)算符作一介紹。1.取值運(yùn)算符SEG和OFFSET
這兩個(gè)運(yùn)算符給出一個(gè)變量或標(biāo)號(hào)的段地址和偏移量。例如:定義標(biāo)號(hào)SLOT為:
SLOTDW25
則下面的指令
MOVAX,SLOT將從SLOT地址中取一個(gè)字送入AX中。假如要將SLOT標(biāo)號(hào)所在段的段地址送入AX寄存器,則可用運(yùn)算符
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 產(chǎn)業(yè)協(xié)同發(fā)展合同綱要
- 專業(yè)安全文明施工合作合同補(bǔ)充協(xié)議
- 個(gè)人知識(shí)產(chǎn)權(quán)授權(quán)合同標(biāo)準(zhǔn)范本
- 人事代理合同樣本:勞務(wù)派遣合同參考模板
- 專業(yè)外包服務(wù)公司員工合同協(xié)議
- 上海市標(biāo)準(zhǔn)勞動(dòng)合同參考合同
- 中藥材種植與收購合同
- 個(gè)人林地承包經(jīng)營合同
- 鄉(xiāng)村房產(chǎn)交易合同范本
- 租賃轉(zhuǎn)讓合同范本
- 燃?xì)庹质綘t應(yīng)急預(yù)案
- 藥劑科合理用藥課件
- 專題23平拋運(yùn)動(dòng)臨界問題相遇問題類平拋運(yùn)和斜拋運(yùn)動(dòng)
- 超聲科醫(yī)德醫(yī)風(fēng)制度內(nèi)容
- 高三開學(xué)收心班會(huì)課件
- 蒸汽換算計(jì)算表
- 四年級(jí)計(jì)算題大全(列豎式計(jì)算,可打印)
- 科技計(jì)劃項(xiàng)目申報(bào)培訓(xùn)
- 591食堂不合格食品處置制度
- 220t鍋爐課程設(shè)計(jì) 李學(xué)玉
- 全英文劇本 《劇院魅影》
評(píng)論
0/150
提交評(píng)論