版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
《微機原理與接口技術(shù)》主講:田娟
信息工程學(xué)院電子信息教研室郵箱:jtian@電話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ù)類型及其存儲數(shù)據(jù)在存儲器中常以字節(jié)為單位進(jìn)行存儲,一個字節(jié)占用內(nèi)存的一個地址,稱為一個存儲單元。
8086微處理器指令系統(tǒng)中的基本數(shù)據(jù)類型為:字節(jié)、字。當(dāng)多于一個字節(jié)的數(shù)據(jù)存儲時,其存儲規(guī)則是高位字節(jié)存儲在地址號高的存儲單元中,低位字節(jié)存儲在地址號低的存儲單元中。
圖4-1基本數(shù)據(jù)類型的結(jié)構(gòu)形式§4.1數(shù)據(jù)類型及其存儲規(guī)則
4.1.2數(shù)字?jǐn)?shù)據(jù)類型數(shù)字?jǐn)?shù)據(jù)類型包含三部分,即:
無符號整數(shù)。當(dāng)選擇字節(jié)時,范圍是0~255;當(dāng)選擇字時,范圍是0~65535。
帶符號整數(shù)。當(dāng)選擇字節(jié)時,范圍是-128~+127;當(dāng)選擇字時,范圍是-32768~+32767。
浮點數(shù)。◆帶符號數(shù)的表示方法計算機中的帶符號的數(shù),用二進(jìn)制編碼表示,數(shù)的符號也用二進(jìn)制表示。帶符號的數(shù)有三種表示方法:1、原碼2、反碼3、補碼數(shù)X的原碼記作[X]原反碼記作[X]反補碼記作[X]補在進(jìn)行運算時,負(fù)數(shù)的符號位不能與其數(shù)值部分一道參加運算,而必須利用單獨的線路確定和的符號位,從而使計算機的結(jié)構(gòu)變得復(fù)雜化。為了解決機器內(nèi)復(fù)數(shù)的符號位參加運算的問題,引入了反碼和補碼兩種機器數(shù)形式。補充知識◆帶符號數(shù)的表示方法(續(xù))補充知識☆原碼表示法:原碼用數(shù)的最左邊一位(MSB)表示數(shù)的正負(fù),即在D7或D15位加0或1。
符號位:0表示正,1表示負(fù);數(shù)值位:真值的絕對值?!罘创a表示法:若X>0,則[X]反=[X]原若X<0,則[X]反=對應(yīng)原碼的符號位不變,數(shù)值部分按位求反。◆帶符號數(shù)的表示方法(續(xù))補充知識☆補碼表示法:若X>0,則[X]補=[X]反=[X]原若X<0,則[X]補=[X]反+1§4.1數(shù)據(jù)類型及其存儲規(guī)則
4.1.3指針數(shù)據(jù)類型指針是內(nèi)存單元的地址,在實方式下有兩種類型的指針:
近指針(near)是段內(nèi)的16位偏移量(稱為有效地址)遠(yuǎn)指針(far)是一個32位的邏輯地址,不僅包含16位有效地址,而且包含了16位段地址?!?.1數(shù)據(jù)類型及其存儲規(guī)則
4.1.4字符串、位及位串?dāng)?shù)據(jù)類型
字符串包括字節(jié)串、字串和雙字串,它們分別是字節(jié)、字和雙字的相鄰序列,其格式如圖4-4所示,其中N為地址,分別以字節(jié)、字和雙字為單位存取?!?.2計算機指令格式
引言計算機處理各種數(shù)據(jù)或完成某些其他任務(wù)都是通過執(zhí)行具體指令來實現(xiàn)的。指令除了說明計算機做什么,還要指出數(shù)據(jù)的來源、操作結(jié)果的去向一條指令包括兩部分:指令操作碼(OperationCode)部分和地址碼部分。指令操作碼部分是給出該指令應(yīng)完成何種操作,其長度(代碼位數(shù))取決于指令系統(tǒng)中的指令條數(shù)。地址碼部分是用來描述該指令的操作對象,如給出參與操作的操作數(shù)的值是多少或者指出操作數(shù)存放在何處、操作的結(jié)果應(yīng)送往何處等信息。根據(jù)地址碼部分所給出地址的個數(shù),指令格式可分為:零地址指令、一地址指令、二地址指令和三地址指令。零地址指令指只有操作碼部分,而沒有操作數(shù)的指令。一地址指令指只有目的操作數(shù)的單操作數(shù)指令。二地址指令指有兩個地址指出兩個操作數(shù)的指令,這是最常見的指令格式。三地址指令的優(yōu)點是操作結(jié)束后,原兩個操作數(shù)的內(nèi)容均未被破壞;其缺點是增加一個地址后,使指令碼加長,增加了存儲空間,取指時間變長。§4.2計算機指令格式
引言(續(xù))
4.2.1指令的助記符格式§4.2計算機指令格式80x86微處理器指令的助記符格式可用以下通式表示:
L:opDl,D2,D3L是標(biāo)號,在標(biāo)識符后面跟有冒號(:)。
op是助記符,具有相同功能的指令操作碼的保留名。
D1、D2、D3是任選的操作數(shù)參數(shù),可以有零至三個。參數(shù)的個數(shù)取決于指令操作碼,可形成四種指令格式(零地址指令、一地址指令、二地址指令和三地址指令)。
最常用的是二地址指令格式,這種格式的指令中存在兩個操作數(shù),右邊的是源操作數(shù),左邊的是目的操作數(shù)。補充知識
[標(biāo)號:]操作碼助記符[操作數(shù)][;注釋]其中[]為任選項。匯編語言指令語句的一般格式標(biāo)號:該指令所在地址的符號名稱,后必跟“:”。由字母a~z或A~Z、數(shù)字0~9或特殊字符(@,-,?)組成;必須由字母a~z或A~Z或特殊字符(@,-,?)開頭,數(shù)字不能開頭,?不能單獨使用。有效長度為31個字符。標(biāo)號不能使用指令助記符。規(guī)則:
操作碼助記符:是指令名稱的代表符號,不可缺省。
操作數(shù):是參加本指令運算的數(shù)據(jù),可以缺省。
注釋:如果帶注釋,前面必須用“;”開頭。該項可以缺省。
說明:操作數(shù)可以用表達(dá)式來表示,可在指令、寄存器、存儲器中存取。通常將指令執(zhí)行過程中保持原值不變的操作數(shù)稱為源操作數(shù);若操作數(shù)原值不保留,而將存放此操作數(shù)的地址用來存放運行結(jié)果值,則稱此操作數(shù)為目的操作數(shù)。
[標(biāo)號:]操作碼助記符[目的操作數(shù)][,源操作數(shù)][;注釋]
補充知識§4.2計算機指令格式
4.2.280x86指令編碼格式(自學(xué))見課本P82~85。計算機中的指令有些不需要操作數(shù),大多數(shù)指令采用一個或兩個操作數(shù)。一般來說,操作數(shù)可以跟隨在指令操作碼之后,稱為立即數(shù);操作數(shù)也可以存放在CPU內(nèi)部的寄存器中,稱為寄存器操作數(shù);絕大多數(shù)的操作數(shù)存放在內(nèi)存儲器中,稱為存儲器操作數(shù)。指令指定操作數(shù)的位置,即給出地址信息,在執(zhí)行時需要根據(jù)這個地址信息找到需要的操作數(shù)。這種尋找操作數(shù)的過程稱為尋址,而尋找操作數(shù)的方法稱為尋址方式。補充知識-幾個重要概念§4.38086的尋址方式
引言尋址方式就是指令中說明操作數(shù)所在地址的方法。操作數(shù)可以包含在寄存器、存儲器或I/O端口地址中,也可以是立即數(shù)。操作數(shù)在寄存器中的指令執(zhí)行速度最快(寄存器尋址),因為它們可以在CPU內(nèi)部立即執(zhí)行。立即數(shù)尋址指令可直接從指令隊列中取數(shù),所以執(zhí)行速度也較快。操作數(shù)在存儲器中的指令執(zhí)行速度較慢,因為它要通過總線與CPU之間交換數(shù)據(jù),當(dāng)CPU進(jìn)行讀寫存儲器的操作時,必須先把一個偏移量送到BIU,計算出20位物理地址,再執(zhí)行總線周期去存取操作數(shù)?!?.38086的尋址方式
4.3.1立即尋址在立即尋址(ImmediateAddressing)方式下,操作數(shù)直接包含在指令中,它是一個8位或16位的常數(shù)(只能是整數(shù),不能是小數(shù)、變量或者其他類型的數(shù)據(jù)),也叫立即數(shù)。該指令翻譯成機器碼時,立即數(shù)作為指令的一部分,緊跟在操作碼之后,存放在代碼段內(nèi)。立即尋址方式的指令常用來給寄存器賦初值。立即數(shù)不但可以送到寄存器中,而且還可以送到一個存儲單元(8位)中或兩個連續(xù)的存儲單元(16位)中去。要強調(diào)的是,在所有的指令中,立即數(shù)只能作源操作數(shù),不能作目的操作數(shù),位數(shù)要與目的操作數(shù)的位數(shù)一致。
以A~F打頭的數(shù)字出現(xiàn)在指令中時,前面一定要加一個數(shù)字“0”,以免與其它符號相混淆。
如:MOVCX,2A50H;將立即數(shù)2A50H送到CX寄存器中。指令的機器碼存放及執(zhí)行過程如圖4-8所示。圖4-8MOVCX,2A50H執(zhí)行過程2A50CLCHCX代碼段:操作碼502AMOVCX,2A50H指令代碼:§4.38086的尋址方式
4.3.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ù)一致,否則會出錯。如:MOVCL,AH;它表示將AH中的8位數(shù)據(jù)傳送到CL寄存器。MOVCX,AH;錯誤書寫已知(AX)=3A68H,(DX)=18C7H,則執(zhí)行指令MOVDX,AX后,(DX)=?,而AX=?例題:答案:(DX)=3A68H
,而AX=3A68H?!?.38086的尋址方式
4.3.3直接尋址在IBMPC機中,把操作數(shù)的偏移地址稱為有效地址EA。使用直接尋址方式(DirectAddressing)的指令時,存儲單元的EA直接由指令給出,在機器碼中,EA存放在CS指令的操作碼之后。須先求出操作數(shù)的物理地址,然后再訪問存儲器,才能取得操作數(shù)。指令中的常數(shù)地址必須用方括號括起來,以便與立即數(shù)相區(qū)別。如:
MOVAX,[2000H];當(dāng)采用直接尋址指令時,若指令中沒有用前綴指明操作數(shù)存放在哪一段,則默認(rèn)為段寄存器為DS,因此操作數(shù)的物理地址=DS×16+EA。如果要對CS、SS或ES寄存器所指出的存儲區(qū)進(jìn)行直接尋址,應(yīng)在指令中指定段超越前綴。如:MOVAX,ES:[500H];這里的冒號“:”稱為修改屬性運算符,該指令的源操作數(shù)的物理地址即為16×ES+500H。如:MOVAX,[2000H]
該指令給出操作數(shù)的有效地址EA=2000H,設(shè)DS=3000H,則源操作數(shù)的物理地址=3000H×16H+2000H=32000H。該指令執(zhí)行完,把地址32000H處的一個字送進(jìn)AX。若地址32000H中的內(nèi)容為34H,32001H中的內(nèi)容為12H。則執(zhí)行指令后,(AX)=1234H。指令執(zhí)行過程見圖4-9所示。若指令為:MOVAL,[2000H]
假設(shè)所有條件都和圖4-9相同,則該指令執(zhí)行后將存儲單元(32000H)=34H中的字節(jié)送到AL中,結(jié)果為(AL)=34H。圖4-9MOVAX,[2000H]執(zhí)行過程示意圖3000DS+200032000×10H:3412320001234ALAHAX數(shù)據(jù)段:代碼段:操作碼0020MOVAX,[2000H]指令代碼:執(zhí)行指令MOVBX,[1070H]后,BX=?練習(xí):答案:BX=5634H?!?.38086的尋址方式
4.3.4寄存器間接尋址指令中給出的寄存器中的值不是操作數(shù)本身,而是操作數(shù)的有效地址,這種尋址方式稱為寄存器間接尋址。
寄存器名稱外面必須加方括號,以與寄存器尋址方式相區(qū)別。這類指令中使用的寄存器有基址寄存器BX、BP及變址寄存器SI、DI。如果指令中指定的寄存器是BX、SI或DI,則默認(rèn)操作數(shù)存放在DS中,這時要用數(shù)據(jù)段寄存DS的內(nèi)容作為段地址。若指令中用寄存器BP進(jìn)行間接尋址,則默認(rèn)操作數(shù)在SS段中,操作數(shù)的段地址在SS中。如:MOVAX,[BP]例4-2設(shè)DS=1000H,SI=2000H,(12000H)=318BH;分析指令MOVBX,[SI]執(zhí)行后寄存器BX的結(jié)果。圖4-10例4-2指令執(zhí)行過程示意圖1000DS+SI200012000×10H:8B3112000318BBLBHBX數(shù)據(jù)段:代碼段:操作碼0020MOVBX,[SI]指令代碼:答案:BX=318BH?!?.38086的尋址方式
4.3.5寄存器(間接)相對尋址寄存器相對尋址方式的操作數(shù)的有效地址是一個基址或變址寄存器的內(nèi)容與指令中指定的8位或16位位移量之和。對BX、SI、DI這三個間址寄存器,指示的是數(shù)據(jù)段中的數(shù)據(jù);而用BP作間址寄存器,則指示的是堆棧段中的數(shù)據(jù)。寄存器相對尋址方式與寄存器間接尋址相似,主要區(qū)別是前者在有效地址上要加一個位移量(即帶位移量的寄存器間接尋址)如:MOVBX,COUNT[SI]等價于MOVBX,[COUNT+SI]這種尋址方式也允許使用段超越前綴。例4-3設(shè)DS=3000H,SI=2000H,位移量COUNT=4000H,(36000H)=5678H,分析指令“MOVBX,COUNT[SI]”執(zhí)行后寄存器BX的結(jié)果。執(zhí)行結(jié)果:BX=5678H。圖4-11例4-3指令執(zhí)行過程示意圖20003000DSSI+COUNT400036000×10H:7856360005678BLBHBX數(shù)據(jù)段:代碼段:操作碼0040MOVBX,COUNT[SI]指令代碼:§4.38086的尋址方式
4.3.6基址變址尋址(基址寄存器加變址寄存器間接尋址)基址加變址尋址(BasedIndexedAddressing)方式,操作數(shù)的有效地址是一個基址寄存器(BX或BP)和一個變址寄存器(SI或DI)的內(nèi)容之和,兩個寄存器均由指令指定。如:MOVAX,[BX][SI]等價于MOVAX,[BX+SI]
例4-4設(shè)DS=3000H,BX=1200H,SI=0500H,(31700H)=ABCDH,分析指令“MOVAX,[BX][SI]”執(zhí)行后寄存器AX的結(jié)果。圖4-12例4-4指令執(zhí)行過程示意圖:CDAB31700ABCDALAHAX數(shù)據(jù)段:代碼段:操作碼MOVAX,[BX][SI]指令代碼:+317000500SI3000DS×10H1200BX執(zhí)行結(jié)果:AX=ABCDH?!?.38086的尋址方式
4.3.7相對基址變址尋址(基址寄存器加變址寄存器間接相對尋址)相對基址變址尋址(RelativeBasedIndexedAddressing)方式的操作數(shù)的有效地址是一個基址寄存器和一個變址寄存器的內(nèi)容,再加上指令中指定的8位或16位位移量之和。如:MOVAX,MASK[BX][SI]MOVAX,[MASK+BX+SI]MOVAX,200H[BX+SI]MOVAX,MASK[BX+SI]
例4-5設(shè)DS=2000H,BX=1500H,SI=0300H,MASK=0200H,(21A00H)=26BFH,分析指令“MOVAX,MASK[BX][SI]”執(zhí)行后寄存器AX的結(jié)果。執(zhí)行結(jié)果:AX=26BFH圖4-13例4-5指令執(zhí)行過程示意圖1500BX+MASK020021A002000DS×10H:BF2621A0026BFALAHAX數(shù)據(jù)段:操作碼操作碼00代碼段:MOVAX,MASK[BX][SI]指令代碼:0300SI02
尋址方式中,只有三種操作數(shù)類型:立即數(shù)、寄存器、存儲器;可以按源、目的操作數(shù)分別確定尋址方式;尋址方式約定了隱含段寄存器,但允許超越;存儲器操作,讀/寫速度最慢;寄存器操作,讀/寫速度最快;在涉及操作數(shù)的地址時,常常要在指令中使用方括號,有關(guān)帶方括號的地址表達(dá)式必須遵循下列規(guī)則:立即數(shù)可以出現(xiàn)在方括號內(nèi),表示直接地址,例如[2000H]。
只有BX、BP、SI、DI這4個寄存器可以出現(xiàn)在[]內(nèi),它們可以單獨出現(xiàn),也可以由幾個寄存器組合起來(只能相加),或以寄存器與常數(shù)相加的形式出現(xiàn),但BX和BP寄存器不允許出現(xiàn)在同一個[]內(nèi),SI和DI也不能同時出現(xiàn)。
小結(jié)小結(jié)§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.48086的指令系統(tǒng)
4.4.1數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令用來把數(shù)據(jù)或地址傳送到寄存器或存儲器單元中,共14條,可分為4組:
通用數(shù)據(jù)傳送指令
累加器專用傳送指令
地址傳送指令
標(biāo)志傳送指令格式:MOVDST,SRC;操作:DST←SRCMOV指令允許在CPU的寄存器之間、存儲器和寄存器之間傳送字節(jié)和字?jǐn)?shù)據(jù),(操作數(shù)類型要匹配,字對字,字節(jié)對字節(jié)傳送)也可將立即數(shù)送到寄存器或存儲器中(如圖4-14所示)。注意:IP寄存器不能用作源操作數(shù)或目的操作數(shù),目的操作數(shù)也不允許用立即數(shù)和CS寄存器;除了源操作數(shù)為立即數(shù)外,兩個操作數(shù)中必有一個是存器,但不能都是段寄存器。MOV指令不能在兩個存儲單元之間直接傳送數(shù)據(jù)(源和目的不能同為存儲器操作數(shù)),也不能在兩個段寄存器之間直接傳送數(shù)據(jù)。
MOV指令不影響標(biāo)志寄存器的值。
通用數(shù)據(jù)傳送指令☆
MOV傳送指令(Move)圖4-14MOV允許傳送數(shù)據(jù)的途徑通用寄存器AXAHBXALCXBHDXBLSICHDICLSPDHBPDL段寄存器CS,DS,ES,SS存儲器立即數(shù)從通用寄存器到通用寄存器。立即數(shù)傳送到通用寄存器。通用寄存器和存儲單元之間。立即數(shù)傳送到存儲單元。段寄存器與通用寄存器間的數(shù)據(jù)傳送。
段寄存器與存儲單元間的數(shù)據(jù)傳送。
允許的MOV指令的形式有如下幾種:小結(jié)MOVreg1,reg2MOVreg,immMOVmem(reg),reg(mem)MOVmem,immMOVseg,reg或MOVreg,segMOVsreg,mem或MOVmem,sreg小結(jié)不能在兩個存儲單元之間傳送。立即數(shù)不能送段寄存器。段寄存器之間不能傳送。
CS不能做目的但可做源操作數(shù)。不允許的MOV指令的形式有如下幾種:MOV[1000H],[2000H]MOVDS,300HMOVDS,ESMOVCS,AXMOVAX,CSMOVAX,BL××∨小結(jié)修改:MOVAX,300HMOVDS,AX×××修改:MOVAX,[2000H]MOV[1000H],AX通用數(shù)據(jù)傳送指令☆PUSH進(jìn)棧指令(PushWordontoStack)原則:按“后進(jìn)先出”原則設(shè)計的數(shù)據(jù)區(qū)。堆棧段地址:由SS段寄存器提供。堆棧區(qū)操作數(shù)據(jù)地址:由堆棧指針寄存器SP提供。SP的初值是指向的地址為棧底,進(jìn)行堆棧數(shù)據(jù)操作后SP指向棧頂?shù)刂贰8袷剑篜USHSRC;將源操作數(shù)(SRC)推入堆棧。(SP)←(SP)-2,((SP)+1,(SP))←(SRC)(先減后壓)說明:源操作數(shù)是16位通用寄存器、段寄存器或存儲器中的數(shù)據(jù)字,不能是立即數(shù)。有下列形式:PUSHreg/mem/sreg。進(jìn)棧指令不影響標(biāo)志位。通用數(shù)據(jù)傳送指令☆POP出棧指令(PopWordoffStack)格式:POPdst;把當(dāng)前SP所指向的堆棧頂部的一個字送到指定的目的操作數(shù)中。(DST)←((SP)+1,(SP)),(SP)←(SP)+2(先出后加)說明:有下列形式:POPreg/mem/sreg。其中CS可以壓棧但不能作目的操作數(shù)。標(biāo)志位不受影響。
例4-6設(shè)SS=2000H,SP=40H,BX=3120H,AX=25FEH,依次執(zhí)行下列指令后堆棧中的數(shù)據(jù)和SP的變化情況如何?PUSHBXPUSHAXPOPBXPOPAX20000:000020000:003C20000:0040FE252031AX=25FEHBX=3120H(c)執(zhí)行PUSHAX指令后SP20000:000020000:003E20000:0040FE252031AX=25FEHBX=25FEH(d)執(zhí)行POPBX指令后SP圖4-15PUSH和POP指令執(zhí)行過程20000:000020000:0040AX=25FEHBX=3120H(a)指令執(zhí)行前SP20000:000020000:003E20000:00402031AX=25FEHBX=3120H(b)執(zhí)行PUSHBX指令后SP通用數(shù)據(jù)傳送指令☆XCHG交換指令(Exchange)格式:XCHGOPR1,OPR2;操作:(OPR1)(OPR2)說明:交換可以在reg之間、reg與mem之間進(jìn)行,但sreg不能作為操作數(shù),也不能直接交換兩個存儲單元中的內(nèi)容。舉例:設(shè)AX=2000H,DS=3000H,BX=1800H,(31A00H)=1995H,執(zhí)行下面指令:XCHGAX,[BX+200H]后,它把內(nèi)存中的一個字與AX中的內(nèi)容進(jìn)行交換,源操作數(shù)的物理地址=3000×10H+1800H+200H=31A00H,該地址處存放的字?jǐn)?shù)據(jù)為1995H。因此,指令執(zhí)行后,AX=1995H,(31A00H)=2000H。格式:XLAT表首地址或XLAT操作:(AL)←((BX)+(AL))。將AL中的值(碼)轉(zhuǎn)換為內(nèi)存表格中的某一值,再送回AL中說明:使用XLAT指令之前必須先建立一個表格,并將轉(zhuǎn)換表的起始地址裝入BX寄存器中。AL中事先也送一個初值,該值等于表頭地址與所要查找的某一項之間的位移量。表格中的內(nèi)容則是要轉(zhuǎn)換的代碼,表格最多包含256個字節(jié)。執(zhí)行XLAT指令后,根據(jù)位移量可以從表中查到轉(zhuǎn)換后的代碼值,并自動送入AL寄存器中,得到所需結(jié)果。累加器專用傳送指令☆XLAT表轉(zhuǎn)換指令累加器專用傳送指令☆輸入輸出指令(I/O指令)I/O指令是專門面向輸入輸出端口進(jìn)行讀寫的指令。輸入指令I(lǐng)N:用于從I/O端口讀數(shù)據(jù)到累加器AL(或AX)中;輸出指令OUT:用于將累加器AL(或AX)中的數(shù)據(jù)寫到I/O端口。8086/8088的I/O指令中,只允許用兩種尋址方式:
直接尋址方式:指令中包含了一個8位的I/O端口地址,允許尋址256個端口,端口地址為0~0FFH。
寄存器間接尋址方式:端口地址由DX寄存器指定,可尋址64K個端口(0~0FFFFH)。間接尋址的適用范圍較大,在編寫程序時要盡量采用這種方式。INAL,PORT
;直接尋址,PORT為8位立即數(shù),表示端口地址,從PORT端口讀一個字節(jié)送ALINAX,PORT
;直接尋址,從PORT和PORT+l兩個端口讀一個字送AXINAL,DX
;間接尋址,16位端口地址由DX指出,從(DX)所指的端口讀一個字節(jié)送ALINAX,DX
;間接尋址,從(DX)和(DX+1)所指的兩個端口讀一個字到AX,;低地址端口的內(nèi)容送入AL,高地址端口的內(nèi)容送入AH☆輸入指令I(lǐng)N(Intput)☆輸出指令OUT(Output)OUTPORT,AL
;將AL中的一個字節(jié)輸出到PORT端口OUTPORT,AX
;將AX中的一個字輸出到PORT和PORT+l兩個端口OUTDX,
AL
;DX中為端口地址,將AL中的字節(jié)送(DX)所指的端口OUTDX,
AX
;將AX中的字送(DX)和(DX)+l所指的兩個端口INAL,0F1H INAX,80H
MOVDX,3l0H INAL,DXOUT85H,AL MOVDX,0FF4HOUTDX,AL MOVDX,300H OUTDX,AX 舉例:地址傳送指令☆取有效地址指令:LEA(LoadEffectiveAddress)格式:LEAreg16,mem;(reg16)←mem的偏移地址功能:取源操作數(shù)地址的偏移量,并把它傳送到目的操作數(shù)制定的寄存器。標(biāo)志位:不受影響。LEA指令要求源操作數(shù)必須是存儲單元,而且目的操作數(shù)必須是一個除CS之外的16位寄存器。注意它與MOV指令的區(qū)別,MOV指令傳送的一般是源操作數(shù)中的內(nèi)容而不是地址。地址傳送指令☆將雙字指針?biāo)偷郊拇嫫骱虳S的指令:LDS格式:LDSreg16,mem32功能:從mem32指定的存儲單元地址開始,將連續(xù)4字節(jié)單元中的內(nèi)容,分別送入制定寄存器reg16和DS中。其中前2個字節(jié)(變量的偏移地址)送到reg16,后2個字節(jié)(變量的段地址)送入DS寄存器。標(biāo)志位:不受影響。指令中的reg16通常使用SI寄存器,不能使用sreg。mem32必須是存儲單元,從該存儲單元開始的連續(xù)4個字節(jié)單元中,存放著一個變量的地址指針。地址傳送指令☆將雙字指針?biāo)偷郊拇嫫骱虴S的指令:LES格式:LESreg16,mem32功能:該指令與LDS指令的操作基本相同,不同的是要將mem32所指向的地址指針中的段地址部分送到ES寄存器中,不是DS寄存器,reg16常用DI寄存器。標(biāo)志傳送指令☆LAHF(LoadAHfromFlags)標(biāo)志寄存器低8為送入AH格式:LAHF功能:把標(biāo)志寄存器SF、ZF、AF、PF和CF分別傳送到AH寄存器的位7,6,4,2和0,位5,3,1的內(nèi)容未定義,可以是任意值。執(zhí)行指令后,標(biāo)志位不受影響。☆SAHF(StoreAHintoFlags)AH送標(biāo)志寄存器低8位格式:SAHF功能:把AH內(nèi)容存入標(biāo)志寄存器。這條指令與LAHF的操作相反,它把寄存器AH中的7,6,4,2,0位傳送到標(biāo)志寄存器的SF、ZF、AF、PF和CF位,高位標(biāo)志OF、DF、IF和TF不受影響。☆PUSHF(PushFlagsontoStack)標(biāo)志寄存器入棧指令格式:PUSHF☆POPF(PopFlagsoffStack)標(biāo)志出棧指令格式:POPF§4.48086的指令系統(tǒng)
4.4.2算術(shù)運算指令8086/8088指令系統(tǒng)提供了加、減、乘、除四種基本運算指令,可處理無符號或帶符號的8位或16位二進(jìn)制數(shù)的算術(shù)運算,還提供了各種調(diào)整操作指令,故可進(jìn)行壓縮的或非壓縮的十進(jìn)制數(shù)的算術(shù)運算。☆
ADD(Addition)加法指令格式:ADDDST,SRC操作:DST←SRC+DST☆A(yù)DC(AdditionwithCarry)帶進(jìn)位的加法指令格式:ADCDST,SRC操作:DST←DST+SRC+CF說明:這兩條指令的SRC可以是reg、mem或imm,DST只能用seg和存儲單元。
源和目的操作數(shù)不能同時為存儲器,且類型必須一致。這兩條指令影響的標(biāo)志位為:CF、OF、PF、SF、ZF和AF。加法指令☆I(lǐng)NC(Increment)增量指令格式:INCOPR操作:OPR←OPR+1說明:OPR操作數(shù)可以在通用reg或內(nèi)存中。該指令主要用在循環(huán)程序中對地址指針和循環(huán)計數(shù)器等進(jìn)行修改。指令執(zhí)行后影響AF、OF、PF、SF和ZF,但CF不受影響。INC在對內(nèi)存操作時必須加WORDPTR[]、BYTEPTR[]指令。
☆
AAA(ASCIIAdjustforAddition)加法的ASCII調(diào)整指令格式:AAA;非壓縮BCD碼加法累加器調(diào)整指令功能:在用ADD或ADC指令對兩個非壓縮十進(jìn)制數(shù)或ASCII碼表示的十進(jìn)制數(shù)作加法后,運算結(jié)果已存在AL的情況下,AAA指令將AL寄存器中的運算結(jié)果調(diào)整為非壓縮十進(jìn)制數(shù),仍保留在AL中,如果AF=1,表示向高位有進(jìn)位,則進(jìn)到AH寄存器中。加法指令例4-8若AH=0,AL寄存器中存放BCD碼數(shù)9,BL寄存器中存放BCD碼數(shù)5,寫出兩寄存器相加的指令語句。解:指令語句如下:ADDAL,BL
AAA00001001…9+00000101…500001110…低4位>9+00000110…加6調(diào)整00010100∧00001111…清高4位00000100…AL=4CF=1,AF=1,AH=1結(jié)果為AX=0104H,表示非壓縮十進(jìn)制數(shù)14。
調(diào)整過程為:若AL低4位>9或半進(jìn)位標(biāo)志AF=1,則:AL←AL+6;用與操作(∧)將AL高4位清0;
AF置1,CF置1,AH←AH+1。否則,僅將AL寄存器的高4位清0。格式:DAA功能:將兩個壓縮BCD數(shù)相加后的結(jié)果調(diào)整為正確的壓縮BCD數(shù)。相加后的結(jié)果必須在AL中,才能使用DAA指令。調(diào)整過程為:做加法后AL中的低半字節(jié)﹥9或AF=1,則AL←AL+6,對低半字節(jié)進(jìn)行調(diào)整。做加法后AL中高半字節(jié)結(jié)果﹥9或CF=l,則AL←AL+60H,對高半字節(jié)進(jìn)行調(diào)整,并使CF置l,否則CF置0。加法指令☆DAA(DecimalAdjustforAddition)加法的十進(jìn)制調(diào)整指令(壓縮BCD碼加法累加器調(diào)整指令)例4-9若AL寄存器中存放BCD碼數(shù)88,BL寄存器中存放BCD碼數(shù)49,寫出兩寄存器相加的指令語句。解:指令代碼如下:ADDAL,BLDAA10001000…88+01001001…4911010001…AF=1+00000110…加6調(diào)整11010111…調(diào)整后高半字節(jié)>9∧01100000…加60H調(diào)整00110111…結(jié)果為AL=BCD37,CF=1減法指令☆
SUB(Subtraction)不帶借位的減法指令格式:SUBDST,SRC操作:DST←DST-SRC?!頢BB(SubtractwithBorrow)帶借位的減法指令格式:SBBDST,SRC操作:DST←DST-SRC-CF☆
DEC(Decrement)減1指令格式:DECOPR操作:OPR←OPR-1
格式:AAS功能:在用SUB或SBB指令對兩個非壓縮十進(jìn)制數(shù)或以ASCII碼表示的十進(jìn)制數(shù)進(jìn)行相減后,對AL中所得結(jié)果進(jìn)行調(diào)整,在AL中得到一個正確的非壓縮十進(jìn)制數(shù)之差。如果有借位,則CF置1。AAS指令必須緊跟在SUB或SBB指令之后。調(diào)整過程為:若AL寄存器的低4位﹥9或AF=1,則:AL←AL-6,AF置1;將AL寄存器高4位清零;AH←AH-1,CF置1。否則,不需要調(diào)整。☆
AAS(ASCIIAdjustforSubtraction)減法的ASCII調(diào)整指令減法指令☆
DAS(DecirnalAdjustforSubtraction)減法的十進(jìn)制調(diào)整指令減法指令格式:DAS功能:在兩個壓縮十進(jìn)制數(shù)用SUB或SBB相減后,結(jié)果已存在AL中的情況下,對所得結(jié)果進(jìn)行調(diào)整,在AL中得到正確的壓縮十進(jìn)制數(shù)。同樣,它也要對AL中高半字節(jié)和低半字節(jié)分別進(jìn)行調(diào)整。調(diào)整過程為:如果AL寄存器的低4位﹥9或AF=1,則:AL←AL-6,AF置1。如果此時AL高半字節(jié)﹥9或標(biāo)志位CF=1,則:AL←AL-60H,CF置1。☆
NEG(Negate)取負(fù)指令(取補指令)格式:NEGOPR;按位取反加1(包括符號位)操作:OPR←0-OPR(或OPR←-OPR)。注意:取補指令不同于補碼?。∨e例:MOVAL,73HNEGAL;AL=?減法指令答案:AL=8DH☆CMP(Compare)比較指令格式:CMPDST,SRC功能:即:DST-SRC,結(jié)果不回送到目的操作數(shù)中,僅將結(jié)果反映在標(biāo)志位上,可用條件跳轉(zhuǎn)指令決定程序的去向。說明:比較指令主要用在希望比較兩個數(shù)的大小,而又不破壞原操作數(shù)的情況。
減法指令乘法指令☆MUL(Multiply)無符號數(shù)乘法指令格式:MULSRC操作:字節(jié)操作數(shù):AX←AL×SRC字操作數(shù):(DX,AX)←AX×SRC說明:SRC可以是寄存器,或是存儲單元,但不能是立即數(shù)。當(dāng)SRC是存儲單元時,必須在操作數(shù)前加B或W說明是字節(jié)還是字。舉例:MULBYTEPTR[SI]MULWORDPTR[BX]
MULDL說明:MUL指令執(zhí)行后影響CF和OF標(biāo)志。乘法指令使AF、PF、SF和ZF的狀態(tài)不定。如果結(jié)果的高半部分(字節(jié)操作為AH、字操作為DX)不為零,表明其內(nèi)容是結(jié)果的有效位,則CF和OF均置1。否則,CF和OF均清0?!頜UL(Multiply)無符號數(shù)乘法指令(續(xù))乘法指令☆I(lǐng)MUL(Integer
Multiply)帶符號數(shù)乘法指令乘法指令格式:IMULSRC操作:同MUL指令。功能:把乘數(shù)和累加器中的數(shù)都作為帶符號數(shù),進(jìn)行相乘。乘積的符號符合一般代數(shù)運算規(guī)則。說明:如果乘積的高半部分不是低半部分的符號擴展(不是全零或全1),則視高位部分為有效位,表示它是積的一部分,于是置CF=1,OF=1。若結(jié)果的高半部分為全零或全1,表明它僅包含了符號位,那么使CF=0,OF=0。利用這兩個標(biāo)志狀態(tài)可決定是否需要保存積的高位字節(jié)或高位字。IMUL指令執(zhí)行后,AF、PF、SF和ZF不定。☆DIV(Divisionunsigned)無符號數(shù)除法指令除法指令格式:DIVSRC操作:字節(jié)除數(shù):AL←AX/SRC的商;AH←AX/SRC的余數(shù)。字除數(shù):AX←(DX,AX)/SRC的商;DX←(DX,AX)/SRC的余數(shù)。說明:被除數(shù)、除數(shù)、商及余數(shù)均為無符號數(shù)。6個狀態(tài)標(biāo)志均無定義?!領(lǐng)DIV(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ù)相同。6個狀態(tài)標(biāo)志均無定義。商超過了目標(biāo)寄存器AL或AX所能存放數(shù)的范圍。這時系統(tǒng)會自動產(chǎn)生一個中斷類型號為0的除法錯中斷,相當(dāng)于執(zhí)行了除數(shù)為0的運算,所得的商和余數(shù)都不確定。這類指令的功能是對操作數(shù)最高位進(jìn)行擴展,用于處理帶符號數(shù)運算時的操作類型匹配問題?!?/p>
CBW(ConvertBytetoWord)把字節(jié)擴展為字指令格式:CBW功能:AL中字節(jié)的符號位擴展到AH中(即把AL中的最高位送入AH的所有位)☆CWD(ConvertWordtoDoubleWord)把字?jǐn)U展成雙字指令格式:CWD功能:把AX中字的符號位擴展到DX中(即把AH中的最高位送入DX的所有位)標(biāo)志:不影響任何標(biāo)志位。符號擴展指令補充例題:MOVAL,10011010B;CBW ;AX=1111111110011010B=0FF9AHAL=10011010B=9AHMOV DX,0;MOV AX,0FFABH;CWD ;(DX)=0(AX)=0FFABH(DX)=0FFFFH,(AX)=0FFABH§4.48086的指令系統(tǒng)
4.4.3邏輯運算與移位指令邏輯運算和移位指令對字節(jié)或字操作數(shù)進(jìn)行按位操作,這類運算可分成:邏輯運算(LogicalOperations)算術(shù)邏輯移位(shiftArithmeticandShiftLogical)循環(huán)移位(Rotate)邏輯運算指令☆邏輯與指令A(yù)ND格式:ANDDEST,SRC
操作:DEST←(DEST)(SRC)說明:運算法則為:1∧1=1,1∧0=0,0∧1=0,0∧0=0邏輯運算指令☆邏輯或指令OR格式:ORDEST,SRC
操作:DEST←(DEST)∨
(SRC)說明:運算法則為:1∨1=1,1∨0=1,0∨1=1,0∨0=0。格式:XORDEST,SRC;(DEST)←(DEST)(SRC)說明:運算法則為:1⊕1=0,1⊕0=1,0⊕1=1,0⊕0=0。邏輯運算指令☆邏輯異或指令XOR☆測試指令TEST格式:TESTDEST,SRC;FLAGS←(DEST)(SRC)功能:源地址和目的地址的內(nèi)容執(zhí)行按位的邏輯乘運算,結(jié)果不送入目的地址,只影響標(biāo)志位。邏輯運算指令☆邏輯非指令NOT:格式:NOTDEST;DEST←()功能:將目的地址中的內(nèi)容逐位取反后送入目的地址。補充知識:邏輯運算指令小結(jié)邏輯運算指令的操作均是按位進(jìn)行的。邏輯非NOT指令只有一個操作數(shù)。目的操作數(shù)可以是8位或16位寄存器或存儲器。對于存儲器操作數(shù),要說明其類型是字節(jié)還是字。指令執(zhí)行后,對標(biāo)志位無影響。其余邏輯運算指令均為雙操作數(shù)指令,SRC可以是8位或16位立即數(shù)、寄存器或存儲器,DST只能是寄存器或存儲器,兩個操作數(shù)不能同時為存儲器。指令執(zhí)行后,均將CF和OF清0,ZF、SF和PF反映操作結(jié)果,AF未定義,源操作數(shù)不變。
AND指令常用來對一個數(shù)據(jù)的指定位清零;
OR指令可用來對一些指定的位置置1;
XOR指令可用于將操作數(shù)的某些位取反;
TEST指令則常用于檢測某些數(shù)據(jù)的指定位是1還是0。小結(jié)算術(shù)邏輯移位指令☆算術(shù)左移指令SAL格式:SALDST,CNT最低位CF0最高位SAL移動☆邏輯左移指令SHL格式:SHLDST,CNT最低位CF0最高位SHL移動算術(shù)邏輯移位指令☆算術(shù)右移指令SAR格式:SARDST,CNT☆邏輯右移指令SHR格式:SHRDST,CNT最低位最高位CFSAR移動0最低位最高位CFSHR移動移位指令實現(xiàn)對操作數(shù)的移位操作。邏輯移位把操作數(shù)看成無符號數(shù)來移位,右移時,最高位補0,左移時,最低位補0算術(shù)移位則把操作數(shù)看做有符號數(shù),右移時最高位(符號位)保持不變,左移時,最低位補0DST可以是8位、16位寄存器或存儲器操作數(shù)。CNT為移位計數(shù)值,可以設(shè)定為1,也可以由寄存器CL確定其值。小結(jié)小結(jié)SHL和SAL兩條指令的功能完全相同,在機器中實際對應(yīng)同一種操作。對標(biāo)志位影響的情況是:AF總是無定義。PF、SF和ZF在指令執(zhí)行后被修改。CF總是等于目的操作數(shù)最后被移出去的那一位的值。OF的值多次移位的情況下是不確定。在移位次數(shù)為1的情況下,如果最高位(符號位)的值被改變,則OF標(biāo)志置1,否則OF清0。移位操作還可以實現(xiàn)對一個數(shù)乘以2n或除以2n的運算,這種方法的運算速度要比直接使用乘除法高很多。邏輯移位指令適用于無符號數(shù)運算,SHL用來乘以2n,SHR用于除以2n;算術(shù)移位指令用于對帶符號數(shù)運算,SAL用來乘以2n,SAR用于除以2n。
小結(jié)(續(xù))小結(jié)循環(huán)移位指令☆不帶進(jìn)位位的循環(huán)左移指令ROL格式:ROLDST,CNT☆不帶進(jìn)位位的循環(huán)右移指令ROR格式:RORDST,CNTCFROLROL移動CFRORROR移動循環(huán)移位指令☆帶進(jìn)位位的循環(huán)左移指令RCL格式:RCLDST,CNT☆帶進(jìn)位位的循環(huán)右移指令RCR格式:RCRDST,CNTCFRCLRCL移動CFRCRRCR移動小結(jié)小結(jié)4條指令都按指令中計數(shù)值規(guī)定的移位次數(shù)進(jìn)行循環(huán)移位,移位后的結(jié)果仍送回目的操作數(shù)。目的操作數(shù)可以是8/16位的寄存器操作數(shù)或內(nèi)存操作數(shù),循環(huán)移位的次數(shù)可以是1,也可以由CL寄存器的值指定。這4條指令中,ROL和ROR指令沒有把進(jìn)位標(biāo)志CF包含在循環(huán)中,而RCL和RCR指令把CF作為整個循環(huán)的一部分,一起參加循環(huán)移位。OF位只有在移位次數(shù)為1的時候才有效,在移位后當(dāng)前最高有效位(符號位)發(fā)生變化時,則OF標(biāo)志置1,否則OF置0。在多位循環(huán)移位時,OF的值是不確定的。CF的值總是由最后一次被移出的值決定?!?.48086的指令系統(tǒng)
4.4.4串操作指令字符串(String)是指一系列存放在存儲器中的字或字節(jié)數(shù)據(jù)。字符串長度可達(dá)64K字節(jié),組成字符串的字節(jié)或字稱為字符串元素,每種字符串指令對字符串中的元素只進(jìn)行同一種操作。8086提供5條1字節(jié)的字符串操作指令,專門對存儲器中的字節(jié)串和字串?dāng)?shù)據(jù)進(jìn)行。分類:傳送(MoveString)、比較(CompareString)、掃描(ScanString)、存儲(StoreString)、裝入(LoadString)。
字符串的傳送MOVS格式1:MOVSB;(ES:DI)(DS:SI),SISI±1,;DIDI±1格式2:MOVSW;(ES:DI)(DS:SI),SISI±2,;DIDI±2功能:將以SI為指針的源串中的一個字節(jié)(或字)存儲單元中的數(shù)據(jù)傳送至以DI為指針的目的地址中去,并自動修改指針,使之指向下一個字節(jié)(或字)存儲單元。在使用MOVS指令進(jìn)行字符串傳送時,傳送方向由DF控制。如果源字符串與目標(biāo)字符串不重迭,則傳送方向可以任意?!⒁猓╝)源和目的不重疊,DF取值任意
源串目的串低地址高地址若源字符串與目標(biāo)字符串部分重迭,則傳送方向要特別注意。當(dāng)源字符串的地址低于目標(biāo)字符串的地址時,則應(yīng)該自動減量(置DF=1),從高地址開始傳送。(b)源和目的下重疊,
DF=1
源串目的串低地址高地址當(dāng)源字符串的地址高于目標(biāo)字符串的地址時,則應(yīng)該自動增量(置DF=0),從低地址開始傳送。源串目的串低地址高地址(c)源和目的上重疊,
DF=0
格式1:CMPSB;FLAGS(DS:SI)-(ES:DI),;SISI±1,DIDI±1格式2:CMPSW;FLAGS(DS:SI)-(ES:DI),;SISI±2,DIDI±2字符串的比較指令CMPS功能:將SI所指的源串中的一個字節(jié)(或字)存儲單元中的數(shù)據(jù)與DI所指的目的串中的一個字節(jié)(或字)存儲單元中的數(shù)據(jù)相減,并根據(jù)相減的結(jié)果設(shè)置標(biāo)志,但結(jié)果并不保存。字符串的掃描指令SCAS功能:AL(字節(jié))或AX(字)中的內(nèi)容與DI所指的目的串中的一個字節(jié)(或字)存儲單元中的數(shù)據(jù)相減,根據(jù)相減結(jié)果設(shè)置標(biāo)志位,結(jié)果不保存。利用SCAS指令,可在內(nèi)存中搜索所需要的數(shù)據(jù)。被搜索的數(shù)據(jù)也稱為關(guān)鍵字。指令執(zhí)行前,先將關(guān)鍵字存在AL(字節(jié))或AX(字)中,才能用SCAS指令進(jìn)行搜索。格式1:SCASB;FLAGSAL-(ES:DI),DIDI±1格式2:SCASW;FLAGSAX-(ES:DI),DIDI±2字符串的裝入指令LODS格式1:LODSB;AL(DS:SI),SISI±1格式2:LODSW;AX(DS:SI),SISI±2字符串的存儲指令STOS格式1:STOSB;(ES:DI)AL,DIDI±1格式2:STOSW;(ES:DI)AX,DIDI±2為了加快串運算指令的執(zhí)行速度,可在基本指令前加重復(fù)前綴,使數(shù)據(jù)串指令重復(fù)執(zhí)行。每重復(fù)執(zhí)行一次,地址指針SI和DI都根據(jù)方向標(biāo)志DF自動進(jìn)行修改,CX的值則自動減1。
REP:REP前綴用在MOVS指令前。功能:每執(zhí)行一次串指令,(CX)-1,直到(CX)=0,重復(fù)執(zhí)行結(jié)束。
REPZ
:該指令一般用在CMPS、SCAS指令前。功能:每執(zhí)行一次串指令,(CX)-1,并判斷ZF標(biāo)志是否為0,只要(CX)=0或ZF=0,則重復(fù)執(zhí)行結(jié)束。
REPNZ
:該指令一般用在CMPS、SCAS指令前。功能:每執(zhí)行一次串指令,(CX)-1,并判斷ZF標(biāo)志是否為0,只要(CX)=0或ZF=1,則重復(fù)執(zhí)行結(jié)束。重復(fù)過程:1、檢測CX。若CX=0,則退出串操作;否則繼續(xù)執(zhí)行2。2、完成一次串操作。3、修改地址指針,SISI±1(或2)DIDI±1(或2)。4、CXCX-15、若重復(fù)前綴為REP,則轉(zhuǎn)1執(zhí)行;若重復(fù)前綴為REPZ,且ZF=1時,則轉(zhuǎn)1執(zhí)行;否則退出串操作;若重復(fù)前綴為REPNZ,且ZF=0時,則轉(zhuǎn)1執(zhí)行;否則退出串操作。表4-10串操作指令及重復(fù)前綴分組指令名稱命令格式操作串操作指令串傳送(字節(jié),字串傳送)MOVSDST,SRC(MOVSB,MOVSW)(ES:DI)←(DS:SI),SI←SI±1或2,DI←DI±1或2串比較(字節(jié),字串比較)CMPSDST,SRC(CMPSB,CMPSW)(ES:DI)?(DS:SI),SI←SI±1或2,DI←DI±1或2串掃描(字節(jié),字串掃描)SCASDST,SRC(SCASB,SCASW)AL或AX?(ES:DI),DI←DI±1或2取串(取字節(jié),字串)LODSSRC(LODSB,LODSW)AL或AX←(DS:SI),SI←SI±1或2存串(存字節(jié),字串)STOSDST(STOSB,STOSW)(ES:DI)←AL或AX,DI←DI±1或2重復(fù)前綴無條件重復(fù)前綴REP使其后的串操作重復(fù)執(zhí)行,每執(zhí)行一次,CX的內(nèi)容減1,直至CX=0相等/為零重復(fù)前綴REPE/REPZ當(dāng)ZF=1且CX≠0時,重復(fù)執(zhí)行其后的串操作,每執(zhí)行一次,CX的內(nèi)容減1,直至ZF=0或CX=0不相等/不為零重復(fù)前綴REPNE/REPNZ當(dāng)ZF=0且CX≠0時,重復(fù)執(zhí)行其后的串操作,每執(zhí)行一次,CX的內(nèi)容減1,直至ZF=1或CX=0小結(jié)源串位于當(dāng)前數(shù)據(jù)段中,由DS尋址,源串的元素由SI作指針,即源串字符的起始地址(或末地址)為DS:SI,源串允許使用段超越前綴來修改段地址。目的串必須位于當(dāng)前附加段中,由ES尋址,目的串元素由DI作指針,即目的串字符的起始地址(或末地址)為ES:DI,但目的串不允許使用段超越前綴修改ES。如果要在同一段內(nèi)進(jìn)行串運算,必須使DS和ES指向同一段。每執(zhí)行一次字符串指令,指針SI和DI會自動進(jìn)行修改,以便指向下一待操作單元。DF標(biāo)志控制字符串處理的方向。要處理的字符串長度(字節(jié)或字?jǐn)?shù))放在CX寄存器中。補充知識如果已知兩個數(shù)據(jù)塊的內(nèi)容基本上是相同的,若要尋找其中是否有不一致的地方,則應(yīng)使用CMP指令查找,并在CMP指令前使用REPE/REPZ前綴。如果已知兩個數(shù)據(jù)塊的內(nèi)容基本是不相同的,若要尋找其中相一致的地方,則應(yīng)使用CMP指令查找,并在CMP指令前使用REPNE/REPNZ前綴。例4-22要求把數(shù)據(jù)段DS中以SRC_MESS為偏移地址的一串字符“HELLO!”,傳送到附加段ES中以NEW_LOC開始的單元中,寫出其指令代碼?解:實現(xiàn)該操作的程序如下:
DATASEGMENT
;數(shù)據(jù)段
SRCMESSDB‘HELLO!’ ;源串
DATAENDS
EXTRASEGMENT
;附加段
NEWLOCDB6DUP(?);存放目的串
EXTRAENDS
CODESEGMENT
;代碼段
ASSUMECS:CODE,DS:DATA,ES:EXTRA程序頭START:MOVAX,DATA MOVDS,AX;DS←數(shù)據(jù)段段址 MOVAX,EXTRA MOVES,AX ;ES←附加段段址 LEASI,SRCMESS;SI指向源串偏移地址
LEADI,NEWLOC;DI指向目的串偏移地址 MOVCX,6 ;CX作串長度計數(shù)器 CLD ;清方向標(biāo)志,地址增量DF=0
REPMOVSB ;重復(fù)傳送串中的各字節(jié)直到
;CX=0為止
CODEENDS
ENDSTART本例中的REPMOVSB指令也可用以下幾條指令代替:AGAIN:MOVSNEWLOC,SRCMESSDECCXJNZAGAIN初始化例4-23在某一字符串中搜尋是否有字符A,若有,則把搜索次數(shù)記下來,送到BX寄存器中,若沒有查到,則將BX寄存器清0。寫出其指令代碼。解:設(shè)字符串起始地址STRING的偏移地址為0,字符串長度為CX。程序段如下:MOVDI,OFFSETSTRING ;DI=字符串偏移地址(相對于LEADI,STRING)MOVCX,COUNT ;CX=字符串長度MOVAL,‘A’ ;AL=關(guān)鍵字A的ASCII碼CLD ;清方向標(biāo)志REPNESCASB;CX≠0(沒查完)和ZF=0(不相等)時重復(fù)JZFIND;若ZF=1,表示已搜到,轉(zhuǎn)出MOVDI,0 ;若ZF=0,表示沒搜到,DI=0FIND:MOVBX,DI;BX=搜索次數(shù)HLT;停機
例4-24若在數(shù)據(jù)段中有一個數(shù)據(jù)塊,起始地址為BLOCK,數(shù)據(jù)塊中的數(shù)為8位帶符號數(shù),要求將其中所含的正、負(fù)數(shù)分開,然后把正數(shù)送到附加段中始址為PLUS_DATA的緩沖區(qū),負(fù)數(shù)則送到附加段中始址為MINUS_DATA的緩沖區(qū)。寫出其指令代碼。
解:可以將這塊數(shù)據(jù)看成一個數(shù)據(jù)串,用SI作源串指針,DI和BX分別作正、負(fù)數(shù)目的緩沖區(qū)的指針,CX用于控制循環(huán)次數(shù),可寫出如下程序段:START:MOVSI,OFFSETBLOCK ;SI為源串指針
MOVDI,OFFSETPLUS_DATA;DI為正數(shù)目的區(qū)指針
MOVBX,OFFSETMINUS_DATA;BX為負(fù)數(shù)目的區(qū)指針
MOVCX,COUNT ;CX放循環(huán)次數(shù)
CLDGOON:LODSBBLOCK;AL←取源串的一個字節(jié)
TESTAL,80H ;是負(fù)數(shù)?JNZMINUS ;是,轉(zhuǎn)MINUSSTOSB ;
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年無錫2024年道路旅客運輸從業(yè)資格證模擬試題
- 2024年七臺河公交車從業(yè)資格證考試
- 無線內(nèi)窺鏡分析軟件需求分析說明書
- 全省技工院校職業(yè)技能大賽技術(shù)文件-焊工技術(shù)文件(高級組)
- 項目管理(第四版)習(xí)題答案 陳惠源
- 北京師范大學(xué)實驗華夏女子中學(xué) 2024-2025學(xué)年上學(xué)期學(xué)業(yè)評價 七年級數(shù)學(xué)試題
- 新疆烏魯木齊實驗學(xué)校2024-2025學(xué)年九年級上學(xué)期期中數(shù)學(xué)試卷
- 游泳比賽場地租賃協(xié)議
- 城市景觀水體養(yǎng)護水務(wù)施工合同
- 租賃車輛管理辦法
- 長沙市建筑節(jié)能與綠色建筑相關(guān)技術(shù)措施實施情況表
- 用火用電用氣安全
- 教師專業(yè)培訓(xùn)項目式教學(xué)
- 心外科工作制度(12項工作制度)
- 課堂大比武活動總結(jié)
- 職業(yè)衛(wèi)生檢測與評價學(xué)習(xí)通課后章節(jié)答案期末考試題庫2023年
- 2023學(xué)年完整公開課版夜黑黑
- 優(yōu)雅小主婦的美容養(yǎng)顏經(jīng)
- 全國優(yōu)質(zhì)課大賽一等獎初中七年級道德與法治《師生交往》精美課件
- 初中藝術(shù)鄂教七年級上冊漫步藝術(shù)長廊舞劇欣賞《永不消逝的電波》
- 五年級科學(xué)期中考試質(zhì)量分析
評論
0/150
提交評論