匯編語(yǔ)言優(yōu)秀課件_第1頁(yè)
匯編語(yǔ)言優(yōu)秀課件_第2頁(yè)
匯編語(yǔ)言優(yōu)秀課件_第3頁(yè)
匯編語(yǔ)言優(yōu)秀課件_第4頁(yè)
匯編語(yǔ)言優(yōu)秀課件_第5頁(yè)
已閱讀5頁(yè),還剩72頁(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)介

1、2021/3/291匯編語(yǔ)言程序設(shè)計(jì)南京工業(yè)大學(xué) 2017春任課教師:管昕潔2021/3/292第四章 匯編語(yǔ)言程序結(jié)構(gòu)匯編語(yǔ)言程序的基本結(jié)構(gòu)匯編語(yǔ)言的數(shù)據(jù)運(yùn)算符與表達(dá)式 偽指令 2021/3/293匯編語(yǔ)言程序的基本結(jié)構(gòu)匯編程序的基本框架匯編語(yǔ)言的指令格式2021/3/294匯編程序的基本框架完整段定義框架簡(jiǎn)化段定義框架2021/3/295完整段定義框架完整段定義框架STACK SEGMENT ;定義堆棧段 STACK ENDSDATA SEGMENT ;定義數(shù)據(jù)段 DATA ENDSCODE SEGMENT ;定義代碼段 ASSUME CS:CODE,DS:DATA,SS:STACK ;說(shuō)

2、明代碼段的段地址放在CS中 ;數(shù)據(jù)段的段地址放在DS中 ;堆棧段的段地址放在SS中START:MOV AX,DATA MOV DS,AX ;數(shù)據(jù)段段地址送DS中 ;程序 MOV AX,4C00H ;程序結(jié)束返回DOS INT 21HCODE ENDS ;代碼段結(jié)束 END START2021/3/296簡(jiǎn)化段定義框架MODEL SMALL 386 STACK ;堆棧段 DATA ;數(shù)據(jù)段 CODE ;代碼段STARTUP ;程序 EXIT ;返回DOS END 2021/3/297【例例4-14-1】設(shè)設(shè) X X,Y Y,Z Z為為1616位帶符號(hào)的字變量,計(jì)算位帶符號(hào)的字變量,計(jì)算(X+12

3、5-X(X+125-X* *Y)/ZY)/Z后將商存入后將商存入X X ,余數(shù)存入,余數(shù)存入Y Y中。中。STACK SEGMENT STACK SEGMENT ;定義堆棧段;定義堆棧段 DW 100H DUPDW 100H DUP(?)(?)STACK ENDSSTACK ENDSDATA SEGMENT DATA SEGMENT ;定義數(shù)據(jù)段;定義數(shù)據(jù)段 X DW 3 X DW 3 Y DW 4 Y DW 4 Z DW 10 Z DW 10DATA ENDSDATA ENDSCODE SEGMENT CODE SEGMENT ;定義代碼段;定義代碼段 ASSUME CSASSUME CS:

4、CODECODE,DSDS:DATADATA,SSSS:STACK STACK ; STARTSTART: MOV AXMOV AX, DATADATA MOV DS MOV DS, AXAX ;數(shù)據(jù)段段地址送;數(shù)據(jù)段段地址送DSDS中中 MOV AXMOV AX,X X ;乘數(shù);乘數(shù)XAXXAX IMUL Y IMUL Y ;X XYDXYDX:AXAX MOV CX MOV CX,AX AX MOV BX MOV BX,DX DX ;結(jié)果再存放到;結(jié)果再存放到BXBX:CXCX中暫存中暫存 MOV AXMOV AX,X X ;XAXXAX ADD AX ADD AX,125 125 ;X+

5、125AXX+125AX CWD CWD ;將;將AXAX轉(zhuǎn)換成雙字轉(zhuǎn)換成雙字DXDX:AXAX SUB AX SUB AX,CX CX ;低;低1616位減法位減法 SBB DXSBB DX,BX BX ;高;高1616位減法,位減法,X+125-XX+125-XYDXYDX:AXAX IDIV Z IDIV Z ;(;(X+125-XX+125-XY Y)Z Z,商,商AXAX,余數(shù),余數(shù)DXDX MOV X MOV X, AX AX ;商;商X X MOV Y MOV Y, DX DX ;余數(shù);余數(shù)Y Y MOV AXMOV AX,4C00H 4C00H ;程序結(jié)束返回;程序結(jié)束返回DO

6、SDOS INT 21H INT 21HCODE ENDS CODE ENDS ;代碼段結(jié)束;代碼段結(jié)束 END END STARTSTART 2021/3/298MODEL SMALL MODEL SMALL ;選擇編程模式為小模式;選擇編程模式為小模式386 386 ;選擇;選擇8038680386指令系統(tǒng)指令系統(tǒng)STACK STACK ;堆棧段;堆棧段DW 100H DUPDW 100H DUP(?)(?) DATA DATA ;數(shù)據(jù)段;數(shù)據(jù)段X DW 3X DW 3Y DW 4Y DW 4Z DW 10Z DW 10CODE CODE ;代碼段;代碼段STARTUPSTARTUP MO

7、V AX MOV AX,X X ;乘數(shù);乘數(shù)XAXXAX IMUL Y IMUL Y ;X XYDXYDX:AXAX MOV CX MOV CX,AX AX ; MOV BXMOV BX,DX DX ;結(jié)果再存放到;結(jié)果再存放到BXBX:CXCX中暫存中暫存 MOV AXMOV AX,X X ;XAXXAX ADD AX ADD AX,125 125 ;X+125AXX+125AX CWD CWD ;將;將AXAX轉(zhuǎn)換成雙字轉(zhuǎn)換成雙字DXDX:AXAX SUB AX SUB AX,CX CX ;低;低1616位減法位減法 SBB DXSBB DX,BX BX ;高;高1616位減法,位減法,X

8、+125-XX+125-XYDXYDX:AXAX IDIV Z IDIV Z ;(;(X+125-XX+125-XY Y)Z Z,商,商AXAX,余數(shù),余數(shù)DXDX MOV X MOV X, AX AX ;商;商X X MOV Y MOV Y, DX DX ;余數(shù);余數(shù)Y YEXIT EXIT ;返回;返回DOSDOSEND END 2021/3/299匯編語(yǔ)言的指令格式 匯編語(yǔ)言程序中的指令可以分為指令、偽指令兩種。 指令的格式 標(biāo)號(hào): 操作碼 操作數(shù) ;注釋 方括號(hào)中的內(nèi)容根據(jù)程序或指令的要求可有可無(wú)。 標(biāo)號(hào) 由26個(gè)大小寫英文字母、09數(shù)字、(下劃線)、$、?等字 符組成,數(shù)字不能出現(xiàn)在

9、標(biāo)號(hào)的第一個(gè)字符位置,后跟“:”。 操作碼 匯編指令的助記符(關(guān)鍵字),一條匯編指令必須有唯一的操作碼,指出該指令的操作內(nèi)容。 操作數(shù) 為操作提供必要的數(shù)據(jù)信息。 注釋 表示對(duì)該條指令的說(shuō)明,可寫可不寫,如果有注釋則必須在注釋前加分號(hào)。2021/3/2910匯編語(yǔ)言的指令格式 偽指令格式 名字名字 偽指令助記符偽指令助記符 操作數(shù)操作數(shù) ;注釋;注釋 方括號(hào)中的內(nèi)容根據(jù)程序或指令的要求可有可無(wú) 名字 是該語(yǔ)句的符號(hào)地址,后不跟后不跟“:”:” 偽指令助記符(偽操作符) 給出該偽指令的操作內(nèi)容 操作數(shù) 為操作提供必要的信息 名字:變量名、過(guò)程名、段名、常量名等 名字和標(biāo)號(hào)都具有三個(gè)屬性:段基址、

10、偏移量和類型 標(biāo)號(hào)的類型:NEAR型和FAR型 變量的類型:字節(jié)、字、雙字、四字等2021/3/2911匯編語(yǔ)言的數(shù)據(jù) 常量 變量 標(biāo)號(hào) 變量定義時(shí)用到的操作符和表達(dá)式2021/3/2912常量 匯編語(yǔ)言的常數(shù)主要包括整數(shù)、字符、字符串、符號(hào)常量與數(shù)值表達(dá)式等 整數(shù) 整數(shù)包括:二進(jìn)制、八進(jìn)制、十六進(jìn)制、十進(jìn)制表示的整數(shù),如:011000101B 、7654Q、0ABCDH、32768D(或32768) 在指令中把二進(jìn)制、八進(jìn)制、十六進(jìn)制、十進(jìn)制表示的整數(shù)叫做立即數(shù) 字符與字符串 字符與字符串必須用單引號(hào)或雙引號(hào)括起來(lái)。例如:“A”為字符常量,“AAA”為字符串常量2021/3/2913常量 符

11、號(hào)常量 符號(hào)常量是用賦值偽指令EQU定義的符號(hào)名 賦值偽指令的格式: 常量名 EQU 表達(dá)式 例如:X EQU 100;X為符號(hào)常量,在程序中X為100,X是一個(gè)常量。 數(shù)值表達(dá)式 以常數(shù)(立即數(shù))或符號(hào)地址(變量、標(biāo)號(hào)等)作為操作數(shù)的地方,均可使用數(shù)值表達(dá)式。2021/3/2914變量 變量的一般格式: 變量名 助記符 操作數(shù) ;注釋 其中 :變量名 是一個(gè)非保留字的標(biāo)識(shí)符,可有可無(wú) 助記符 指定變量的長(zhǎng)度,如P99表4-1所示 操作數(shù) 可以是數(shù)字常量、字符常量、字符串常量、符號(hào)常量、數(shù)值表達(dá)式、地址表達(dá)式、?、n DUP 操作數(shù)等 可以包含0個(gè)、一個(gè)或多個(gè)操作數(shù),多個(gè)操作數(shù)之間以逗號(hào)(,)

12、分隔2021/3/2915變量 標(biāo)識(shí)符 標(biāo)識(shí)符包括:標(biāo)號(hào)、變量名、子程序名和宏名等 標(biāo)識(shí)符的使用原則: 由31個(gè)字母、數(shù)字及規(guī)定的特殊字符(?、$)等組成 不區(qū)分標(biāo)識(shí)符中字母的大小寫 不能以數(shù)字開頭 不能單獨(dú)使用$或? 不能是系統(tǒng)的保留字,如指令名、寄存器名和偽指令名等 例如,_DATA1、LOP、STAR、count是合法的標(biāo)識(shí)符 ADD、EAX、MOV、6X是不合法的 又如:FFFFH是標(biāo)識(shí)符,0FFFFH是十六進(jìn)制數(shù)值2021/3/2916變量【例4-2】操作數(shù)可以是數(shù)字常量或是數(shù)值表達(dá)式。 X1 DB 10,0,10H X2 DW ?,100,5 X3 DD 5*20+5 ,0ABCD

13、EF68H2021/3/2917變量【例4-3】操作數(shù)可以是字符常量或字符串常量: C1 DB HELLO,$ C2 DB A C3 DB “AB” C4 DW “AB” ;注意C3和C4的區(qū)別下圖列出了本例在內(nèi)存中的存儲(chǔ)分配結(jié)構(gòu)(P101圖4-3,圖4-4):2021/3/2918變量的屬性 變量具有三個(gè)屬性 : 段屬性 變量的段屬性是指變量所在段的段地址。 偏移屬性 變量的偏移屬性是指變量所在段的首地址到該變量的偏移量。 例P100圖4-2:X1和X2的偏移地址分別為0000H和0003H。 類型屬性 變量的類型屬性是指存取該變量中的數(shù)據(jù)所對(duì)應(yīng)的字節(jié)數(shù) 有字節(jié)(BYTE)、字(WORD)、

14、雙字(DWORD)等2021/3/2919變量定義時(shí)用到的操作符和表達(dá)式 當(dāng)前位置計(jì)數(shù)器($) 當(dāng)前位置計(jì)數(shù)器($)表示當(dāng)前的偏移值【例4-4】下列指令是在數(shù)據(jù)段中定義的,畫出其內(nèi)存中的存儲(chǔ)結(jié)構(gòu),并計(jì)算出符號(hào)常量LEN1和LEN2的值。 X1 DB 1,2,3,5 LEN1 EQU $-X1 X2 DW 1234H LEN2 EQU $-X2 假設(shè)X1地址為2000H,LEN為符號(hào)常量,不占存儲(chǔ)空間,X2為字變量,則X2的地址為2004H。LEN1的值是$-X1=2004H-2000H=0004H,數(shù)組X1的長(zhǎng)度為4字節(jié)。LEN2的值是$-X2=2006H-2004H=0002H,變量X2的長(zhǎng)

15、度為2字節(jié)。2021/3/2920設(shè)置內(nèi)存空間表達(dá)式(?) “?”表示沒(méi)有為該存儲(chǔ)空間賦初值,匯編后該存儲(chǔ)空間清零。 例如: X3 DB 1,?,?,?,2 X4 DW ?,1234H,? 【例4-5】用一個(gè)完整的程序完成上述定義。 MODEL SMALL 386 STACK DATA ;數(shù)據(jù)段 X1 DB 1,2,3,5 LEN1 EQU $-X1 X2 DW 1234H LEN2 EQU $-X2 X3 DB 1,?,?,?,2 LEN3 EQU $-X3 X4 DW ?,1234H,? LEN4 EQU $-X4 CODE ;代碼段STARTUPMOV AX,LEN1MOV BX,LEN

16、2MOV CX,LEN3MOV DX,LEN4EXITEND2021/3/2921重復(fù)定義操作符(DUP) 用于定義重復(fù)的元素【例4-7】 ARRAY1 DB 2 DUP(1,2,2,?) ARRAY2 DB 50 DUP(?)如圖4-8【例4-8】 DUP可以嵌套 ARRAY3 DB 2DUP(0,2DUP(1,2),3) ARRAY3的長(zhǎng)度為12個(gè)字節(jié),該偽指令的存儲(chǔ)結(jié)構(gòu)如圖4-9所示2021/3/2922使用地址表達(dá)式作為DW或DD的操作數(shù) 地址包括:數(shù)據(jù)段中定義的變量名或數(shù)組名,代碼段中的標(biāo)號(hào)或子程序名【例4-9】設(shè)LOP為代碼段的一個(gè)標(biāo)號(hào),MAX為代碼段中的某一子程序名,則在數(shù)據(jù)段中

17、有如下定義: X1 DW 1234H ;定義字變量X1,并賦初值1234H X2 DW X1 ;定義字變量X2,所賦初值是變量X1的偏移地址 X3 DD X1 ;定義雙字變量X3,所賦初值是變量X1的邏輯地址 X4 DW LOP ;LOP偏移地址 X5 DD LOP ;LOP邏輯地址 X6 DW MAX ;MAX偏移地址 X7 DD MAX ;MAX邏輯地址 X8 DW $ ;定義字變量X8,所賦初值是X8的偏移地址(當(dāng)前地址)2021/3/2923練習(xí) 給出如下程序中的數(shù)據(jù)定義,問(wèn)PLENTH的值為多少?它表示什么意義?PARTNO DW ?PNAME DB 16 DUP (?)COUNT

18、DD ?PLENTH EQU $-PARTNO 答:PLENTH=22=16H,它表示變量PARTNO、PNAME、COUNT總共占用的存儲(chǔ)單元數(shù)(字節(jié)數(shù))2021/3/2924標(biāo)號(hào) 標(biāo)號(hào)是用來(lái)說(shuō)明可執(zhí)行指令在匯編語(yǔ)言程序中的位置 例如: LP1:MOV AX,X LOOP LP1 ;轉(zhuǎn)移到標(biāo)號(hào)LP1處的指令2021/3/2925標(biāo)號(hào) 標(biāo)號(hào)三個(gè)屬性: 標(biāo)號(hào)的段屬性 標(biāo)號(hào)的段屬性是指標(biāo)號(hào)定義所在段的段地址。 標(biāo)號(hào)的偏移屬性 標(biāo)號(hào)的偏移屬性是指標(biāo)號(hào)所在段的首地址到該標(biāo)號(hào)的定義語(yǔ)句的偏移量。 標(biāo)號(hào)的類型屬性 標(biāo)號(hào)的類型屬性是指標(biāo)號(hào)距轉(zhuǎn)移指令的距離,是轉(zhuǎn)移到本段內(nèi)的標(biāo)號(hào),還是轉(zhuǎn)移到其它段的標(biāo)號(hào)。(即是

19、NEAR還是FAR).2021/3/2926運(yùn)算符與表達(dá)式 算術(shù)運(yùn)算符 邏輯運(yùn)算符 關(guān)系運(yùn)算符 數(shù)值回送操作符 屬性操作符(PTR、: 、THIS、SHORT、HIGH、LOW) 移位運(yùn)算符 運(yùn)算符的優(yōu)先級(jí)2021/3/2927算術(shù)運(yùn)算符 算術(shù)運(yùn)算符包括:+、*、 /、MOD(取余)。 運(yùn)算符MOD是作除法操作,取余數(shù),如:10 MOD 3 =1。 需要注意的問(wèn)題: 算術(shù)運(yùn)算符可以用于數(shù)值表達(dá)式或地址表達(dá)式中,參加運(yùn)算的數(shù)和結(jié)果必須是整數(shù),除法運(yùn)算結(jié)果只有商無(wú)余數(shù) 當(dāng)算術(shù)運(yùn)算符用于地址表達(dá)式時(shí),常用方法是“地址常量”來(lái)描述指針的移動(dòng)2021/3/2928【例4-10】把首地址為BLOCK的字?jǐn)?shù)

20、組的第5個(gè)字送到AX中: MOV AX,BLOCK +(51)*2 【例4-11】將數(shù)組長(zhǎng)度(雙字?jǐn)?shù))存到CX中: ARRAY DD 1,2,3,4,5,6,7 COUNT DD ? MOV CX,(COUNTARRAY)/4 假設(shè)數(shù)組ARRAY的地址是2000H,則COUNT=201CH (COUNTARRAY)/4=(201CH 2000H )/4=0007H2021/3/2929邏輯運(yùn)算符 包括:AND(邏輯與) 、OR(邏輯或)、 XOR(邏輯異或)、 NOT(邏輯非)。 【例4-12】執(zhí)行下列指令,計(jì)算其邏輯運(yùn)算的值。 MOV AL, 88H AND 0FH ;AL=08H MOV

21、BL, 88H OR 0FH ;BL=8FH MOV CL, 88H XOR 0FH ;CL=87HMOV DL , NOT 88H ;DL=77HAND AL,88H AND 0FH ;兩個(gè)AND是有區(qū)別的。 注意注意: :邏輯運(yùn)算符與邏輯指令的區(qū)別。邏輯運(yùn)算符在匯編程序匯邏輯運(yùn)算符與邏輯指令的區(qū)別。邏輯運(yùn)算符在匯編程序匯編時(shí)計(jì)算,而邏輯指令在程序運(yùn)行時(shí)執(zhí)行。編時(shí)計(jì)算,而邏輯指令在程序運(yùn)行時(shí)執(zhí)行。2021/3/2930關(guān)系運(yùn)算符 包括:EQ (等于) NE(不等于) LT(小于) LE(小于等于) GT(大于) GE(大于等于) 關(guān)系運(yùn)算符的使用格式: 表達(dá)式1 關(guān)系運(yùn)算符 表達(dá)式2 計(jì)算結(jié)

22、果:真為全1,假為全0。2021/3/2931關(guān)系運(yùn)算符【例4-13】MOV AX,( X LT 10)AND 0F0FH)OR (X GE 10)AND 0505H) 該指令說(shuō)明: 當(dāng) X = 10 做 MOV AX,0505H2021/3/2932數(shù)值回送操作符 包括:SEG、OFFSET、TYPE、LENGTH、SIZE SEG(取段地址) 操作符格式: SEG 變量名/標(biāo)號(hào) 操作符功能:取變量或標(biāo)號(hào)的段基值(段地址) OFFSET(取偏移地址) 操作符格式: OFFSET 變量名/標(biāo)號(hào) 功能:取變量或標(biāo)號(hào)的偏移值(偏移地址) TYPE (取類型值) 操作符格式: TYPE 變量名/ 標(biāo)

23、號(hào) 功能:取變量或標(biāo)號(hào)的類型值。(字節(jié)=1、字=2、雙字=4等,NEAR=-1,F(xiàn)AR=-2)2021/3/2933數(shù)值回送操作符 LENGTH (取長(zhǎng)度) 操作符格式: LENGTH 變量名 功能:取分配給變量的字節(jié)、字、雙字等的個(gè)數(shù)(說(shuō)明:只有用DUP重復(fù)定義的變量才有意義,否則=1。) SIZE (取總字節(jié)數(shù)) 操作符格式: SIZE 變量名 操作符功能:SIZE 給出一個(gè)變量的總字節(jié)數(shù)(也就是LENGTH 和TYPE的乘積),即:SIZE=LENGTH TYPE2021/3/2934【例4-17】用一個(gè)完整的程序完成TYPE、LENGTH、SIZE的應(yīng)用 MODEL SMALL 386

24、 STACK DATA ;數(shù)據(jù)段 X1 DW 100 DUP(2) ;共定義200個(gè)字節(jié) X2 DD 2 DUP(8,3 DUP(0) ;共定義32個(gè)字節(jié) X4 DW 4,5,6 DUP(A) ;共定義16個(gè)字節(jié) CODE ;代碼段 STARTUP MOV AX,TYPE X1 ;AX=2 MOV AX,TYPE X2 ;AX =4 MOV AX,TYPE X4 ;AX =2 MOV AX,LENGTH X1 ;AX =100=64H MOV AX,LENGTH X2 ;AX =2 MOV AX,LENGTH X4 ;AX =1 MOV AX,SIZE X1 ;AX =2*100=200=0C

25、8H MOV AX,SIZE X2 ;AX =4*2=8 MOV AX,SIZE X4 ;AX =2*1=2 EXIT END 2021/3/2935屬性操作符包括:PTR、: 、THIS、SHORT、HIGH、LOWPTR(改變變量或標(biāo)號(hào)類型操作符)操作符格式: 類型 PTR 地址表達(dá)式其中 類型:BYTE、 WORD、 DWORD、 FAR、 NEAR。 地址表達(dá)式:表示(變量或標(biāo)號(hào))地址的數(shù)值。 變量:用變量名給出的有效地址。 標(biāo)號(hào):指令的有效地址。 操作符功能:臨時(shí)指定變量或標(biāo)號(hào)的操作類型2021/3/2936【例4-18】PTR操作符的應(yīng)用。在數(shù)據(jù)段定義:X DB AY DW 123

26、4HZ DD 12345678H 在代碼段中:MOV AX,Y ;類型匹配,正確此時(shí)AX=1234HMOV BL, BYTE PTR Y ;用PTR取出Y變量中的一個(gè)字節(jié),BL=34HM0V CL, BYTE PTR Y+1;用PTR取出Y變量中的一個(gè)字節(jié),CL=12HMOV DL,BYTE PTR Z+3 ;將Z+3所指的字節(jié)內(nèi)容送DL中,DL=12H2021/3/2937 【例4-19】PTR操作符的應(yīng)用。 在數(shù)據(jù)段定義:X2 DW ? ;X2為字變量X1 EQU BYTE PTR X2 ;將X2的地址賦給X1,X1為字節(jié)變量X3 EQU BYTE PTR(X2+1);將X2+1的地址賦X

27、3,X3為字節(jié)變量X3 EQU X1+1 ;將X1+1的地址賦給X3,X3仍為字節(jié)變量 內(nèi)存中安排見P109圖4-10。 說(shuō)明:同一個(gè)單元可有兩個(gè)變量名,一個(gè)是字的屬性(如說(shuō)明:同一個(gè)單元可有兩個(gè)變量名,一個(gè)是字的屬性(如X2X2),),另一個(gè)是字節(jié)的屬性(如另一個(gè)是字節(jié)的屬性(如X1X1)??筛鶕?jù)需要選用不同的變量。)??筛鶕?jù)需要選用不同的變量。2021/3/2938:(修改段操作符)操作符格式: 段寄存器 :變量/標(biāo)號(hào)/地址表達(dá)式其中段寄存器:CS、DS、ES、SS。操作符功能:用段修改操作符來(lái)修改一個(gè)變量、標(biāo)號(hào)或地址表達(dá)式的段屬性(段超越)。2021/3/2939【例4-20】操作符的應(yīng)

28、用。MOV AX , ES:BX+SI ;基址加變址尋址,隱含的段寄存器是DS MOV EAX , GS:DWORD PTRBX ;寄存器間接尋址,隱含段寄存器是 DS改為GS 【例4-21】操作符的應(yīng)用。 DATA X DW ? CODE MOV AX , CS: X 2021/3/2940THIS (指定類型操作符)操作符格式: 變量名/標(biāo)號(hào)/過(guò)程名 THIS 類型操作符功能:為某一個(gè)變量名指定一個(gè)類型(BYTE、WORD、DWORD、QWORD、FWORD、TWORD、)或?yàn)槟骋粋€(gè)標(biāo)號(hào)或過(guò)程指定一種轉(zhuǎn)移距離(NEAR,FAR)。同時(shí)指定該操作數(shù)地址與下一個(gè)存儲(chǔ)單元地址相同。2021/3/

29、2941【例4-22】THIS操作符的應(yīng)用。 VAR1 EQU THIS BYTE ;指定VAR1為字節(jié)常量 VAR2 DW ? ;VAR1為字節(jié)(BYTE)常量, VAR2為字(WORD)變量。 經(jīng)過(guò)上述定義后; MOV AL,VAR1 MOV AX,VAR2 【例4-23】THIS操作符的應(yīng)用。 CODE LOP1 EQU THIS FAR LOP1: DEC CX 2021/3/2942SHORT (短轉(zhuǎn)移操作符)操作符格式: SHORT 標(biāo)號(hào) 操作符功能:短轉(zhuǎn)移操作符是用來(lái)指定JMP指令中轉(zhuǎn)向地址為8位位移量,而不是在缺省時(shí)的16位位移量。標(biāo)號(hào)為轉(zhuǎn)移偏移值,該偏移值 為 - 128 +

30、127字節(jié),則JMP 轉(zhuǎn)移范圍為IP+(-128 +127)2021/3/2943HIGH(取高位字節(jié)) 和LOW(取低位字節(jié))操作符 操作符格式: HIGH/LOW 數(shù)值表達(dá)式/符號(hào)常量 操作符功能:取數(shù)值表達(dá)式或符號(hào)常量的高位字節(jié)或低位字節(jié),不能作用于內(nèi)存操作數(shù)【例4-24】字節(jié)分離操作符的應(yīng)用。 CONST EQU 0ABCDH MOV AH , HIGH CONST ;AH=ABH MOV AL , LOW CONST ;AL=CDH2021/3/2944移位運(yùn)算符移位運(yùn)算符SHL和 SHR, 是按位運(yùn)算的,只用于數(shù)值表達(dá)式中。運(yùn)算符格式: 常量 SHL/ SHR 位數(shù)運(yùn)算符功能:將運(yùn)

31、算符左邊的二進(jìn)制數(shù)左移或右移運(yùn)算符右邊的所指定的移位位數(shù),空出的位補(bǔ)0。當(dāng)移位位數(shù)大于15,則結(jié)果為0。如:MOV AX,41H SHL 2;將41H左移2位,結(jié)果送AX寄存器中,AX=104H。2021/3/2945運(yùn)算符的優(yōu)先級(jí) 運(yùn)算規(guī)則仍為先計(jì)算優(yōu)先級(jí)高的運(yùn)算符同級(jí)運(yùn)算符自左向右進(jìn)行計(jì)算優(yōu)先級(jí)運(yùn)算符1(最高)LENGTH、SIZE 、()、 (記錄中)、(結(jié)構(gòu)中)2PTR、OFFSET、SEG、TYPE、THIS、段操作符:3HIGH、LOW(字節(jié)分離操作符)4*、 、MOD 、SHL、SHR5、6 EQ、NE、LT、LE、GT、GE7NOT8AND9OR、 XOR10(最低)SHORT

32、2021/3/2946偽指令 完整段定義偽指令(SEGMENT、ENDS、ASSUME) 處理器選擇偽指令 簡(jiǎn)化段定義偽指令 定位偽指令 ORG 賦值偽指令(EQU、= ) LABEL偽指令 對(duì)準(zhǔn)偽指令(EVEN) 標(biāo)題偽指令2021/3/2947完整段定義偽指令(SEGMENT、ENDS、ASSUME)段定義偽指令(SEGMENT、ENDS)格式: 段名 SEGMENT 對(duì)齊類型 組合類型 使用類型類別名 段名 ENDS 功能:定義邏輯段,SEGMENT表示某個(gè)邏輯段開始,ENDS表示該邏輯段結(jié)束。其中:段名自定義。4個(gè)選項(xiàng)可選可不選,有可選項(xiàng)時(shí)各項(xiàng)順序不能錯(cuò),可選項(xiàng)之間用空格隔開。2021

33、/3/2948對(duì)齊類型 表示當(dāng)前段的起始邊界要求。即定義了當(dāng)前段在內(nèi)存中表示當(dāng)前段的起始邊界要求。即定義了當(dāng)前段在內(nèi)存中起始邊界的設(shè)定起始邊界的設(shè)定, ,說(shuō)明了段與段之間的空隙。對(duì)齊類型可說(shuō)明了段與段之間的空隙。對(duì)齊類型可以是:以是: PAGE(PAGE(頁(yè)頁(yè)) )、 PARA(PARA(節(jié)節(jié)) )、WORD(WORD(字字) )、BYTE(BYTE(字節(jié)字節(jié)) )、DWORD(DWORD(雙字雙字) )。 PAGE (PAGE (頁(yè)頁(yè)) ) 設(shè)該段的起始地址的低設(shè)該段的起始地址的低8 8位為位為”0”0”。該地址是可以被。該地址是可以被256256整除的地址,整除的地址,1 1頁(yè)為頁(yè)為256

34、256字節(jié)字節(jié), ,當(dāng)對(duì)齊類型為當(dāng)對(duì)齊類型為PAGEPAGE時(shí)時(shí), ,說(shuō)明該段從頁(yè)的邊界開始說(shuō)明該段從頁(yè)的邊界開始, ,該段與下一段的最大存儲(chǔ)空該段與下一段的最大存儲(chǔ)空間為間為256256字節(jié)字節(jié), ,假如在該段中只放一個(gè)字節(jié)的數(shù)據(jù)假如在該段中只放一個(gè)字節(jié)的數(shù)據(jù), ,則該則該段距下一個(gè)段的空隙為段距下一個(gè)段的空隙為255255個(gè)字節(jié)。個(gè)字節(jié)。 PARA(PARA(節(jié)節(jié)) ) 設(shè)段的起始地址的低設(shè)段的起始地址的低4 4位為位為”0”0”。 該地址是可以被該地址是可以被1616整除的地址,整除的地址,1 1節(jié)為節(jié)為1616字節(jié)字節(jié), ,當(dāng)對(duì)齊類型為當(dāng)對(duì)齊類型為PARAPARA時(shí)時(shí), ,說(shuō)明說(shuō)明該段

35、從節(jié)的邊界開始該段從節(jié)的邊界開始, ,該段與下一段的最大存儲(chǔ)空間為該段與下一段的最大存儲(chǔ)空間為1616字節(jié)字節(jié), ,假如在該段中只放一個(gè)字節(jié)的數(shù)據(jù)假如在該段中只放一個(gè)字節(jié)的數(shù)據(jù), ,則該段距則該段距下一個(gè)段的空隙為下一個(gè)段的空隙為1515個(gè)字節(jié)。對(duì)齊類型個(gè)字節(jié)。對(duì)齊類型缺省時(shí)缺省時(shí), ,隱含隱含PARA(PARA(節(jié)的邊界節(jié)的邊界) )。2021/3/2949對(duì)齊類型 WORD(字) 表示本段的起始地址(段基地址)以偶地址開始。段與段之間最大空間為1個(gè)字,最大空隙為1字節(jié)。 BYTE(字節(jié)) 表示本段的起始地址可以從字節(jié)地址開始(任意地址)。段與段之間最大空間為1字節(jié),段與段之間無(wú)任何空隙。

36、DWORD(雙字) 表示本段的起始地址是可以被4整除的地址。段與段之間最大空間為4個(gè)字,最大空隙為3字節(jié)。2021/3/2950組合類型 當(dāng)程序有多個(gè)段時(shí),用來(lái)說(shuō)明段與段之間是怎樣連接和定位的。 共有六種組合類型: 缺省 PRIVATE: 沒(méi)有說(shuō)明,匯編程序就認(rèn)為本段不和別的段連接。 PUBLIC:本段與同名段順序連接,組成一個(gè)大的邏輯段,它們共用同一個(gè)段起始地址。 COMMON:本段與同名段從同一地址開始重疊連接。段長(zhǎng)是同名段中最長(zhǎng)的段的長(zhǎng)度,重疊部分的內(nèi)容取決于排列在最后一段的內(nèi)容。2021/3/2951組合類型 STACK:表示該段是堆棧段的一部分。把所有相同類別名的具有STACK組合類

37、型的段連接成一個(gè)連續(xù)段。將連續(xù)段首地址送SS,段內(nèi)最大偏移地址送SP。當(dāng)定義了STACK屬性后,在主程序中可省略對(duì)SS和SP的初始化。 MEMORY:表示在N個(gè)互相連接的段中,本段的定位地址為最高地址,如果有多個(gè)MEMORY的段,則把第一個(gè)遇到的段當(dāng)作MEMORY處理,其他均當(dāng)作COMMON(重疊)處理。 AT表達(dá)式:本段定位在表達(dá)式所表示的位置并且節(jié)對(duì)齊。 如:S1 SEGMENT PARA AT 0A800H;表示本段段地址為0A800H并且節(jié)對(duì)齊2021/3/2952使用類型 包括: USE16或USE32,用來(lái)說(shuō)明使用16位尋址方式還是32位尋址方式,該使用類型用于386以上機(jī)型。 缺

38、省時(shí)隱含USE16 在實(shí)模式下使用USE16,為16位尋址方式,則段長(zhǎng)不超過(guò)64KB,其地址是由16位段地址和16位偏移地址組成2021/3/2953類別名 在引號(hào)中給出相連接的段名,完成把具有相同類名的段連接在一起。 如:CODE1 SEGMENT PARA PUBLIC CODE;表示把所有的有CODE類別的段連接在一起。2021/3/2954指定段寄存器偽指令(指定段寄存器偽指令(ASSUMEASSUME)格式: ASSUME 段寄存器名:段名,段寄存器名:段名功能:告訴匯編程序,在運(yùn)行期間通過(guò)哪個(gè)段寄存器才能找到所要的指令和數(shù)據(jù)。該指令放在程序的代碼段中。 如:ASSUME CS:CO

39、DE,ES:ESTRA,DS:DATA,SS:STACK說(shuō)明:ASSUME僅明確段名與段寄存器的關(guān)系,但段寄存器中還沒(méi)有段地址的數(shù)值,因此還必須用傳送指令將段地址裝入相應(yīng)的段寄存器中。2021/3/2955完整段定義源程序書寫形式完整段定義源程序書寫形式數(shù)據(jù)段名 SEGMENT ;數(shù)據(jù)段可有可無(wú),也可多個(gè)用偽指令定義的數(shù)據(jù)空間 數(shù)據(jù)段名 ENDS 堆棧段名 SEGMENT ;堆棧段可有可無(wú),也可多個(gè)用偽指令定義的數(shù)據(jù)空間 堆棧段名 ENDS代碼段名 SEGMENT ;代碼段最少有一個(gè) ASSUME(定義尋址關(guān)系)起始標(biāo)號(hào):2021/3/2956完整段定義源程序書寫形式完整段定義源程序書寫形式

40、MOV AX,數(shù)據(jù)段名 MOV DS,AX ;初始化DS MOV AX,堆棧段名 MOV SS,AX ;初始化SS 過(guò)程名 PROC 過(guò)程名 ENDP 代碼段名 ENDS END START;給出程序的起始地址 說(shuō)明:ASSUME僅明確段名與段寄存器的關(guān)系,但段寄存器中還沒(méi)有段地址的數(shù)值,因此還必須用傳送指令將段地址裝入相應(yīng)的段寄存器中。2021/3/2957段寄存器的裝入 DS、ES 裝入2021/3/2958【例4-25】設(shè)X為字節(jié)變量,是在數(shù)據(jù)段DATA1中定義的,Y是在另外一個(gè)數(shù)據(jù)段中定義的具有字節(jié)屬性的符號(hào)地址,請(qǐng)將X變量的內(nèi)容送Y數(shù)組的第6個(gè)元素中。 DATA1 SEGMENT X

41、 DB 18H DATA1 ENDS DATA2 SEGMENT Y DB 10H DUP(?) DATA2 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA1,ES:DATA2 START:MOV AX, DATA1 MOV DS, AX ;將DATA1段地址送DS MOV AX,DATA2 MOV ES, AX ;將DATA2段地址送ES MOV AL, X ; AL=12H MOV ESES:Y5, AL ; 12HY+5單元中 MOV AX ,4C00H ; 返回DOS狀態(tài) INT 21H CODE ENDS END START2021/3/2959SS

42、的裝入(可省略,系統(tǒng)會(huì)自動(dòng)分配一定的堆??臻g) 方法1: STACK1 SEGMENT PARA STACK DB 50H DUP(?) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE, SS:STACK1 當(dāng)目標(biāo)代碼裝入存儲(chǔ)器后,SS中已自動(dòng)裝入STACK段的段基值,堆棧指針SP指向堆棧的底部+1的存儲(chǔ)單元,則:SP=4FH+1=50H。2021/3/2960SS的裝入方法2: STACK1 SEGMENT PARA DW 50H DUP(?) TOP LABEL WORD ;TOP屬性為WORD STACK1 ENDS CODE SEGMENT ASSUME

43、 CS:CODE, SS:STACK1 START: MOV AX , STACK1 MOV SS, AX ;堆棧段的段地址送SS MOV SP , OFFSET TOP;堆棧段的棧頂?shù)刂匪蚐P TOP 是該堆棧的初始棧頂部地址。2021/3/2961CS的裝入對(duì)CS和IP的裝入方法是利用END后的標(biāo)號(hào)來(lái)完成的。因?yàn)樵摌?biāo)號(hào)是可執(zhí)行程序的起始地址。如:START : END START系統(tǒng)會(huì)自動(dòng)將START 所在段的段地址送CS寄存器,將START 所在段內(nèi)的偏移地址送IP寄存器2021/3/2962操作系統(tǒng)下匯編程序的正常結(jié)束 對(duì)于可執(zhí)行文件(.EXE)在DOS提示符下正常結(jié)束可以用兩種方法:

44、 方法1 (此方法較常用,稱DOS功能調(diào)用) MOV AX ,4C00H;或MOV AH,4CH INT 21H 方法2: MAIN PROC FAR PUSH DS ;保存原來(lái)的數(shù)據(jù)段段地址 MOV AX, 0H ;0送AX PUSH AX ;0壓棧 RET ;返回DOS MAIN ENDP2021/3/2963結(jié)束偽指令(END)在完整段定義源程序的最后一條指令為結(jié)束偽指令END,后面的起始標(biāo)號(hào)是告訴匯編器該程序的起始點(diǎn)為起始標(biāo)號(hào)處。指令格式: END 標(biāo)號(hào) 其中:標(biāo)號(hào)可以是過(guò)程名或 帶“:”的標(biāo)號(hào)。當(dāng)標(biāo)號(hào)缺省時(shí)表示該模塊不是主程序模塊。指令功能:表示整個(gè)程序的結(jié)束。并指明該過(guò)程或程序的起

45、始地址。2021/3/2964處理器選擇偽指令 需要注意的問(wèn)題: 處理器選擇偽指令在2種程序框架中均可使用 缺省時(shí)為選擇8088/8086微處理器指令系統(tǒng)處理器選擇偽指令處理器選擇偽指令指令功能指令功能80868086選擇選擇8088/80868088/8086微處理器指令系統(tǒng)微處理器指令系統(tǒng)286286選擇選擇8028680286微處理器指令系統(tǒng)微處理器指令系統(tǒng)386386選擇選擇8038680386微處理器指令系統(tǒng)微處理器指令系統(tǒng)486486選擇選擇8048680486微處理器指令系統(tǒng)微處理器指令系統(tǒng)586586選擇選擇PentiumPentium微處理器指令系統(tǒng)微處理器指令系統(tǒng)286P2

46、86P選擇選擇8028680286保護(hù)模式指令系統(tǒng)保護(hù)模式指令系統(tǒng)386P386P選擇選擇8038680386保護(hù)模式指令系統(tǒng)保護(hù)模式指令系統(tǒng)486P486P選擇選擇8048680486保護(hù)模式指令系統(tǒng)保護(hù)模式指令系統(tǒng)586P586P選擇選擇PentiumPentium保護(hù)模式指令系統(tǒng)保護(hù)模式指令系統(tǒng)2021/3/2965簡(jiǎn)化段定義偽指令常用的簡(jiǎn)化段定義偽指令簡(jiǎn)化段定義偽指令指令功能DATA定義數(shù)據(jù)段SATCKsize堆棧段,大小可指定,大小不指定時(shí),則默認(rèn)1KBCODEname代碼段,段名可任選MODEL選擇存儲(chǔ)模型STARTUP在簡(jiǎn)化段定義框架中指示程序的開始EXIT在簡(jiǎn)化段定義框架中,使

47、程序返回到DOS狀態(tài)2021/3/2966簡(jiǎn)化段定義的存儲(chǔ)模型MODEL指令格式: MODEL 模型指令功能:定義存儲(chǔ)器模型模型功能Tiny 所有數(shù)據(jù)和代碼裝入同一個(gè)代碼段內(nèi)。該模型程序產(chǎn)生MS-DOS的COM 格式的文件。程序的起始偏移地址為0100H。一般用于小程序。用于MS-DOS。Small 數(shù)據(jù)存放在一個(gè)64K字節(jié)的數(shù)據(jù)段,代碼放在另外一個(gè)64K字節(jié)代碼段。程序只有一個(gè)代碼段和一個(gè)數(shù)據(jù)段。數(shù)據(jù)段和代碼段均為近訪問(wèn),是應(yīng)用程序最常用的一種模型。用于MS-DOS和Windows。Medium 數(shù)據(jù)裝入一個(gè)64K字節(jié)的數(shù)據(jù)段中,而代碼段可以是多于一個(gè)。數(shù)據(jù)是近訪問(wèn)的,而代碼則可遠(yuǎn)訪問(wèn)。用于

48、MS-DOS和Windows。Compact 代碼裝入一個(gè)64K字節(jié)的數(shù)據(jù)段中,而數(shù)據(jù)段可以是多于一個(gè)。代碼是近訪問(wèn),數(shù)據(jù)則為遠(yuǎn)訪問(wèn)。用于MS-DOS和Windows。Large 代碼和數(shù)據(jù)都可分別裝入多于一個(gè)的代碼段和多于一個(gè)的數(shù)據(jù)段中。數(shù)據(jù)和代碼都可以遠(yuǎn)訪問(wèn)。用于MS-DOS和Windows。Huge 與Large模型相同,不同的是允許數(shù)據(jù)段大于64K字節(jié)。用于MS-DOS和Windows。 F1at 所有數(shù)據(jù)和代碼使用一個(gè)段,允許使用32位偏移量 ,DOS下不支持這種模型,用于Windows NT,MASM60以上版本。2021/3/2967程序開始與結(jié)束偽指令(STARTUP、EXIT)STARTUP偽指令指令格式: STARTU

溫馨提示

  • 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)論