第二節(jié)傳送指令_第1頁
第二節(jié)傳送指令_第2頁
第二節(jié)傳送指令_第3頁
第二節(jié)傳送指令_第4頁
第二節(jié)傳送指令_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第二節(jié)8086/8088的指令系統(tǒng)8086/8088的指令系統(tǒng)中共有92種基本指令??梢苑殖?個功能組:1. 數(shù)據(jù)傳送(Datatransfer)2. 算術(shù)運算(Arithmetic)3. 邏輯運算和移位指令(Logic&Shift)4. 串操作(Stringmanipulation)5. 控制轉(zhuǎn)移(ControlTransfer)6. 處理器控制(ProcessorControl)介紹指令系統(tǒng)使用的符號:八位寄存器:AH,AL,BH,BH,BL,CH,CL,DH,DL十六位通用寄存器:AX,BX,CX,DX,SP,BP,SI,DI堆棧指針 SP指令指針 IP標志位 Flags目的和源變址寄存器 DI,SI段寄存器 CS,DS,ES,SS通用寄存器 rAL或AX(取決于操作數(shù)長度)accsrc,dest 源,目的操作數(shù)(下列尋址方式都可以用) [BX+SI+n],[BX+DI+n],[BP+SI+n],[BP+DI+n] [SI+n], [DI+n],[BP+n],[BX+n] [N], r

[] 存儲器單元的內(nèi)容(正常在數(shù)據(jù)段)ES:[] 附加數(shù)據(jù)段的內(nèi)容OPRD 操作數(shù)

Seg段寄存器(CS,DS,ES,SS)im

立即數(shù)(n8位, nn16位,nnnn32位)8086/8088指令助記符表8086/8088指令助記符表(續(xù))一、數(shù)據(jù)傳送指令(Datatransfer)(一)通用傳送指令(GeneralPurposeTransfer)(二)輸入輸出指令(InputandOutput)(三)目的地址傳送指令(Address-objecttransfer)(四)標志傳送指令(Flagregistertransfer)一. 數(shù)據(jù)傳送指令功能:負責(zé)CPU和存儲器 CPU和I/O端口 CPU的內(nèi)部寄存器之間的數(shù)據(jù)傳送。特點:它是計算機最基本、最重要的一種操作,使用比例最高。

通用傳送指令包括:MOV,PUSH,POP,XCHG

累加器專用傳送指令:

IN,OUT;XLAT

地址傳送指令包括:LEA,LDS,LES

標志傳送指令包括:LAHF,SAHF,PUSHF,POPF

除SAHF和POPF指令外,對標志位沒有影響。(一)通用傳送指令(GeneralPurposeTransfer)8088提供方便靈活的通用的傳送操作,適用于大多數(shù)操作數(shù)。通用傳送指令(除了XCHG以外)是唯一允許以段寄存器為操作數(shù)指令。通用傳送指令包括: 1、MOV(Movement) 2、PUSH(Pushwordontostack) POP(Popwordoffstack) 3、XCHG(Exchange)

1. MOV dest, src;(dest)(src) 目的 源 目的源功能:

把一個字節(jié)(B)或一個字(W)操作數(shù)由源傳送至目的。實現(xiàn): 寄存器寄存器/存儲器之間; 立即數(shù)寄存器/存儲器 寄存器/存儲器段寄存器之間的數(shù)據(jù)傳送。

具體說,通用數(shù)據(jù)傳送指令能實現(xiàn):①CPU內(nèi)部寄存器之間的數(shù)據(jù)的任意傳送

(除了代碼段寄存器CS和指令指針I(yè)P以外)。

例: MOVDL,CH ;8位寄存器8位寄存器 MOVAX,DX ;16位寄存器16位寄存器 MOVSI,BP MOVDS,BX ;通用寄存器段寄存器

MOVAX,CS ;段寄存器通用寄存器立即數(shù)傳送至CPU內(nèi)部通用寄存器組(AX、BX、CX、DX、BP、SP、SI、DI)。

用于給寄存器賦初值。

不能直接給段寄存器賦值例:

MOVCL,04H ;立即數(shù)8位寄存器

MOVAX,03FFH ;立即數(shù)16位寄存器思考:為什么加WORDPTR,BYTEPTR?

MOVWORDPTR[SI],057BH;立即數(shù)存儲器

MOVBYTEPTRMEM,5;立即數(shù)存儲器CPU內(nèi)部寄存器(除CS和IP外) 與存儲器(所有尋址方式)之間數(shù)據(jù)傳送。

存儲單元之間不能直接傳送

例:

MOVMEM,AX ;累加器存儲器,直接尋址

MOVMEM,DS ;段寄存器存儲器,直接尋址

MOVDISP[BX],CX ;寄存器存儲器,變址尋址

MOVAX,DISP[SI]

;存儲器累加器,變址尋址

MOVDS,MEM

;存儲器段寄存器,直接尋址

MOVCX,DISP[BX][SI]

;存儲器累加器,相對基址加變址

注意:(1)不能用一條MOV指令實現(xiàn)以下傳送。

存儲單元之間的傳送

MOVMEM2,MEM1錯。

MOVAX,MEM1 MOVMEM2,AX對。

立即數(shù)送段寄存器

例:MOVDS,2000H錯。MOVAX,2000 HMOVDS,AX對。

段寄存器之間的傳送

MOVES,DS;錯

MOVAX,DS MOVES,AX;對。注意CS和IP的使用

CS和IP不能作為目標操作數(shù),CS可以作為源操作數(shù)。例: MOVCS,AX;錯

MOVAX,CS;對。

MOVIP,AX;錯

MOVAX,IP;對。(2)段地址的默認 BX、SI、DI間址默認段地址為DS, BP間址默認段地址SS。(3) 凡是遇到給SS賦值指令,系統(tǒng)自動禁止外部中斷,執(zhí)行本條指令和下條指令,恢復(fù)對SS寄存器賦值前的中斷開放情況。 這樣做為了允許程序員連續(xù)用兩條指令分別對SS和SP寄存器賦值,同時又防止堆棧空間變動過程出現(xiàn)中斷。

*在修改SS和SP的指令之間不要插入其他指令。(4) 所有通用傳送指令不影響標志位 (除SAHF、POPF以外)。

MOV指令應(yīng)用例:實現(xiàn)將AREA1開始的100個數(shù)據(jù)傳送到AREA2開始的單元?!瑼REA1:AREA2:100個數(shù)據(jù)分析題意:

①可以用200條MOV指令來完成100個數(shù)據(jù)傳送,指令操作重復(fù),每個數(shù)據(jù)傳送后的地址是變化的。②可以利用循環(huán), 但每循環(huán)一次要修改地址(源地址和目的地址),必須把地址放在寄存器當中,用寄存器間接尋址來尋找操作數(shù).得到如下程序:

MOVSI,OFFSETAREA1 MOVDI,OFFSETAREA2 MOVCX,100AGAIN: MOVAL,[SI] MOV[DI],AL

INCSI ;修改地址指針 INCDI ;修改地址指針 DECCX ;修改個數(shù) JNZAGAIN

…2.PUSH(Pushwordontostack)POP(Popwordoffstack)這是兩條堆棧操作指令。什么是堆棧?按“后進先出(LIFO)”方式工作的存儲區(qū)域。堆棧以字為單位進行壓入彈出操作。堆棧操作是如何進行的?為什么要設(shè)置堆棧?為什么要按“后進先出”方式工作?規(guī)定由SS指示堆棧段的段基址,堆棧指針SP始終指向堆棧的頂部,SP的初值規(guī)定了所用堆棧區(qū)的大小。堆棧的最高地址叫棧底。SPSS堆棧段進棧方向退棧方向棧底棧頂

①壓棧指令PUSHsrc ;src為16位操作數(shù)例:PUSH AX ;將AX內(nèi)容壓棧執(zhí)行操作:SP-1←高字節(jié)AHSP-2←低字節(jié)ALSP←SP-2設(shè)AX=1020H,執(zhí)行示意圖如圖低地址存儲區(qū)(SS段)執(zhí)行前AX=1020HSP=2006H(SP)存儲區(qū)(SS段)進棧方向執(zhí)行后SP=2004H2010(AL)(AH)PUSHAX指令執(zhí)行示意圖SP-2SP高地址低地址高地址SP-1壓棧指令的格式為:PUSH regPUSH mem/regPUSH segreg例如:PUSHAXPUSH[BX]PUSHDS注意進棧方向是高地址向低地址發(fā)展。

②彈出指令POP dest例:POP BX ;將棧頂內(nèi)容彈至BX執(zhí)行操作:BL←(SP)

BH←(SP)+1

SP←SP+2POPBX的執(zhí)行示意圖如下圖所示低地址存儲區(qū)(SS段)出棧方向執(zhí)行前SP=2006H2010POPBX指令執(zhí)行示意圖(SP)存儲區(qū)(SS段)執(zhí)行后(BX)=1020SP=2008H(SP)(SP)+1(SP)+2BX2010高地址低地址高地址堆棧用途:

暫時保存CPU內(nèi)部某些寄存器的數(shù)據(jù)。

調(diào)用子程序,響應(yīng)中斷時都要用到堆棧。調(diào)用子程序(或過程)或發(fā)生中斷時要保護斷點的地址,子程序或中斷返回時恢復(fù)斷點。主程序IP繼續(xù)執(zhí)行主程序執(zhí)行子程序轉(zhuǎn)子程序壓棧彈出返回主程序主程序IPIP(下)繼續(xù)執(zhí)行主程序轉(zhuǎn)子程序1返回主程序IP’執(zhí)行子程序2轉(zhuǎn)子程序2返回子程序1IP’(下)執(zhí)行子程序1繼續(xù)執(zhí)行子程序1(a)(b)子程序調(diào)用示意圖(a)主程序調(diào)子程序;(b)子程序嵌套示意圖壓棧彈出IP(下)調(diào)用子程序(或過程)或發(fā)生中斷時要保護斷點的地址,子程序或中斷返回時恢復(fù)斷點。子程序嵌套斷點地址壓入和彈出情況

保存CPU內(nèi)部的寄存器或存儲器中的數(shù)據(jù),

使用數(shù)據(jù)時將其彈出:

PUSHAX ;將(AX)入棧(AX)(AX)使用數(shù)據(jù)時將其彈出: POPBX堆棧指令使用時應(yīng)注意幾點:①堆棧操作總是按字進行②不能從棧頂彈出一個字給CS③堆棧指針為SS:SP,SP永遠指向棧頂④SP自動進行增減量(-2,+2),SP始終指向一個實單元

PUSH,POP指令應(yīng)該成對使用,保持堆棧原有狀態(tài)。堆棧應(yīng)用舉例:

例:壓入堆棧的內(nèi)容與彈出內(nèi)容順序相反…PUSH AXPUSHBXPUSHCX…POPCXPOPBXPOPAX 3、交換指令(Exchange)格式:XCHGdest,src ;(dest)(src)執(zhí)行操作:

把一個字節(jié)或一個字的源操作數(shù)與目的操作數(shù)相交換??梢詫崿F(xiàn):寄存器之間 寄存器和存儲器之間應(yīng)用舉例:

XCHGBL,DL XCHGAX,SI XCHGCOUNT[DI],AX

注意:

存儲器之間不能交換,兩個操作數(shù)中必須有一個在寄存器中;段寄存器不能作為一個操作數(shù);

XCHG[BX],[DI] (錯)

XCHGDS,AX(錯)(二)累加器專用傳送指令必須通過累加器AX(字)或AL(字節(jié))包括:I/O指令;XLAT(1)輸入輸出指令:

1、IN(Inputbyteorword)

2、OUT(Outputbyteorword)

輸入指令用于CPU從外設(shè)端口接受數(shù)據(jù),

輸出指令用于CPU向外設(shè)端口發(fā)送數(shù)據(jù)。

輸入、輸出指令不影響標志位。每個外設(shè)要占幾個端口:數(shù)據(jù)口,狀態(tài)口和控制口。信息交換要通過端口在IBMPC機里,可以配接許多外部設(shè)備,每個外設(shè)與CPU之間交換數(shù)據(jù),狀態(tài)信息和控制命令,每一種信息交換都要通過一個端口來進行。端口數(shù):外部設(shè)備最多有65536個I/O端口。 A0~A15譯碼形成。端口號:端口號(即外設(shè)端口地址)為0000H~FFFFH。PC機僅使用A0~A9譯碼形成I/O口地址,即1024H個口地址 端口號:0000H~03FFH只限于用累加器AL或AX來傳送信息。功能:(累加器)←→I/O端口格式:直接輸入/輸出和間接輸入/輸出指令(1)直接輸入/輸出:指令中直接給出端口號例:INAL,80H;(AL)←(80H端口)OUT68H,AX;(69H,68H)←(AX)可訪問的端口范圍00H~FFH 0-255

例:

MOVDX,220HINAL,DX;將220H端口內(nèi)容讀入AL在使用間接尋址的IN/OUT指令時,要事先用傳送指令把I/O端口號設(shè)置到DX寄存器可訪問的端口范圍0000-FFFFH (0-65535)(2)間接輸入/輸出指令

端口號在DX寄存器中例1:實現(xiàn)(29H)(28H)→(DATA_WORD) INAX,28H MOVDATA_WORD,AX例2:從端口3FCH送一個字到AX寄存器 MOVDX,3FCH INAX,DX;(AL)←(3FCH), (AH)←(3FDH)

(2)XLAT(Translate)換碼指令:該指令不影響標志位。XLAT指令使用方法:先建立一個表格;

表格首偏移地址存入BX;

需要轉(zhuǎn)換代碼的序號(相對與表格首地址位移量)存入AL;(表中第一個元素的序號為0)

執(zhí)行XLAT指令后,表中指定序號的元素存于AL中。

(AL)為轉(zhuǎn)換的代碼。XLAT指令應(yīng)用:不規(guī)則代碼的轉(zhuǎn)換例:從字符到ASCII碼的轉(zhuǎn)換

先在內(nèi)存的數(shù)據(jù)段中存放十六進制數(shù)字的ASCII碼表。

首地址為:Hex_table執(zhí)行指令序列:MOVBX,OFFSETHex_tableMOVAL,0AHXLAT假設(shè): (DS)=F000H, Hex_table=0040H (AL)=0AH執(zhí)行XLAT以后:(AL)=41H 即“A”的ASCII碼。30H31H32H...39H41H42H...46H...Hex_tableHex_table+1Hex_table+2Hex_table+0AHHex_table+0BHHex_table+0FH'F''B''A''9''1''2''0'16進制數(shù)的ASCII碼表(三)地址傳送指令(Address-objecttransfer)8086/8088提供三條:

地址指針寫入指定寄存器或寄存器對指令。 1、LEA(LoadEffectiveAddress) 2、LDS(LoadpointerusingDS) 3、LES(LoadpointerusingES)1、LEA(LoadEffectiveAddress)格式:LEAreg16,mem16;EA(reg16)源操作數(shù)必須是一個存儲器單元把指令中指定的存儲器單元有效地址EA裝入指定的寄存器。例:設(shè)(BX)=0400H,(SI)=003CH LEABX,[BX+SI+0F62H]執(zhí)行指令后:EA=(BX)+(SI)+0F62H=0400H+003CH+0F62H=139EH(BX)=139EH注意:設(shè) (DS)=3000H BUFFER=1000H (31000H)=0040H(1)LEA指令與MOV的區(qū)別 LEABX,BUFFER;(BX)=1000H MOVBX,BUFFER;(BX)=0040HLEA指令與MOV等價 LEABX,BUFFER ;(BX)=1000H MOVBX,OFFSETBUFFER;(BX)=1000H2、LDS(LoadpointerusingDS)格式:LDSreg16,mem32 ;(reg16)←(EA) (DS)←((EA)+2))功能:將指令指定32位地址指針送指令指定寄存器和DS。將指令指定mem32單元的前兩個單元內(nèi)容(16位偏移量)裝入指定通用寄存器,把后兩個單元內(nèi)容(段地址)裝入到DS段寄存器。用于寫遠地址指針。例:假設(shè):(DS)=C000H指令: LDSSI,[0010H]執(zhí)行指令后:(SI)=0180H(DS)=2000H

3、LES(LoadpointerusingES)格式:LESreg16,mem32 ;(reg16)←(EA) (ES)←((EA)+2))功能:把源操作數(shù)指定的4個相繼字節(jié)送指令指定的寄存器 及ES寄存器中。此指令常常指定DI寄存器。將指令指定mem32單元的前兩個單元內(nèi)容(16位偏移量)裝入指定通用寄存器,把后兩個單元內(nèi)容(段地址)裝入到ES段寄存器。用于寫遠地址指針。例:假設(shè):(DS)=B000H (BX)

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論