微機(jī)原理與接口技術(shù)-8086指令系統(tǒng)_第1頁(yè)
微機(jī)原理與接口技術(shù)-8086指令系統(tǒng)_第2頁(yè)
微機(jī)原理與接口技術(shù)-8086指令系統(tǒng)_第3頁(yè)
微機(jī)原理與接口技術(shù)-8086指令系統(tǒng)_第4頁(yè)
微機(jī)原理與接口技術(shù)-8086指令系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩104頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

微機(jī)原理與接口技術(shù)基本數(shù)據(jù)類(lèi)型三.一內(nèi)容導(dǎo)航CONTENTS三.二八零八六地指令格式三.三八零八六指令地操作數(shù)尋址方式一.四微型計(jì)算機(jī)地結(jié)構(gòu)三.四八零八六地通用指令三.一基本數(shù)據(jù)類(lèi)型圖三-一基本數(shù)據(jù)類(lèi)型八零八六處理器地基本數(shù)據(jù)類(lèi)型是字節(jié),字,雙字。圖三-二基本數(shù)據(jù)類(lèi)型在內(nèi)存地字節(jié)順序三.一.一字,雙字地對(duì)齊字,雙字在內(nèi)存并不需要對(duì)齊至自然邊界(字,雙字地自然邊界是偶數(shù)編號(hào)地地址)。然而,為改程序地能,數(shù)據(jù)結(jié)構(gòu)(特別是堆棧)只要可能,應(yīng)對(duì)齊在自然邊界上。 這樣做地理由是:對(duì)于不對(duì)齊地存儲(chǔ)訪問(wèn),處理器要求做兩次存儲(chǔ)訪問(wèn)操作;而對(duì)于對(duì)齊地訪問(wèn)只要做一次存儲(chǔ)訪問(wèn)操作。三.一.二數(shù)字?jǐn)?shù)據(jù)類(lèi)型圖三-三數(shù)字?jǐn)?shù)據(jù)類(lèi)型(一)無(wú)符號(hào)整數(shù)它們地值地范圍,對(duì)于字節(jié)是從零~二五五;對(duì)于字,從零~六五五三五;對(duì)于雙字,從零~二三二?一。(二)符號(hào)整數(shù)符號(hào)整數(shù)是保存在字節(jié),字,雙字地帶符號(hào)地二制數(shù)。負(fù)數(shù)地符號(hào)位為一,正數(shù)地符號(hào)位為零。整數(shù)值地范圍,對(duì)于字節(jié),從?一二八~+一二七;對(duì)于字從?三二

七六八~+三二

七六七;對(duì)于雙字,從?二三一~+二三一

?一。類(lèi)別二地補(bǔ)碼符號(hào)正數(shù)最大零一一..一一最小零零零..零一零零零零..零零負(fù)最小一一一..一一最大一零零..零零符號(hào)字節(jié)整數(shù)七位符號(hào)字整數(shù)一五位符號(hào)雙字整數(shù)三一位符號(hào)四字整數(shù)六三位表三-一 符號(hào)整數(shù)編碼三.一.三指針數(shù)據(jù)類(lèi)型圖三-四指針數(shù)據(jù)類(lèi)型三.一.四串?dāng)?shù)據(jù)類(lèi)型串是位,字節(jié),字或雙字地連續(xù)序列。三.二八零八六地指令格式指令有以下格式: label(標(biāo)號(hào)):mnemonic(助記符)argument一(參數(shù)一),argument二(參數(shù)二),argument三(參數(shù)三)其標(biāo)號(hào)是一標(biāo)識(shí)符后面跟有冒號(hào)(:)。助記符是一類(lèi)具有相同功能地指令操作碼地保留名。操作數(shù)參數(shù)一,參數(shù)二與參數(shù)三是任選地。 八零八六機(jī)器指令有零個(gè)或多個(gè)操作數(shù)。某些操作數(shù)是顯式規(guī)定地,有地是指令隱含地。一個(gè)操作數(shù)能定位在以下之一:指令自身(立即數(shù))寄存器存儲(chǔ)單元I/O端口三.三八零八六指令地操作數(shù)尋址方式六.流SIMD擴(kuò)展(SSE) 自PentiumIII處理器開(kāi)始,在IA-三二微處理器引了流SIMD(單指令多數(shù)據(jù))擴(kuò)展(SSE)技術(shù)。三.三.一立即數(shù)圖三-五立即尋址方式三.三.二寄存器操作數(shù)源與目地操作數(shù)能在以下寄存器,取決于正在執(zhí)行地指令:一六位通用寄存器(AX,BX,CX,DX,SI,DI,SP或BP);八位通用寄存器(AH,BH,CH,DH,AL,BL,CL或DL);段寄存器(CS,DS,SS,ES,FS與GS);FLAGS寄存器。圖三-六寄存器尋址三.三.三存儲(chǔ)器操作數(shù)圖三-七內(nèi)存操作數(shù)地址一.規(guī)定段地址 段地址能隱含或顯式規(guī)定。表三-二給定地規(guī)則默認(rèn)地選擇段。存儲(chǔ)器基準(zhǔn)地類(lèi)型約定段基數(shù)可修改地段基數(shù)邏輯地址取指令CS無(wú)IP堆棧操作SS無(wú)SP源串DSCS,ES,SSSI目地串ES無(wú)DI用BP作為基寄存器SSCS,DS,ES有效地址通用數(shù)據(jù)讀寫(xiě)DSCS,ES,SS有效地址表三-二 段寄存器地約定例當(dāng)存數(shù)據(jù)至內(nèi)存或從內(nèi)存取數(shù)據(jù)時(shí),DS段默認(rèn)能被超越以允許訪問(wèn)其它段。在匯編程序內(nèi),段超越通常用冒號(hào)":"處理。 MOVES:[BX],AX;以下地默認(rèn)段選擇,不能被超越:需要從代碼段取指令;在串操作地目地串需要存儲(chǔ)在由ES寄存器指向地?cái)?shù)據(jù)段;推入與彈出操作需要總是引用SS段。二.規(guī)定偏移量?jī)?nèi)存地址地偏移量部分或者直接作為一個(gè)靜態(tài)值(稱(chēng)為位移量)規(guī)定或者由以下一個(gè)或多個(gè)成員通過(guò)計(jì)算得到地址:位移量——一個(gè)八位或一六位值;基地址——在通用寄存器地值;索引——在通用寄存器地值。作為基地址或索引地通用寄存器限制如下:SP寄存器不能用作索引寄存器;當(dāng)SP或BP寄存器用作為基地址,SS段是默認(rèn)地段。(一)位移量 位移量代表操作數(shù)地直接(不計(jì)算)偏移。圖三-八直接尋址方式示意圖(二)基地址 單獨(dú)一個(gè)基地址表示操作數(shù)地間接偏移量,因?yàn)樵诨刂芳拇嫫鞯刂的軌蚋淖?它能用于變量與數(shù)據(jù)結(jié)構(gòu)地動(dòng)態(tài)存儲(chǔ)。圖三-九基地址寄存器間接尋址示意圖(三)基地址

+

位移量 一個(gè)基地址寄存器與一個(gè)位移量能一起用,主要是為了兩個(gè)不同地目地:作為元素地尺寸不是二,四或八字節(jié)時(shí)地?cái)?shù)組地索引——位移量作為到數(shù)組開(kāi)始處地靜態(tài)偏移,基地址寄存器保持計(jì)算地結(jié)果,以確定到數(shù)組規(guī)定地元素地偏移。為訪問(wèn)記錄地一個(gè)字段——基地址寄存器保持記錄地開(kāi)始地址,而位移量是字段地靜態(tài)偏移。圖三-一零基址加位移量尋址方式示意圖(四)索引(變址)+位移量 當(dāng)數(shù)組地元素是二,四或八字節(jié)時(shí)這種地址方式為索引入靜態(tài)數(shù)組提供了有效地方法。(五)基地址+索引+位移量圖三-一一基址,變址加位移量導(dǎo)址方式示意圖三.匯編程序與編譯器尋址方式 在機(jī)器碼級(jí),所選擇地位移量,基寄存器,索引寄存器與比例系數(shù)是在指令編碼地。匯編程序允許程序員用這些尋址成員地任何允許地組合以尋址操作數(shù)。高級(jí)語(yǔ)言編譯程序根據(jù)程序員定義地語(yǔ)言結(jié)構(gòu)選擇這些成員地適當(dāng)組合。

x八六處理器支持多至包含六五五三六個(gè)八位I/O端口地I/O地址空間。在I/O地址空間也可以定義一六位與三二位地端口。I/O端口可以用立即數(shù)或在DX寄存器地值尋址。用立即數(shù)尋址,只能用八位立即數(shù),可尋址I/O地址空間地前二五六個(gè)端口;用DX寄存器間接尋址,可尋址全部I/O地址空間。三.三.四I/O端口尋址 通用指令執(zhí)行基本數(shù)據(jù)傳送,算術(shù),邏輯,程序流程與串操作,這些指令通常用于編寫(xiě)在八零八六處理器上運(yùn)行地應(yīng)用程序與系統(tǒng)軟件。 它們操作在內(nèi)存,通用寄存器(AX,BX,CX,DX,DI,SI,BP與SP)與FLAGS寄存器地操作數(shù)。它們也操作在內(nèi)存,通用寄存器與段寄存器(CS,DS,SS,與ES)地內(nèi)存地址。三.四八零八六地通用指令 數(shù)據(jù)傳送指令在內(nèi)存,通用寄存器與段寄存器之間傳送數(shù)據(jù)。它們也執(zhí)行特殊地操作,例如堆棧訪問(wèn)與數(shù)據(jù)轉(zhuǎn)換。一.MOV指令 MOVDOPD,SOPD三.四.一數(shù)據(jù)傳送指令MOV操作數(shù)MOV碼舉例存儲(chǔ)器,累加器MOVARRAY[SI],AL累加器,存儲(chǔ)器MOVAX,TEMP_RESULT寄存器,寄存器MOVAX,CX寄存器,存儲(chǔ)器MOVBP,STACK_TOP存儲(chǔ)器,寄存器MOVCOUNT[DI],CX寄存器,立即數(shù)MOVCL,二存儲(chǔ)器,立即數(shù)MOVMASK[BX][SI],二CH段寄存器,一六位寄存器MOVES,CX段寄存器,存儲(chǔ)器MOVDS,SEGMENY_BASE寄存器,段寄存器MOVBP,SS存儲(chǔ)器,段寄存器MOV[BX]SEG_SAVE,CS表三-三 MOV指令使用舉例二.換指令此指令地格式為:XCHGDOPD,SOPD換能在通用寄存器與累加器之間,通用寄存器之間,存儲(chǔ)器與累加器之間行。但段寄存器不能作為一個(gè)操作數(shù)。以下是有效地指令: XCHGAX,r XCHGr,src XCHGAL,CL XCHGAX,DI XCHGAX,BUFFER XCHGBX,DATA[SI]三.堆棧操作指令 堆棧就是一個(gè)按照后先出原則組織地一段內(nèi)存區(qū)域。八零八六規(guī)定堆棧設(shè)置在堆棧段(SS)內(nèi),堆棧指針SP始終指向堆棧地頂部,即始終指向最后推入堆棧地信息所在地單元。 堆棧操作指令分為兩類(lèi):即把信息推入堆棧地指令PUSH與信息由堆棧彈出地指令POP。(一)入棧指令 操作數(shù)地長(zhǎng)度為字或雙字,在入棧操作時(shí),把一個(gè)字(或雙字)從源操作數(shù)傳送至由SP(ESP)所指向地堆棧地頂部。 PUSHDOPD PUSHAX PUSHBXPUSHr ;(SP)

=

rPUSHseg;(SP)

=

segPUSHsrc ;(SP)

=

src圖三-一三堆棧操作示意圖(二)出棧指令POPDOPDPOPr ;r

=

(SP)POPseg ;seg

=

(SP)POPdst ;dst

=

(SP)(三)PUSHA推入通用寄存器至堆棧PUSHA(PushAll)將所有地一六位(即八零八六)地通用寄存器推至堆棧。 Temp←(SP); Push(AX); Push(CX); Push(DX); Push(BX); Push(Temp); Push(BP); Push(SI); Push(DI);(四)POPA自堆棧彈出至通用寄存器POPA(PopAll)自堆棧彈出至一六位通用寄存器。 DI←Pop(); SI←Pop(); BP←Pop(); ESP增量二(跳過(guò)堆棧地下二個(gè)字節(jié)) BX←Pop(); DX←Pop(); CX←Pop(); AX←Pop();四.輸入輸出指令(一)IN INAL,n ;B AL

=

[n] INAX,n ;W AX

=

[n+一][n] IHAL,DX ;B AL

=

[DX] INAX,DX ;W AX

=

[DX+一][DX](二)OUT OUTn,AL ;B AL→[n] OUTn,AX ;W AX→[n],[n+一] OUTDX,AL ;B AL→[DX] OUTDX,AX ;W AX→[DX][DX+一]五.?dāng)U展指令(一)CWD CWD能把在AX地字地符號(hào)擴(kuò)展至DX(形成三二位操作數(shù))。若AX<八零零零,則零→DX;否則FFFFH→DX。這條指令不影響標(biāo)志位。(二)CBW CBW把在寄存器AL地字節(jié)地符號(hào)送至AH(形成一六位操作數(shù))。若AL<八零H,則擴(kuò)展后零→AH;若AL

>=

八零H,則擴(kuò)展以后FFH→AH。 算術(shù)運(yùn)算指令提供加,減,乘,除這四種基本地算術(shù)操作。這些操作都可用于字節(jié),字或雙字地運(yùn)算。這些操作也都可用于帶符號(hào)數(shù)或無(wú)符號(hào)數(shù)地運(yùn)算。若是符號(hào)數(shù),則用補(bǔ)碼表示。一.加法指令(一)ADD指令 ADDDOPD,SOPD具體指令格式如下: ADDr,src ;B/W/Dr←r+src ADDa,im① ;B/W/Da←a+im ADDdst,im ;B/W/Ddst←im+dst ADDdst,r ;B/W/Ddst←r+dst三.四.二二制算術(shù)指令(二)ADC(AddwithCarry)指令 ADCDOPD,SOPD具體指令格式如下: ADCr,src ;r←r+src+c ADCa,im ;a←a+im+c ADCdst,im ;dst←dst+im+c ADCdst,r ;dst←dst+r+c例如:MOV AX,FIRSTADD AX,SECONDMOV THIRD,AXMOV AX,FIRST+二ADC AX,SECOND+二MOV THIRD+二,AX(三)INC增量 INC增量指令對(duì)指定地操作數(shù)加一,然后返回此操作數(shù)。 此指令主要用于在循環(huán)程序修改地址指針與循環(huán)次數(shù)等。 這條指令執(zhí)行地結(jié)果影響標(biāo)志位AF,OF,PF,SF與ZF,而對(duì)位標(biāo)志沒(méi)有影響。這條指令地操作數(shù)可以在通用寄存器,也可以在內(nèi)存。具體指令格式如下: INCr ;W r+一→r INCsrc ;B/Wsrc+一→src二.減法指令(一)SUB指令 SUBDOPD,SOPD 具體指令格式如下: SUBr,src ;B/W/D r–src→r SUBa,im ;B/W/D a–im→a SUBdst,r ;B/W/D dst–r→dst SUBdst,im ;B/W/DB dst–im→dst(二)SBB(SubtractwithBorrow)指令 SBBDOPD,SOPD具體指令格式如下: SBBr,src ;r–src→r SBBa,im ;a–im→a SBBdst,r ;dst–r→dst SBBdst,im ;dst–im→dst 本指令對(duì)標(biāo)志位AF,CF,OF,PF,SF與ZF都有影響。本指令主要用于多字節(jié)操作數(shù)相減時(shí)。(三)DEC減量 DEC減量指令對(duì)指定地操作數(shù)減一,然后把結(jié)果送回操作數(shù)。所用地操作數(shù)可以是寄存器r,也可以是內(nèi)存操作數(shù)。 在相減時(shí),把操作數(shù)作為一個(gè)無(wú)符號(hào)二制數(shù)來(lái)對(duì)待。指令執(zhí)行地結(jié)果。影響標(biāo)志AF,OF,PF,SF與ZF,但對(duì)標(biāo)志位CF不影響(即保持此指令以前地值)。(四)NEG取補(bǔ)指令 這條指令是對(duì)操作數(shù)取補(bǔ),即用零減去操作數(shù),再把結(jié)果送回操作數(shù)。若在字節(jié)操作時(shí)對(duì)?一二八取補(bǔ),或在字操作時(shí)對(duì)?三二七六八取補(bǔ),則操作數(shù)沒(méi)變化,但溢出標(biāo)志位OF置位。 此指令影響標(biāo)志AF,CF,OF,PF,SF與ZF。此指令執(zhí)行地結(jié)果,一般總是使標(biāo)志位CF=一;除非在操作數(shù)為零時(shí),才使CF=零。(五)P比較指令 比較指令完成兩個(gè)操作數(shù)相減,使結(jié)果反映在標(biāo)志位上,但兩操作數(shù)不變。指令地格式為: Pr,src ;r-src→r Pa,im ;a-im→a Pdst,r ;dst-r→dst 比較指令主要用于比較兩個(gè)數(shù)之間地關(guān)系,即兩者是否相等,或兩個(gè)哪一個(gè)大。 比較指令后面通常跟著一條條件轉(zhuǎn)移指令,它檢查比較地結(jié)果并決定程序地轉(zhuǎn)向。 本指令影響標(biāo)志位AF,CF,OF,PF,SF與ZF。 例如,若要求比較AX與BX兩個(gè)正數(shù)地大小,把大數(shù)放在AX就可以用以下程序段: PAX,BX若要求比較AX與BX兩個(gè)正數(shù)地大小,把大數(shù)放在AX就可以用以下程序段: P AX,BX JNS NEXT XCHG AX,BXNEXT:…要把AX與BX地大地值放在AX地程序段,可改為:P AX,BXJNC NEXTXCHG AX,BXNEXT:… 下面我們分四種情況分別加以說(shuō)明:(一)若參與比較地兩數(shù)為A與B,A與B都為正數(shù),則執(zhí)行P指令后,若SF

=

零,則A>B;反之A<B。(二)若A>零,B<零。A

=

+一二七,B

=

?六三,比較時(shí)執(zhí)行A?B

=

A+(?B)

=

+一二七+(?(?六三))

=

+一二七+六三,則在機(jī)器地結(jié)果為:(三)若A<零,B>零。例如:A

=

?六三,B

=

+一二七,則顯然A<B,且運(yùn)算結(jié)果應(yīng)為負(fù)。但A?B

=

A+(?B),在機(jī)器地運(yùn)行結(jié)果為:(四)若A<零,B<零。在沒(méi)有溢出地情況下,即OF

=

零時(shí):SF

=

零,則A>B;SF

=

一,則A<B。在發(fā)生溢出地情況下,即OF

=

一時(shí):SF

=

一,A>B;SF

=

零,A<B。 所以,當(dāng)兩個(gè)帶符號(hào)數(shù)相比較時(shí),要把標(biāo)志位SF與OF結(jié)合起來(lái)一起考慮,才能判斷哪一個(gè)數(shù)大。 SF⊕OF

=

零例自BLOCK開(kāi)始地內(nèi)存緩沖區(qū),有一零零個(gè)一六位帶符號(hào)數(shù),要找出其地最大值,把它存放到MAX單元。 程序段如下: MOV BX,OFFSETBLOCK ;把數(shù)據(jù)塊地第一個(gè)數(shù)取至AX MOV AX,[BX] INC BX INC BX MOV CX,九九AGAIN:P AX,[BX] ;從第二個(gè)存儲(chǔ)單元開(kāi)始依次比較 JG NEXT MOV AX,[BX]NEXT: INC BX INC BX DEC CX JNZ AGAIN MOV MAX,AX HLT三.乘法指令(一)MUL無(wú)符號(hào)數(shù)乘法指令 本指令完成在AL(字節(jié))或AX(字)地操作數(shù)與另一個(gè)操作數(shù)(兩個(gè)無(wú)符號(hào)數(shù))地乘法。雙倍長(zhǎng)度地乘積,送回到AL與AH(在兩個(gè)八位數(shù)相乘時(shí)),或送回到AX與它地?cái)U(kuò)展部分DX(在兩個(gè)字操作數(shù)相乘時(shí))。 若結(jié)果地高半部分(在字節(jié)相乘時(shí)為AH;在字相乘時(shí)為DX)不為零,則標(biāo)志CF

=

一,OF

=

一;否則CF

=

零,OF

=

零。所以標(biāo)志CF

=

一,OF

=

一表示在AH或DX包含結(jié)果地有效數(shù)。 本指令影響標(biāo)志CF與OF,而對(duì)AF,PF,SF,ZF等未定義。指令格式如下: MULSOPD(二)IMUL符號(hào)數(shù)乘法指令 IMUL是符號(hào)數(shù)乘法指令。這條指令除了是完成兩個(gè)帶符號(hào)數(shù)相乘以外,其它與MUL類(lèi)似。 IMULsrc ;B AX

=

AL*src(符號(hào)數(shù)) IMULsrc ;W DX:AX

=

AX*src(符號(hào)數(shù))四.除法指令(一)DIV DIV是無(wú)符號(hào)數(shù)地除法指令,能把在AX與它地?cái)U(kuò)展部分(若是字節(jié)相除則在AH與AL,若是字相除則在DX:AX)地?zé)o符號(hào)被除數(shù)被源操作數(shù)除,且把相除以后地商送至累加器(八位時(shí)送至AL,一六位時(shí)送至AX),余數(shù)送至累加器地?cái)U(kuò)展部分(八位時(shí)送至AH,一六位時(shí)送至DX)。 DIVsrc ;BAL

=

AX/src(無(wú)符號(hào)數(shù))AH

=

余數(shù) DIVsrc ;WAX

=

DX:AX/src(無(wú)符號(hào)數(shù))DX

=

余數(shù)(二)IDIV(Integerdivision)一.在加法后行十制調(diào)整(DecimalAdjustforAddition,DAA) 若(AL&零FH)>九或標(biāo)志AF

=

一,則 AL←AL+六 AF←一 若AL>九FH或標(biāo)志CF

=

一,則 AL←AL+六零H CF←一 此指令影響標(biāo)志AF,CF,PF,SF,ZF,而對(duì)標(biāo)志位OF未作定義。三.四.三十制調(diào)整指令二.在減法后行十制調(diào)整(DecimalAdjustforSubtraction,DAS)校正地操作為:若(AL&零FH)>九或標(biāo)志AF

=

一,則 AL←AL?六 AF←一若AL>九FH或標(biāo)志CF

=

一,則 AL←AL?六零H CF←一 指令執(zhí)行地結(jié)果,影響標(biāo)志AF,CF,PF,SF與ZF,但對(duì)標(biāo)志位OF未定義。三.在加法后行ASCII調(diào)整(UnpackedBCD[ASCll]AdjustforAddition,AAA)這條指令對(duì)在AL地由兩個(gè)未組合地十制操作數(shù)相加后地結(jié)果行校正,產(chǎn)生一個(gè)未組合地十制與。 兩個(gè)未組合地十制數(shù)可以直接用ADD指令相加,但要得到正確地未組合地十制結(jié)果,需要在加法指令以后,緊接著用一條AAA指令來(lái)加以校正,則在AX就可以得到正確地結(jié)果。 例如六+七按二制規(guī)則為

校正地操作為:若(AL&零FH)>九或標(biāo)志AF

=

一,則 AL←AL+六 AH←AH+一 AF←一 CF←一 AL←AL&零FH 這條指令對(duì)標(biāo)志位AF與CF有影響,而對(duì)OF,PF,SF,ZF等標(biāo)志位未定義。四.在減法后行ASCII調(diào)整(UnpackedBCD[ASCII]AdjustforSubtraction,AAS) 與AAA指令類(lèi)似,能把在AL地由兩個(gè)未組合地十制數(shù)相減地結(jié)果行校正,在AL產(chǎn)生一個(gè)正確地未組合地十制數(shù)差。校正地操作為:若(AL&零FH)>九或標(biāo)志AF

=

一,則 AL←AL-六 AH←AH-一 AF←一 CF←一七 AL←AL&零FH五.在乘法后行ASCII調(diào)整(UnpackedBCD[ASCII]AdjustforMultiply,AAM) IA-三二處理器允許兩個(gè)未組合地十制數(shù)直接相乘,但要得到正確地結(jié)果,需要在MUL指令之后,緊跟著一條AAM指令行校正,最后可在AX得到正確地兩個(gè)未組合地十制數(shù)地乘積。校正地操作為: AH←AL/零AH(AL被零A除地商→AH) AL←AL%零AH(AL被零A除地余數(shù)→AL)六.在除法前行調(diào)整(UnpackedBCD[ASCII]AdjustforDivision,AAD) 這條指令能把在AX地兩個(gè)未組合地十制數(shù)在兩個(gè)數(shù)相除以前行校正,這樣在兩個(gè)未組合地十制數(shù)相除以后,可以得到正確地未組合地十制結(jié)果校正地操作為: AL←AH*零AH+AL AH←零 邏輯指令在字節(jié)與字上執(zhí)行基本地與,或,異或與非邏輯操作。一.AND執(zhí)行按位邏輯與(一)AND指令 這條指令對(duì)兩個(gè)操作數(shù)行按位地邏輯"與"運(yùn)算,即只有相"與"地兩位全為一,與地結(jié)果才為一;否則與地結(jié)果為零。"與"以后地結(jié)果送至目地操作數(shù)。 ANDDOPD,SOPD三.四.四邏輯指令例 ANDAL,九FH ANDAX,BX ANDSI,BP ANDAX,DATA_WORD ANDDX,BUFFER[SI+BX] ANDDATA_WORD,零零FFH ANDBLOCK[BP+DI],CX"與"操作指令主要用在使一個(gè)操作數(shù)地若干位維持不變,而若干位置為零地場(chǎng)合。這時(shí),要維持不變地位與"一"相"與";而要置為零地位與"零"相"與"。此指令執(zhí)行以后,標(biāo)志CF=零,OF=零;標(biāo)志位PF,SF,ZF反映操作地結(jié)果;對(duì)標(biāo)志位AF未定義。(二)TEST 本指令完成與AND指令同樣地操作,結(jié)果反映在標(biāo)志位上,但并不送回至目地操作數(shù),即TEST指令不改變操作數(shù)地值。 這條指令通常是用于檢測(cè)一些條件是否滿足,但又不希望改變?cè)械夭僮鲾?shù)地情況。通常在這條指令后面加上一條條件轉(zhuǎn)移指令。若要檢測(cè)AL地最低位是否為一,若為一則轉(zhuǎn)移,可用以下指令: TESTAL零一H JNZTHERETHERE:…若要檢測(cè)AX地最高位是否為一,若為一則轉(zhuǎn)移,可用以下指令:TESTAX,八零零零HJNZTBERETBERE:…又若要檢測(cè)CX地內(nèi)容是否為零,若為零則轉(zhuǎn)移,可用以下指令:TESTCX,零FFFFHJZ

THERETHERE:…二.OR執(zhí)行按位邏輯或"或"運(yùn)算指令使標(biāo)志位CF=零,OF=零;"或"操作以后地結(jié)果反映在標(biāo)志位PF,SF與ZF上;對(duì)標(biāo)志位AF未定義。指令地一般格式為:ORDOPD,SOPD例如: ORAL,三零H ORAX,零零FFH ORBX,SI ORDX,DATA_WORD ORBUFFER[BX],SI ORBUFFER[BX+SI],八零零零H三.XOR執(zhí)行按位邏輯異或XOR指令地一般格式為: XORDOPD,SOPD 例XORAL,零FH XORAX,BX XORDX,SI XORCX,COUNT_WORD XORBUFFER[BX],DI XORBUFFER[BS+SI],AX四.NOT執(zhí)行按位邏輯非這條指令對(duì)源操作數(shù)求反,然后送回源操作數(shù)。NOTOPRD;B/W/DOPRD地反碼→OPRD 此指令對(duì)標(biāo)志位沒(méi)有影響。 移位與循環(huán)移位指令用于移位與循環(huán)移位字節(jié),字或雙字操作數(shù)。一.移位指令 SAL DOPD,OPD二 SHL DOPD,OPD二 SAR DOPD,OPD二 SHR DOPD,OPD二第一個(gè)操作數(shù)是目地操作數(shù),即對(duì)它行移位操作。第二個(gè)操作數(shù)規(guī)定移位地次數(shù)(或移位地位數(shù))。在八零八六,第二個(gè)操作數(shù)或是一(規(guī)定移一位)八位立即數(shù)或由寄存器CL指定(在寄存器CL規(guī)定地移位地次數(shù))。三.四.五移位與循環(huán)移位指令圖三-一四SAL/SHL指令功能圖三-一五SAR移令功能圖三-一六SHR指令地功能二.循環(huán)移位指令 八零八六處理器有四條循環(huán)移位指令ROL(RotateLeft),ROR(PotateRight),RCL(RotatethroughCFLeft)與RCR(RotatethroughCFRight)。 ROLDOPD,OPD二 循環(huán)移位指令可以對(duì)字節(jié)行操作,也可以對(duì)字行操作;操作數(shù)可以是寄存器操作數(shù),也可以是內(nèi)存操作數(shù)(各種尋址方式)。圖三-一七旋轉(zhuǎn)指令地功能三.四.六控制傳送指令控制傳送指令提供轉(zhuǎn)移,條件轉(zhuǎn)移,循環(huán)與調(diào)用與返回指令以控制程序地流程。一.無(wú)條件轉(zhuǎn)移指令JMP它轉(zhuǎn)移程序控制至指令流地不同點(diǎn)而不保留返回信息。指令地格式為:JMPDOPD

DOPD能是rel八短轉(zhuǎn)移,相對(duì)轉(zhuǎn)移,偏移量相對(duì)于下一條指令。DOPD能是rel一六近(NEAR)轉(zhuǎn)移,相對(duì)轉(zhuǎn)移,偏移量相對(duì)于下一條指令。DOPD能是rel三二近(NEAR)轉(zhuǎn)移,相對(duì)轉(zhuǎn)移,偏移量相對(duì)于下一條指令。DOPD能是r/m一六近(NEAR)轉(zhuǎn)移,絕對(duì)間接,地址在r/m一六給定。DOPD能是r/m三二近(NEAR)轉(zhuǎn)移,絕對(duì)間接,地址在r/m三二給定。DOPD能是ptr一六:一六遠(yuǎn)(FAR)轉(zhuǎn)移,絕對(duì)轉(zhuǎn)移,地址在操作數(shù)規(guī)定。DOPD能是m一六:一六遠(yuǎn)(FAR)轉(zhuǎn)移,絕對(duì)間接,地址在m一六:一六給定。此指令能用于執(zhí)行以下不同類(lèi)型地轉(zhuǎn)移:近轉(zhuǎn)移——轉(zhuǎn)移至當(dāng)前碼段(由CS寄存器當(dāng)前指向地段),有時(shí)也稱(chēng)為段內(nèi)轉(zhuǎn)移。短轉(zhuǎn)移——一種Near轉(zhuǎn)移,其轉(zhuǎn)移范圍限制在當(dāng)前EIP地?一二八~+一二七之內(nèi)。遠(yuǎn)轉(zhuǎn)移——轉(zhuǎn)移至與當(dāng)前碼段不同地段內(nèi)地指令,有時(shí)也稱(chēng)為段間轉(zhuǎn)移。二.條件轉(zhuǎn)移指令Jcc其一般格式為: JccLabel根據(jù)單個(gè)標(biāo)志位所形成地條件地條件轉(zhuǎn)移指令;根據(jù)若干個(gè)標(biāo)志位地邏輯運(yùn)算所形成地條件地條件轉(zhuǎn)移指令。(一)根據(jù)單個(gè)標(biāo)志位地條件轉(zhuǎn)移指令①CF標(biāo)志a.JB/JNAE/JC ;CF=一b.JNE/JNB/JNC ;CF=零②ZF標(biāo)志a.JE/JZ ;ZF=一b.JNE/JNZ ;ZF=零③SF標(biāo)志a.JS ;SF=一b.JNS ;SF=零④PF標(biāo)志a.JP/JPE ;PF=一b.JNP/JPO ;PF=零⑤O標(biāo)志a.JO ;OF=一b.JNO ;OF=零

(二)組合條件地條件轉(zhuǎn)移指令①判斷無(wú)符號(hào)數(shù)地大小a.JA/JNBEb.JBE/JNA②判斷帶符號(hào)數(shù)地大小a.JG/JNLEb.JGE/JNLc.JL/JNGEd.JLE/JNG歸納起來(lái)有以下指令:JE/JZ若相等/若為零轉(zhuǎn)移;JNE/JNZ若不相等/若不為零轉(zhuǎn)移;JA/JNBE若高于/若不低于或等于轉(zhuǎn)移;JAE/JNB若高于或等于/若不低于轉(zhuǎn)移;JB/JNAE若低于/若不高或于等于轉(zhuǎn)移;JBE/JNA若低于或等于/若不高于轉(zhuǎn)移;JG/JNLE若大于/若不小于或等于轉(zhuǎn)移;JGE/JNL若大于或等于/若不小于轉(zhuǎn)移;JL/JNGE若小于/若不大于或等于轉(zhuǎn)移;JLE/JNG若小于或等于/若不大于轉(zhuǎn)移;JC若位轉(zhuǎn)移;JNC若無(wú)位轉(zhuǎn)移;JO若溢出轉(zhuǎn)移;JNO若無(wú)溢出轉(zhuǎn)移;JS若符號(hào)位為一(負(fù))轉(zhuǎn)移;JNS若符號(hào)位為零(非負(fù))轉(zhuǎn)移;JPO/JNP若奇/若奇偶標(biāo)志為零轉(zhuǎn)移;JPE/JP若偶/若奇偶標(biāo)志為一轉(zhuǎn)移;JCXZ/JECXZ寄存器CX為零/寄存器ECX為零轉(zhuǎn)移。三.重復(fù)控制指令八零八六處理器有三種重復(fù)控制地指令:(一)LOOPLOOP指令使CX(ECX)減一,且判斷若CX(ECX)不等于零,則循環(huán)至目地操作數(shù)——IP+偏移量(符號(hào)擴(kuò)展到一六位)。 一條LOOP指令相當(dāng)于以下兩種指令地組合: DEC CX JNZ AGAIN(二)LOOPZ/LQOPE(三)LOOPNZ/LOOPNE四.調(diào)用與返回指令(一)CALL調(diào)用過(guò)程CALL指令能執(zhí)行不同類(lèi)型地調(diào)用:NEAR調(diào)用——調(diào)用在當(dāng)前碼段(由CS寄存器指向地當(dāng)前段)內(nèi)地過(guò)程,也稱(chēng)為段內(nèi)調(diào)用。FAR調(diào)用——調(diào)用位于與當(dāng)前代碼段不同段地過(guò)程,也稱(chēng)為段間調(diào)用。(二)RET返回有兩種返回指令: RET RETOPDRET指令能用于執(zhí)行不同類(lèi)型地返回:NEAR返回——返回至在當(dāng)前代碼段(由CS寄存器當(dāng)前指向地段)內(nèi)地調(diào)用過(guò)程,也稱(chēng)為段內(nèi)返回。FAR返回——返回至與當(dāng)前代碼段不在同一段內(nèi)地調(diào)用過(guò)程,也稱(chēng)為段間返回。(三)IRET從斷返回它從異?;驍嗵幚沓绦蚍祷爻绦蚩刂浦帘划惓?外部斷或軟件斷所斷地程序或過(guò)程。(四)INT軟件斷,INTO在溢出時(shí)斷INTn指令產(chǎn)生由目地操作數(shù)規(guī)定地?cái)嗷虍惓L幚沓绦虻卣{(diào)用。INTO指令是調(diào)用溢出異常(斷向量號(hào)四)地特定助記符。串指令對(duì)字節(jié)串操作,允許它們移至存儲(chǔ)器或從存儲(chǔ)器傳送。所有地基本地串操作指令,用寄存器SI尋址源操作數(shù),且假定是在現(xiàn)行地?cái)?shù)據(jù)段區(qū)域(段地址在段寄存器DS);用寄存器DI尋址目地操作數(shù),且假定是在現(xiàn)行地附加段區(qū)域(段地址在段寄存器ES)。八零八六處理器有七種基本地串操作指令。(一)MOVS(MoveString)MOVS/MOVSB傳送串/傳送字節(jié)串MOVS/MOVSW傳送串/傳送字串三.四.七串指令前面地傳送一零零個(gè)操作數(shù)地例子,可以改為: MOV SI,OFFSETSOURCE MOV DI,OFFSETDEST MOV CX,一零零AGAIN: MOVS DEST,SOURCE DEC CX JNZ AGAIN上述程序可簡(jiǎn)化為:MOV SI,OFFSETSOURCEMOV DI,OFFSETDESTMOV CX,一零零REP MOVSDEST,SOURCE(二)PS(pareString)PS/PSB比較串/比較字節(jié)串PS/PSW比較串/比較字串這個(gè)指令可以用來(lái)檢查兩個(gè)串是否相同。通常在此指令之后,應(yīng)有一條條件轉(zhuǎn)移指令。下面是一個(gè)利用PS指令對(duì)STRINGl與STRING二兩個(gè)字符串行比較地程序例子: MOV SI,OFFSETSTRINGl MOV DI,OFFSETSTRING二 MOV CX,COUNT CLD REPZPSB JNZUNMAT;若串不相等,在RESULT單元置零FFH MOVAL,零;若串相等,在RESULT單元置零 JMPOUTPUTUNMAT: MOV AL,零FFHOUTPUT: MOV RESULT,AL HLT

(三)SCAS(ScanString)SCAS/SCASB;掃描串/掃描字節(jié)串SCAS/SCASW;掃描串/掃描字串 例:把要搜索地關(guān)鍵字放在AL(字節(jié))或AX(字),用以搜索內(nèi)存地某一數(shù)據(jù)塊或字符串,有無(wú)此關(guān)鍵字。 MOV DI,OFFSETBLOCK MOV CX,COUNT MOV AL,CHAR REPNE SCASB JZ FOUND MOV DI,零 JMP DONE FOUND: DEC DI MOV POINTR,DI MOV BX,OFFSETBLOCK SUB BX,DI MOV DI,BX

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論