微機(jī)原理——匯編語(yǔ)言程序設(shè)計(jì)基本方法_第1頁(yè)
微機(jī)原理——匯編語(yǔ)言程序設(shè)計(jì)基本方法_第2頁(yè)
微機(jī)原理——匯編語(yǔ)言程序設(shè)計(jì)基本方法_第3頁(yè)
微機(jī)原理——匯編語(yǔ)言程序設(shè)計(jì)基本方法_第4頁(yè)
微機(jī)原理——匯編語(yǔ)言程序設(shè)計(jì)基本方法_第5頁(yè)
已閱讀5頁(yè),還剩52頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、匯編語(yǔ)言程序設(shè)計(jì)基本方法第四章 匯編語(yǔ)言程序設(shè)計(jì)基本方法41 匯編語(yǔ)言基本概念匯編語(yǔ)言與機(jī)器語(yǔ)言4.1.1 編語(yǔ)言與機(jī)器語(yǔ)言 匯編語(yǔ)言是用意義明確的助記符來表示指令的操作碼、操作數(shù)。匯編語(yǔ)言是面向機(jī)器的語(yǔ)言,不同的機(jī)器有不同的匯編語(yǔ)言。用匯編語(yǔ)言編寫的程序具有執(zhí)行速度快、占用存儲(chǔ)空間小、實(shí)時(shí)性能好等待點(diǎn)。匯編語(yǔ)言放大量用于編寫計(jì)算機(jī)系統(tǒng)程序、實(shí)時(shí)控制程序等。 用匯編語(yǔ)言編寫的程序稱為匯編語(yǔ)言源程序(簡(jiǎn)稱匯編語(yǔ)言程序)。計(jì)算機(jī)必須將匯編語(yǔ)言程序翻譯成由機(jī)器代碼組成的目標(biāo)程序才能執(zhí)行。這個(gè)翻譯過程稱為匯編。自動(dòng)完成匯編過程的軟件叫匯編程序。匯編語(yǔ)言的語(yǔ)句有兩種基本類型:指令與偽指令。4.1.2 編

2、語(yǔ)言中語(yǔ)句的組成名稱空格:操作助記符空格操作數(shù);注釋例如: CYCLE: ADD AX ,02;(AX)ß(AX)+02 DATA1 DB 20H,30H,40H,50H1 名稱 1)組成名字的字符(1)字母AZ(2)數(shù)字0一9;(3)專用字符?、. 、_、$ 2)組成名稱的規(guī)則 (1)除數(shù)字0一9外所有字符都可以放在名字的第一個(gè)位置。(2)使用字符“時(shí)必須放在名字的第一個(gè)位置。(3)名字最多可以使用31個(gè)字符、匯編程序不能識(shí)別多余的字符。3)以冒號(hào)分割時(shí),名稱是一個(gè)標(biāo)號(hào);以空格分割時(shí),名城既可以使標(biāo)號(hào),也可以是變量。2 操作助記符(助記符)操作助記符將指出該語(yǔ)句的基本操作功能。必須

3、存在。操作符可以是指令、偽指令或宏指令的助記符。3 操作數(shù)操作數(shù)可以表示數(shù)字本身,也可以是指出如何獲得操作數(shù)的信息。操作數(shù)不是必需的,操作數(shù)多于兩個(gè)時(shí),中間用逗號(hào)分割,操作數(shù)與操作助記符之間必須用空格分割。4 注釋近用作語(yǔ)句或程序的說明,不產(chǎn)生目標(biāo)代碼。411 匯編語(yǔ)言中的常數(shù)與表達(dá)式1 常數(shù)B:表示二進(jìn)制數(shù) 10110011BD:表示十進(jìn)制數(shù)179D或179O:表示八進(jìn)制數(shù)263OH:表示十六進(jìn)制數(shù)B3H用單引號(hào)“”括起來的一串字符稱為字符串常量2 表達(dá)式表達(dá)式由操作數(shù)和操作符組成操作數(shù)可以是常數(shù)或標(biāo)識(shí)符、表達(dá)式操作符:算術(shù)操作符、關(guān)系操作符、屬性操作符及其它操作符等() 算術(shù)操作符:、,雙

4、操作數(shù)操作符,操作數(shù)必須為數(shù)字操作數(shù),的兩個(gè)操作數(shù)必須都為正整數(shù)。例如:79 MOD 16 0B5H MOD 10H() 邏輯操作符:(與)、(或)、(非)、(異或)。操作數(shù)必須為兩個(gè)數(shù)字,按位運(yùn)算。例如: 11001100B AND 11110000B結(jié)果:11000000B11001100B OR 11110000B結(jié)果:11111100BNOT 11110000B結(jié)果:00001111B11001100B XOR 11110000B結(jié)果:00111100B注意:邏輯操作符同時(shí)也是邏輯運(yùn)算指令的操作助記符。例如:AND AL,0CH OR 0FH() 關(guān)系操作符:(相等)、(不等)、(小于

5、)、(大于)、(不大于)、(不小于);關(guān)系運(yùn)算的操作數(shù)必須為數(shù)字,當(dāng)關(guān)系成立時(shí),其結(jié)果為全;當(dāng)關(guān)系不成立時(shí),其結(jié)果為全。匯編語(yǔ)言中表達(dá)式不能單獨(dú)構(gòu)成語(yǔ)句,只能是語(yǔ)句的一部分。例如:MOVAX,BUF+2ADDAL,VAL AND 0FHJMPAGAIN+3MOVBL,VB LE VA412 標(biāo)號(hào)、變量及偽指令1 標(biāo)號(hào)標(biāo)號(hào)是由標(biāo)識(shí)符表示的指令的名稱,指示對(duì)應(yīng)指令的位置(地址)。標(biāo)號(hào)的三個(gè)屬性:段地址、偏移地址和類型。標(biāo)號(hào)的類型屬性:和;:段內(nèi)使用;:段間使用標(biāo)號(hào)定義的基本方法:指令的助記符前加上標(biāo)識(shí)符和冒號(hào),例如:2 變量() 變量的定義變量通過偽指令定義:變量名表達(dá)式;定義字節(jié)變量變量名表達(dá)式

6、;定義字變量變量名表達(dá)式;定義雙字變量變量名表達(dá)式;定義長(zhǎng)字變量變量名表達(dá)式;定義一個(gè)十字節(jié)變量變量名是一個(gè)標(biāo)識(shí)符,變量的類型與關(guān)鍵字、有關(guān)。表達(dá)式的表示: 一個(gè)或多個(gè)常數(shù)或表達(dá)式 帶引號(hào)的字符串 一個(gè)問號(hào)“?” 重復(fù)方式重復(fù)次數(shù)(表達(dá)式)例如:DATA1DB20HDATA2DW0204H,1000HDATA3DB(-1*3),(15/3)DATA4DD12345HDATA5DB 0123DATA6DWAB,C,DDATA7DB?DATA8DD?DATA9DB 5 DUP(00)DATA10DW3DUP(?)“?”:表示其值不確定當(dāng)表達(dá)式的值為字符串時(shí),字節(jié)類型與字類型不同處理。圖4.1 P5

7、7頁(yè) () 變量的屬性 段地址(SEG):變量所在段的段地址 偏移地址(OFFSET):變量所在段內(nèi)的偏移地址。 類型(TYPE):變量所占據(jù)的字節(jié)數(shù)DBà1 DWà2 DDà4 DQà8 DTà10 長(zhǎng)度(LENGTH):一個(gè)變量明所定義的變量的個(gè)數(shù),用DUP為重復(fù)的個(gè)數(shù)。 大?。⊿IZE):類型與長(zhǎng)度的乘積前三個(gè)為主屬性,后兩個(gè)為輔助屬性變量名段地址偏移地址類型長(zhǎng)度大小DATA1DATA2DATA3DATA4DATA5DATA6DATA10413 屬性操作符及表達(dá)式1 獲取屬性的操作符SEG(變量名或標(biāo)號(hào))所在段的段地址OFFSET(變量名

8、或標(biāo)號(hào))再段內(nèi)的偏移量TYPE(變量名或標(biāo)號(hào))類型LENGTH(變量名)長(zhǎng)度SIZE(變量名)大小例如:SEG DATA1OFFSET DATA1LENGTH DATA6TYPE DATA6SIZE DATA9 例如:MOVAX, SIZE DATA9MOVAX, SEG DATA1MOVBL,TYPE DATA 例如: DAT1DB02H DAT2DW 0F00H DAT3 DW5 DUP(?) DAT4DB LENGTH DAT3;存放變量DAT3的長(zhǎng)度5 DAT5DW DAT3;2 PTR操作符格式:類型PTR表達(dá)式類型:BYTE WORD DWORD NEAR FAR功能:重新定義已定

9、義的變量或標(biāo)號(hào)的類型MOVBYTEPTR DAT3AL42 8086/8088指令系統(tǒng)指令類型:() 數(shù)據(jù)傳送指令() 算術(shù)運(yùn)算指令() 邏輯運(yùn)算指令() 移位指令() 標(biāo)志處理指令和CPU控制指令() 轉(zhuǎn)移和循環(huán)控制指令() 調(diào)用和返回指令() 字符串操作指令() 輸入、輸出指令421 數(shù)據(jù)傳送類指令通用傳送指令包括:傳送指令、進(jìn)棧指令、出棧指令和交換指令。1 傳送指令(MOV)MOVDST,SRC(DST)ß(SRC)其中SRC表示源操作數(shù),DST表示目的操作數(shù)。功能:將源操作數(shù)SRC的一個(gè)字節(jié)或一個(gè)字傳送到目的操作數(shù)DST所指單元。源操作數(shù):通用寄存器、段寄存器、立即數(shù)和內(nèi)存單

10、元。目的操作數(shù):通用寄存器、段寄存器和內(nèi)存單元。(1) 累加器和存儲(chǔ)器單元之間的傳送(2)存器之間的傳送() 寄存器和存儲(chǔ)器單元之間的傳送() 立即數(shù)傳送() 段寄存器和通用寄存器之間的傳送() 段寄存器和存儲(chǔ)器單元之間的傳送例如:MOVAX,BXMOVAL,DLMOVAX,02MOVSI,BXMOVAL,4DIMOVAX,BX+2MOVBXDI,DX重點(diǎn)講述后三條指令 又例如:變量的定義:DATA1DW20H,30HDATA2DB 50H,60H,70HDATA3 DW 10H DUP(?)相應(yīng)傳送指令: MOVAX,DATA1MOVDATA3,BXMOVAL,DATA2DIMOVDATA3

11、SI,DXMOVCX,LENGTH DATA3MOVBX,SIZE DATA3MOVSI,OFFSET DATA2指令中傳送的是一個(gè)字還是一個(gè)字節(jié),通常由操作數(shù)的類型確定。下列指令中,沒有確定的類型,是錯(cuò)誤的。MOVDATA3SI,02HMOV2SI,ALMOV4DI,02可以采用如下方式糾正: MOVBYTE PTR 4DI,02如果兩個(gè)操作數(shù)的類型不一致,也是錯(cuò)誤的: DATA1DW05H DATA2DB 0FH,10H,0AH DATA3DB 5 DUP(?) MOVAX,BL MOV AL,DATA1 MOVBX,DATA3SI可以采用如下方式糾正: MOVAL,BYTE PTR DA

12、TA1內(nèi)容歸納:() 兩操作數(shù)進(jìn)行數(shù)據(jù)傳送的正常通路() 寄存器間接尋址、寄存器相對(duì)尋址、基址變址尋址和基址變址相對(duì)尋址方式只能使用變址寄存器DI,SI和基址寄存器BX,BP。() 寄存器相對(duì)尋址和寄存器基址變址相對(duì)尋址方式的位移量DISP可以是常量、變量,并且有多種素、書寫方式MOVAX,DISPBXMOVAX,BX+DISPMOVAX,BX.DISPMOVAX,BX+DISP (4) 段寄存器不是DS,而是ES時(shí),用如下方式表示: MOVAX,ES:SI對(duì)BP寄存器 MOVAL,DATA2BP;對(duì)應(yīng)DS段 MOVAL, 10BP; 對(duì)應(yīng)SS段2 取有效地址指令(LEA)功能:將源操作數(shù)SR

13、C的有效地址(偏移地址)送入寄存器REG中。MOVAX,10HDILEAAX,10HDI上面兩條指令的功能是完全不同的。一個(gè)取數(shù)值,一個(gè)取偏移地址。下面的指令也可以使用:LEADI,DATA1LEABX,AGAIN下面兩條指令等價(jià):MOVAX,OFFSETDATA1LEAAX,DATA13 取地址指針指令(LDS,LES)功能:將源操作數(shù)SRC的有效地址所對(duì)應(yīng)的內(nèi)存單元中的32位內(nèi)容分別送到DS(或ES)和指令中所指出的寄存器REG中。TABLEDB10H,20H,30H,40H,50HPOINT1DD02001000HPOINT2DDTABLELDSDI,POINT1LESSI,POINT2

14、只能用于DI和SI兩個(gè)段寄存器。4 標(biāo)志傳送指令(LAHF,SAHF)LAHF:PSW中低8位內(nèi)容送入寄存器AHSAHF:將AH中的8位內(nèi)容送入標(biāo)志寄存器的低8位中。5 數(shù)據(jù)交換指令(XCHG)功能:完成寄存器與寄存器或寄存器與存儲(chǔ)單元之間內(nèi)容交換。要求:兩個(gè)操作數(shù)必有一個(gè)寄存器(非段寄存器)XCHGAX,BXXCHGCX,DIXCHGBX,DATA16 字節(jié)轉(zhuǎn)換指令(XLAT)隱含尋址方式,EA=(BX)+(AL)功能:將EA所對(duì)應(yīng)的內(nèi)存單元中一個(gè)字節(jié)送入AL中。例如:求CODE1代碼中的5所對(duì)應(yīng)的CODE2代碼。 MOVAX,SEG TABLE MOVDS,AXMOVBX,OFFSET T

15、ABLEMOVAL,06XLATCODE1和CODE2的代碼表參見P67表4.67 堆棧操作指令() 堆棧定義:以后進(jìn)先出(LIFO)的規(guī)則存取信息的一種存儲(chǔ)機(jī)構(gòu)。堆棧指示器(堆棧指針):管理堆棧中存取地址的一個(gè)專門地址寄存器。它始終指向堆棧中最后存入信息的那個(gè)單元,該單元稱為堆棧頂。8086/8088CPU中,堆棧指針為寄存器SP(16位地址寄存器),用來寄存堆棧區(qū)的偏移地址,段地址存放在段寄存器SS中。() 堆棧操作指令(A) 壓入指令(PUSH)將SRC或標(biāo)志寄存器FLAG的內(nèi)容送入堆棧,并修正堆棧指針的內(nèi)容,雙字節(jié)操作(字類型)。PUSHAX;PUSHDSPUSHSI地址內(nèi)容00F8H

16、0800F9H0700FAH0600FBH0500FCH0400FDH0300FEH0200FFH010100HPUSHF例如: MOVAX,0FFFFHPUSHAX(B) 彈出指令(POP)將SP所指的棧頂?shù)膬?nèi)容取出,并送入DST所指寄存器、內(nèi)存單元或標(biāo)志寄存器FLAG,并修正SP內(nèi)容。例如:MOVSP,0100HPUSHAXPUSHBXPOPAXPOPBX 下面的指令是錯(cuò)誤的: PUSH1234H PUSHAL422 算術(shù)運(yùn)算類指令1 加法和減法指令A(yù)DDDST,SRC(無進(jìn)位加法)ADCDST,SRC(帶進(jìn)位加法)SUBDST,SRC(無借位減法)SBBDST,SRC(帶借位減法)NEG

17、DST(取負(fù))目的操作數(shù)DST:通用寄存器、任一尋址方式所指定的內(nèi)存單元。源操作數(shù)SRC:立即數(shù)、通用寄存器和任一尋址方式所指定的內(nèi)存單元。不能從內(nèi)存到內(nèi)存。ADDAL,BLADDCX,08HADDAX,SIADDAX,BXDISUBAL,CLSUBBX,DXADCAX,0SBBCX,DATA11)ADDAX,SI目的操作數(shù)的尋址方式為寄存器方式,源操作數(shù)的尋址方式為寄存器間接方式。功能:將AX的內(nèi)容與寄存器SI的內(nèi)容所指的內(nèi)存單元中的16位數(shù)相加,結(jié)果送入AX,并設(shè)置標(biāo)志寄存器FLAG的各位。算術(shù)運(yùn)算對(duì)標(biāo)志寄存器中的DF、IF、TF均不產(chǎn)生影響。CF進(jìn)位(或借位)與OF的區(qū)別MOVAX,0F

18、DAAHMOVBX,0FBCEHADDAX,BX結(jié)果:(AX)=0F978H,(BX)=0FBCEH,CF=1,OF=02)SBBCX,DATA1帶借位的16位數(shù)減法指令。目的數(shù)的尋址方式為寄存器方式,源操作數(shù)的尋址方式為直接方式。指令執(zhí)行前,(CX)=3F50H,變量DATA1在數(shù)據(jù)段內(nèi)的偏移地址為0006H,對(duì)應(yīng)單元中16位數(shù)為1728H,借位標(biāo)志(CF)=1,指令執(zhí)行過程如下:結(jié)果:(CX)=0010100000100111(FLAG)=XXXX0···00X1X1X0帶進(jìn)位的加、減法指令主要用于多位數(shù)的加、減運(yùn)算。例如:在內(nèi)存中偏移地址為ADR1開始的連續(xù)

19、單元中存放著兩個(gè)4字節(jié)操作數(shù)A和B,求該兩數(shù)之和,并將結(jié)果放入ADR2開始的連續(xù)單元中。假設(shè)操作數(shù)由變量定義的方式存入內(nèi)存,并且其段地址已送入DS,偏移地址ADR1已送入寄存器DI。MOVAX,4DIADDAX,DIMOVADR2,AXMOVAX,6DIADCAX,2DIMOVADR2+2,AX對(duì)指令的執(zhí)行進(jìn)行說明NEGDST指令稱為取負(fù)指令,是一條單操作數(shù)指令。它的功能是將目的操作數(shù)的值取負(fù)。正數(shù)-該數(shù)的負(fù)數(shù)的補(bǔ)碼,負(fù)數(shù)(補(bǔ)碼)-該數(shù)的正數(shù)。指令中操作數(shù)的尋址方式可采用除立即數(shù)外的各種尋址方式,但不能是段寄存器。NEGAXNEGBYTEPTRDINEGWORDPTR 4BXNEGDAT1SI

20、例如:第一條指令,設(shè)(AX)=00F2H,則結(jié)果(AX)=FF0EH,同時(shí)CF=1,SF=1,AF=1,PF=0,OF=0,ZF=0。2 比較指令格式:CMPDST,SRC;DST-SRC并設(shè)置標(biāo)志位指令的功能:目的操作數(shù)減去源操作數(shù),并根據(jù)相減結(jié)果設(shè)置各標(biāo)志位。CMPAL,BLCMPAL,DICMPAX,CXCMPAX,06H3 增量和減量指令I(lǐng)NCDSTDECDST均為單操作數(shù)指令。操作數(shù)的尋址方式為除立即數(shù)和段寄存器外的其他各種尋址方式。指令的功能是對(duì)目的操作數(shù)加1或減1。標(biāo)志位初CF外都受影響。INCALINCBXINCWORDPTR4BXDECCX4 乘法與除法指令MULSRCIMU

21、LSRC ;有符號(hào)乘法,操作數(shù)同上。例:MULDAT1IMULCLMULBYTEPTRBX() 帶符號(hào)運(yùn)算時(shí),操作數(shù)和結(jié)果均以補(bǔ)碼表示,結(jié)果的符號(hào)按一般的運(yùn)算規(guī)則確定。() 乘法指令中的目的操作數(shù)的尋址方式是隱含的,并且一定是累加器AX或AL。源操作數(shù)的尋址方式可采用除立即數(shù)和段寄存器外的各種尋址方式。() 指令是字運(yùn)算或字節(jié)運(yùn)算由源操作數(shù)的類型確定。字運(yùn)算:AX-DX:AX ,字節(jié)運(yùn)算:AL-AX() 乘法指令執(zhí)行后,標(biāo)志寄存器中只有CF和OF位有意義,其它各位不確定。MUL指令,結(jié)果中的高16位(字運(yùn)算)或高8位(字節(jié)運(yùn)算)均為0時(shí),CF和OF被置0,否則置1。IMUL指令:結(jié)果中高16位

22、(字運(yùn)算)或高8位(字節(jié)運(yùn)算)為低16位或低8位的符號(hào)擴(kuò)展時(shí),CF和OF被置0,否則CF和OF置1。乘除法指令分帶符號(hào)運(yùn)算和不帶符號(hào)運(yùn)算兩種。例:比較MUL與IMUL乘法的不同:DAT1DW8004HMOVAX,05HMULDAT1MOVAX,05HMULBYTEPTRDAT1MOVAX,05HIMULBYTEPTRDAT1MOVAX,05HIMULWORDPTRDAT14條指令的運(yùn)行() 無符號(hào)字運(yùn)算() 無符號(hào)字節(jié)運(yùn)算() 帶符號(hào)字節(jié)運(yùn)算() 帶符號(hào)字運(yùn)算除法指令中的目的操作數(shù)的尋址方式也是隱含的,并且一定是DX:AX或AX。5 符號(hào)擴(kuò)展指令CBWAL的符號(hào)據(jù)擴(kuò)展到Ah中CWDAX中的符號(hào)

23、擴(kuò)展到DX中6 BCD數(shù)調(diào)整指令BCD數(shù)調(diào)整指令的操作數(shù)均為隱含尋址(AL,AX)AAA加法分離BCD數(shù)調(diào)整,影響AF,CFAAS減法分離BCD數(shù)調(diào)整,影響AF,CFDAA加法組合BCD數(shù)調(diào)整,OF標(biāo)志位無定義,影響其余各標(biāo)志位DAS減法組合BCD數(shù)調(diào)整,OF標(biāo)志位無定義,影響其余各標(biāo)志位AAM乘法分離BCD數(shù)調(diào)整,影響SF,ZF,PF,但OF,AF,CF無定義AAD除法分離BCD數(shù)調(diào)整,影響SF,ZF,PF,但OF,AF,CF無定義對(duì)BCD數(shù)進(jìn)行十進(jìn)制運(yùn)算() 對(duì)BCD數(shù)按二進(jìn)制進(jìn)行運(yùn)算() 對(duì)運(yùn)算結(jié)果進(jìn)行相應(yīng)的調(diào)整調(diào)整方法是: 累加器AL低4位大于9或輔助進(jìn)位標(biāo)志位AP1,則累加器AL加0

24、6H修正。 累加器AL高4位大于9或進(jìn)位標(biāo)志位CY1,則累加器AL加60H修正, 累加器AL高4位大子等于9,低4位大于9,則累加器AL進(jìn)行加66H修正。BCD碼是一種用二進(jìn)制編碼的十進(jìn)制數(shù),又稱為二一十進(jìn)制數(shù)。80868088中BCD碼分為兩種形式:其一是用四位二進(jìn)制數(shù)表示一位十進(jìn)制數(shù),稱為壓縮的BCD碼;其二是用八位二進(jìn)制數(shù)表示一位十進(jìn)制數(shù)、稱為非壓縮的BCD碼,它的低四位是BcD碼,高四位沒有意義。AAM和AAD只能調(diào)整分離BCD碼的運(yùn)算。例:求兩個(gè)4位組合BCD數(shù)的和BCD1DB45H,19HBCD2DB71H,12HBCD3DB2DUP(?)MOVAL,BCD1ADDAL,BCD2D

25、AAMOVBCD3,ALMOVAL,BCD1+1ADCAL,BCD2+1DAAMOVBCD3+1,AL例:設(shè)有兩數(shù)X,Y,且X=85,Y=6,用分離BCD數(shù)完成X/YBCD1DB05H,08HBCD2DB06HBCD3DB3DUP(?)MOVAH,0MOVAL,BCD1+1MOVBL,BCD2DIVBLMOVBCD3+1,ALMOVAL,BCD1AADDIVBLMOVBCD3,ALMOVBCD3+2,AH423 邏輯運(yùn)算類指令A(yù)NDDST,SRCANDDST,DATAORDST,SRCORDST,DATAXORDST,SRCXORDST,DATATESTDST,SRCTESTDST,DATAN

26、OTDSTSRC:立即數(shù),通用寄存器和任一尋址方式所制定的內(nèi)存單元。DST:通用寄存器和任一尋址方式所制定的內(nèi)存單元,但不允許是立即數(shù)。指令可以是字節(jié)操作,也可以是字操作。NOT指令對(duì)標(biāo)志位不產(chǎn)生影響,其余指令將使CF,OF置0,并以正常規(guī)則設(shè)置SF,ZF,PF的狀態(tài)。ANDAL,01HANDAX,BXORBYTEPTR AVL,80HTESTAL,08HNOTBX(AX)=5555H,(BX)=0FF00H,AVL-09HTEST指令和AND指令的區(qū)別:TEST指令只影響標(biāo)志位,不影響原目的操作數(shù)的值。邏輯運(yùn)算指令可以通過選用不同的源操作數(shù)的各位代碼,使目的操作數(shù)的某些位置位、清零和測(cè)試目的

27、操作數(shù)的某些位。ORCL,03HANDAL,0F5HXORAH,0FHTESTAL,02HJZZERXORAL,TEXT_CODEJZPROC1424 移位指令和循環(huán)移位指令SHRDST,CNTSHL/SALDST,CNTSARDST,CNTRORDST,CNTROLDST,CNTRCRDST,CNTRCLDST,CNT功能:將DST所指出的操作數(shù)的各位左移或右移若干位,移位的次數(shù)由CNT確定。DST:除立即數(shù)外的各種尋址方式,但不能是段寄存器。CNT可以是立即數(shù)或寄存器CL。為立即數(shù)時(shí),只能為1。左移指令:右移指令:對(duì)標(biāo)志的影響:對(duì)AF無影響,循環(huán)移位只影響CF和OF,(可能影響ZF,但無意

28、義)。只有CNT=1時(shí),OF有意義,當(dāng)操作數(shù)的最高位在移位前后不發(fā)生變化OF=0,否則OF=1。例如:SHRAX,1SALAL,CLROLSAT1SI,CL例如:將兩位組合BCD碼轉(zhuǎn)換成ASCII碼,并存放在制定單元:BCD在AL中MOVSI,0MOVBL,ALANDAL,0FHADDA,30HMOVBUFSI,ALMOVCL,04SHRBL,CLADDBL,30HINCSIMOVBUFSI,BLBUFDB2DUP(?)425 處理器控制指令與標(biāo)志處理指令CLC0CFSTC1CFCMCCF取反CLD0DFSTD1DFCLI0IFSTI1IFNOP空操作HLT暫停WAIT等待LOCK總線鎖定前置

29、ESC外部設(shè)備換碼1 NOP指令占用機(jī)器的3個(gè)周期2 HLT指令 CPU的復(fù)位輸入端RESET線上有復(fù)位信號(hào) 非屏蔽中斷請(qǐng)求輸入端NMI線上出現(xiàn)請(qǐng)求信號(hào) 可屏蔽中斷輸入端INTR線上出現(xiàn)請(qǐng)求信號(hào)且標(biāo)志寄存器的中斷標(biāo)志IF=1。43匯編語(yǔ)言程序設(shè)計(jì)的基本方法431 匯編語(yǔ)言程序設(shè)計(jì)的基本步驟1 分析問題2 確定算法算法:算法描述:自然語(yǔ)言、類程序設(shè)計(jì)語(yǔ)言或流程圖(本書采用)() 起始和終止框() 執(zhí)行框() 判斷框() 連接符3 編寫程序() 了解所用CPU的編程模型、指令系統(tǒng)、尋址方式及有關(guān)指令() 進(jìn)行存儲(chǔ)空間和工作單元的合理分配() 子程序和宏指令() 用標(biāo)號(hào)或變量來代替絕對(duì)地址和常數(shù)4

30、程序的校驗(yàn)5 編寫說明文件432 IBM PC 匯編語(yǔ)言源程序的完整結(jié)構(gòu)及偽指令1 段定義偽指令格式:段名SEGMENT定位類型組合類型類別段名ENDS() 段名段名:所定義的段的名稱,具有:段地址、偏移地址、定位類型、組合類型和類別等屬性。() 定位類型定位類型:對(duì)段的起始邊界的要求,類型有PAGE、PARA、WORD、BYTE。PAGE=XXXXXXXXXXXX00000000(頁(yè))PARA=XXXXXXXXXXXXXXXX0000(節(jié))WORD=XXXXXXXXXXXXXXXXXXX0(字)BYTE=XXXXXXXXXXXXXXXXXXXX(字節(jié))PAGE: 段起始地址的低8位是0,其值

31、能被256整除(稱為頁(yè)邊界)。PARA: 段起始地址的低4位是0,其值能被l 6整除(稱為段邊界)。此方式為系統(tǒng)的隱合定位方式,WORD:段起始地址的最低位是0,其值能被2整除(稱為字邊界)一偶地址。 BYTE:段起始地址是任意值。定義類型的默認(rèn)段為PARA類型。3組臺(tái)類型 為連接程序提供此段與其他段之間關(guān)系的信息共有六種選擇。 NONE: 系統(tǒng)隱含連接方式,表示此段與其他段沒有邏輯上的聯(lián)系,每段多有自己的基址。 PUBLIC:指示連接程序把此段與其他同名同類別的段連接起來形成一個(gè)物理段公用一個(gè)段的起始地址。連接順序由連接程序決定。 STACK:表示此段是堆棧段,連接方式同PUBLIC,源程序

32、至少要有一個(gè)堆棧段。連接后的段起始地址在SS寄存器中否則提示錯(cuò)誤。通常,寄存器SS指向第一個(gè)遇到的堆棧段。 COMMON:表示此段與其他同名同類別的段共用同一個(gè)段起始地址,使這些段相互重疊,段的長(zhǎng)度取最長(zhǎng)段的長(zhǎng)度。 MEMORY:表示此段在連接時(shí)定位在其他所有段之上(高地址處)。對(duì)于多個(gè)MEMORY段匯編程序?qū)训谝粋€(gè)段認(rèn)為是MEMORY其余為COMMON。AT表達(dá)式:表示此段定位在表達(dá)式值指定的段地址處。 (4)類別凡是類別名相同的段校先后順序連接起來時(shí)組成一個(gè)段組共用同一個(gè)類別名。類別名必須用單引號(hào)括起來,例如,CODE、DATA、STACK。STACKSEGMENTSTACKENDSDA

33、TASEGMENTDATAENDSDATA1SEGMENTDATA1ENDSCODESEGMENTCODEENDSEND例如:TITLEADDINGPAGE60,70STACKSEGMENTPARA STACKSTACKTOPLABELWORDSTACKENDSDATASEGMENTADR1DB54H,76H,12H,00HDB21H,98H,04H,00HADR2DW4DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVSP,OFFSET TO

34、PMOVDI,OFFSETTOPMOVAX,4DIADDAX,DIMOVADR2,AXMOVAX,6DIADCAX,2DIMOVADR2+2,AXMOVAH,4CHINT21HCODEENDSENDSTART2 ASSUME偽指令格式:ASSUME段寄存器:名稱,段寄存器:名稱,。段寄存器:CS、DS、ES、SS名稱:() 由SEGMENT偽指令定義的段名() 表達(dá)式:SEG變量名或SEG標(biāo)號(hào)() GROUP偽指令定義的段組名ASSUME偽指令是使源程序中段與段寄存器發(fā)生聯(lián)系3 END格式:ENDS表達(dá)式表達(dá)式:該程序運(yùn)行時(shí)的啟動(dòng)地址,是一條可執(zhí)行語(yǔ)句的標(biāo)號(hào)4 ORG格式:ORG表達(dá)式(2字節(jié)

35、的無符號(hào)數(shù))功能:指明該語(yǔ)句下面的程序在段內(nèi)的起始地址5 “=”偽指令和EQU指令() “=”指令格式:名稱=表達(dá)式表達(dá)式:整型常量、包含兩個(gè)字符的常量、已定義的符號(hào)常量、一個(gè)由運(yùn)算符構(gòu)成的表達(dá)式() EQU指令格式:名稱EQU表達(dá)式例如:KEQU1024MEQUK*8STRING1EQUABCDPORT2EQU40HPIEQU3.14159WPTEQUWORDPTRBPTEQUBYTEPTRBUFADDREQUBUFMOVAL,BPTBUFADDRMOVAX,BUFADDR433 順序程序例如:寫出計(jì)算Y=A*B+C-18的程序。A、B、C分別為3個(gè)帶符號(hào)的8位二進(jìn)制PAGE55,60CCE

36、QU18STACKSEGMENTSTACKDW256DUP(?)TOPLABELWORDSTACKENDSDATASEGMENTDAT1DB34HDAT2DB56HDAT3DB0E7HDATYDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVSP,OFFSETTOPMOVAL,DAT1MOVBL,DAT2IMULBLMOVBX,AXMOVAL,DAT3CBWADDAX,BXSUBAX,CCMOVDATY,AXMOVAH,4CHINT21HCODEEN

37、DSENDSTART例如:要求編寫一個(gè)程序,實(shí)現(xiàn)求N的整數(shù)平方根值。10<N<26.(自學(xué))434 分支程序1. 程序的分支結(jié)構(gòu)程序在執(zhí)行過程中根據(jù)判斷條件的判斷結(jié)果決定程序的流向,這就是分支程序。分支可分為單分支結(jié)構(gòu)和多分支結(jié)構(gòu)。2. 轉(zhuǎn)移指令轉(zhuǎn)移指令是用來改變程序的執(zhí)行順序的,分為無條件轉(zhuǎn)移指令和條件轉(zhuǎn)移指令。(1) 無條件轉(zhuǎn)移指令無條件轉(zhuǎn)移指令的難點(diǎn)是:尋址方式??煞譃橹苯愚D(zhuǎn)移和間接轉(zhuǎn)移兩種。1) 直接轉(zhuǎn)移指令。段內(nèi)直接轉(zhuǎn)移指令JMPSHORT OPR,OPR為語(yǔ)句標(biāo)號(hào)或語(yǔ)句標(biāo)號(hào)加常量的表達(dá)式。指令的尋址方式為相對(duì)尋址方式。相對(duì)位移量D8的范圍為-128127,D8=轉(zhuǎn)向地址

38、-IP的當(dāng)前值。例如:AGAIN:MOVAX,08JMP AGAIN如果JMP指令的偏移地址=0020H,AGAIN的偏移地址=0009H,D8=0009H-0022H=E7H(-19H)。段內(nèi)直接近轉(zhuǎn)移指令 JMP NEAR PTR OPR 除D16為16位外,其它與前一種相同。段間直接遠(yuǎn)轉(zhuǎn)移指令 JMP FAR PTR OPROPR包含段地址和段內(nèi)偏移地址。例如:JMPSHORTMULT1JMPNEARPTRMULT1JMPFARPTRMULT1JMPSHORTMULT1+0AH若JMP SHORT MULT1的段地址=4000H,偏移地址=0100H,它的下一條指令的IP=0102H,則

39、MULT的范圍為:0181H0082H2) 間接轉(zhuǎn)移指令JMP OPR1分段內(nèi)間接轉(zhuǎn)移和段間間接轉(zhuǎn)移。OPR1:存放轉(zhuǎn)向地址的單元,其尋址方式為除立即數(shù)外的所有方式。段內(nèi)間接轉(zhuǎn)移,16位地址。OPR1可以是寄存器,也可是字類型的變量。例如:JMPBXJMPTADRDIJMPWORD PTR BXJMPDBT1。段間間接轉(zhuǎn)移OPR1必須為一個(gè)雙字類型的變量例如:JMPDWORD PTR DIJMPDBT2JMPTADR1BXDBT2DD04000000HTADR1DD06000010H,06000040H,06000086H(2) 條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令是指只有指令中給定的條件滿足時(shí)才發(fā)生轉(zhuǎn)移

40、。判斷的依據(jù)是標(biāo)志寄存器中各位的狀態(tài)。指令中OPR與無條件轉(zhuǎn)移指令一樣,可以使標(biāo)號(hào)或標(biāo)號(hào)加常數(shù)的表達(dá)式。其尋址方式只有一種,即位移量為8位的相對(duì)尋址方式。1) 帶符號(hào)數(shù)與無符號(hào)數(shù)情況下條件轉(zhuǎn)移指令的使用JB:無符號(hào)數(shù)JL :帶符號(hào)數(shù)MOVAX,VAL1MOVBX,VAL2CMPAX,BXVAL1=003AH VAL2=8003HOFDFIFTFSFZFAFPFCF110X0X0X1 VAL1與VAL2位無符號(hào)數(shù),應(yīng)用JB來判斷,用CF標(biāo)志 VAL1與VAL2為有符號(hào)數(shù),應(yīng)用JL來判斷,用SF和OF異或的結(jié)果。2) 測(cè)試標(biāo)志3) 標(biāo)志位的影響 例如:MOVAX,SI指令不影響ZF標(biāo)志。4) 指令

41、的多種表示方式JBSMJNAESMJCSM3. 分支程序設(shè)計(jì)分支程序設(shè)計(jì)的要點(diǎn): (1)正確選擇判定條件和相應(yīng)的條件轉(zhuǎn)移指令() 每條分支都有完整的結(jié)果() 檢查和測(cè)試每一條分支例如:求X的絕對(duì)值,并送回原處。STACKSEGMENT STACKDW256 DUP(?)TOPLABELWORDSTACKENDSDATASEGMENTXADRDW3456H,8192HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVAX,XADRANDAX,AXJNSDONENEGAXMOVXADR,AXDONE:MOVAH,

42、4CHINT21HCODEENDSEND START也可以改成: ANDAX,AXJSNEGXJMPSHORT DONENEGX:NEGAXMOVXADR,AXDONE:MOVAH,4CHINT21H例如4。3。4:寫出將一位十六進(jìn)制數(shù)轉(zhuǎn)換成對(duì)應(yīng)的ASCII碼的程序(大寫字母)包括09和AF六個(gè)字母。09轉(zhuǎn)換成ASCII碼只要加30H即可,AF必須加上37H才行。給定一個(gè)數(shù)后,現(xiàn)判斷他的范圍,再轉(zhuǎn)換。程序和框圖如下:4。3。5 循環(huán)程序例如:將5個(gè)數(shù)從內(nèi)存的某個(gè)區(qū)域移到另一個(gè)區(qū)域程序如下:1 循環(huán)程序的基本結(jié)構(gòu)() 循環(huán)準(zhǔn)備部分() 循環(huán)工作部分() 調(diào)整部分() 循環(huán)出口部分2 循環(huán)控制命令

43、指令的尋址方式為相對(duì)尋址方式。相對(duì)位移量為8位,尋址范圍為-128127。OPR為語(yǔ)句標(biāo)號(hào)或語(yǔ)句標(biāo)號(hào)加常量表達(dá)式。指令的功能和應(yīng)用:() 將ADRS開始的100個(gè)數(shù)據(jù)送到ADRD,假設(shè)段地址為DS和ESLEASI,ADRSLEADI,ADRDMOVCX,100AGAIN:MOVAL,SIMOVES:DI,ALINCSIINCDILOOPAGAIN() 最多傳送100個(gè)字節(jié),以#結(jié)束傳送。LEASI,ADRSLEADI,ADRDMOVCX,100AGAIN:MOVAL,SICMPA,#JE/JZPENDMOVES:DI,ALINCSIINCDIMOVAL,SILOOPAGAINPEND:3 循環(huán)

44、程序設(shè)計(jì)() 根據(jù)問題確定循環(huán)工作部分() 確定循環(huán)的調(diào)整部分() 確定循環(huán)的出口例436:求某數(shù)組中負(fù)數(shù)的個(gè)數(shù)。例438求一字符串的長(zhǎng)度,并要求濾去第一個(gè)非空格字符前的所有空格。字符串以#結(jié)束。435 子程序及過程定義1. 調(diào)用與返回指令1) 調(diào)用指令CALL子程序入口地址的尋址方式與無條件轉(zhuǎn)移指令的轉(zhuǎn)向地址的尋址方式基本相同() 段內(nèi)直接調(diào)用指令CALL OPR,OPR為子程序名(過程名),代表了子程序的入口地址,相對(duì)尋址方式,相對(duì)位移量:16位,入口地址與返回地址的差值。() 段內(nèi)間接調(diào)用指令CALL OPR1。OPR1:存放子程序入口地址的單元,() 段間直接調(diào)用指令CALL FAR

45、PTR OPR 。OPR為過程名,代表子程序入口地址的段地址和偏移地址() 段間間接調(diào)用指令CALL OPR1。OPR1:32位段地址和偏移量的內(nèi)存單元入口。過程名:SEARCH1 PMOVE變量:SADR0400H:0100HCALLSEARCH10400H:0103H0400H:0220HCALLFAR PTR PMOVE0400H:0225HCALLBXCALLWORD PTR BXCALLSADR2) 返回指令RET 功能:從堆棧彈出返回地址送入IP或送入IP和CS。尋址方式:以SP間接尋址。分段內(nèi)返回RET和段間返回RETF。RET:2字節(jié)到IP,SP+2-SP;RETF:SP-IPSP+2-CSRET N2. 過程定義定義格式:過程名PROC類型RET過程名ENDP() 過程名具有與語(yǔ)句標(biāo)號(hào)相同的屬性:段地址、偏移量和類型。() 類型:NEAR和FAR() PROC和ENDP關(guān)鍵字() RET是過程的返回指令3. 主程序與子程序之間的參數(shù)傳遞子程序入口參數(shù):子程序出口參數(shù):1) 寄存器傳遞參數(shù)方式2) 指定內(nèi)存單元傳遞參數(shù)方式3) 堆棧

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論