微機(jī)原理 8086匯編程序設(shè)計(jì).ppt_第1頁(yè)
微機(jī)原理 8086匯編程序設(shè)計(jì).ppt_第2頁(yè)
微機(jī)原理 8086匯編程序設(shè)計(jì).ppt_第3頁(yè)
微機(jī)原理 8086匯編程序設(shè)計(jì).ppt_第4頁(yè)
微機(jī)原理 8086匯編程序設(shè)計(jì).ppt_第5頁(yè)
已閱讀5頁(yè),還剩92頁(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、1/96,主要內(nèi)容: 一、匯編語(yǔ)言語(yǔ)句格式 二、匯編語(yǔ)言偽指令 三、匯編語(yǔ)言源程序的匯編與連接 四、匯編語(yǔ)言程序設(shè)計(jì)的基本方法,匯編語(yǔ)言程序設(shè)計(jì),2/96,本講重點(diǎn): 偽操作 匯編語(yǔ)言程序格式 簡(jiǎn)單匯編程序設(shè)計(jì),匯編語(yǔ)言程序設(shè)計(jì),3/96,一、匯編語(yǔ)言語(yǔ)句格式,匯編語(yǔ)言語(yǔ)句有指令性語(yǔ)句、偽指令語(yǔ)句和宏指令語(yǔ)句三種類型。 1、指令性語(yǔ)句: 標(biāo)號(hào): 操作碼 操作數(shù) ;注釋 是機(jī)器指令的符號(hào)表示,經(jīng)匯編產(chǎn)生對(duì)應(yīng)的機(jī)器指令代碼,在形成執(zhí)行文件時(shí)執(zhí)行。 2、偽指令語(yǔ)句: 名字 偽指令助記符 操作數(shù) ;注釋 只是給匯編程序提供一些控制信息,幫助匯編程序正確匯編指令性語(yǔ)句,沒有對(duì)應(yīng)的機(jī)器碼。 說明:名字可以

2、是符號(hào)常量名、變量名、過程名、段名等,名字后面不能有“:”。 偽指令命令助記符共有40多個(gè),按功能不同分成八類。操作數(shù)之間須用逗號(hào)分隔。 3、宏指令語(yǔ)句:宏名 宏操作助記符 操作數(shù) ;注釋 是指令性語(yǔ)句和指示性語(yǔ)句的復(fù)合體,在匯編時(shí)被展開。 說明:宏名即宏指令名,是一標(biāo)識(shí)符,宏名后面不能有“:”。 宏操作助記符有MACRO、ENDM、LOCAL、REPT、IRP、PURGE等8個(gè)。,匯編程序不區(qū)分大小寫,4/96,匯編語(yǔ)言語(yǔ)句統(tǒng)一格式規(guī)定,指令性語(yǔ)句、偽指令語(yǔ)句和宏指令語(yǔ)句的統(tǒng)一格式: 名字項(xiàng) 操作項(xiàng) 操作數(shù)項(xiàng) ;注釋項(xiàng) 1.名字項(xiàng):最多由21個(gè)字符組成??捎上铝凶址M成。 字母AZ、az 數(shù)

3、字09 特殊符號(hào)?、 、 、 、$等 注意: 名字項(xiàng)的第一個(gè)字符不可以是數(shù)字,必須是字母或特殊字符,但是問號(hào)本身不能單獨(dú)作為名字; 如果用到特殊符號(hào),則它必須是首字符。 匯編語(yǔ)言的專用保留字、寄存器名、8088/8086匯編語(yǔ)言中的指令助記符、偽指令名、表達(dá)式中使用的運(yùn)算符和屬性運(yùn)算符等均不能作為名字項(xiàng),否則匯編會(huì)給出錯(cuò)誤信息; 名字項(xiàng)在程序中不能重復(fù)定義。,5/96,(1) 段屬性:可用SIG偽指令求出 此屬性用于定義標(biāo)號(hào)和變量的段起始地址。標(biāo)號(hào)通常在代碼段CS中定義,變量通常在DS、ES和SS段中定義。 (2) 偏移屬性:可用OFFSET偽指令求出 此屬性指出標(biāo)號(hào)或變量距離段起始地址的字節(jié)

4、數(shù),它是一個(gè)16位的無(wú)符號(hào)數(shù)。 (3) 類型屬性:可用TYPE偽指令求出 對(duì)標(biāo)號(hào)而言,此屬性指出其引用類型,段內(nèi)引用屬于NEAR類,指針長(zhǎng)度為2字節(jié);段間引用屬于FAR類,指針長(zhǎng)度為4字節(jié)。對(duì)變量而言,此屬性指出其字節(jié)長(zhǎng)度,可為1、2、4、8、10個(gè)字節(jié)。,名字項(xiàng)屬性,6/96,2.操作項(xiàng),可以是指令、宏指令、偽指令的助記符。 【例】LOOP: MOV AX , BX BUFFER DB 1,2,3,4,5,6,7 ;數(shù)據(jù)定義偽指令,在主存中開辟7個(gè)連續(xù)的字節(jié)單元,初值依次為17,BUFFER表示首地址,7/96,3. 操作數(shù)項(xiàng),操作數(shù)項(xiàng)可以由常量、寄存器、標(biāo)號(hào)、變量或表達(dá)式等組成。 (1)常

5、量 常量是沒有屬性的純數(shù),其數(shù)值在匯編過程中被確定,并在程序運(yùn)行時(shí)保持不變。分為數(shù)值常量和字符型常量。,各種形式數(shù)字常量格式對(duì)照表,8/96,字符串常量,字符串常量是用單引號(hào)或雙引號(hào)引起來的一個(gè)或多個(gè)字符。字符串常量是以各字符的ASC碼表示的。如A用41H 表示,字符串A1B2用41H,31H,42H,32H表示。,9/96,常數(shù)項(xiàng)舉例,例5.2 SUB DH,22;常數(shù)22為立即數(shù),匯編后為16H MOV BX,SI十32H;常數(shù)32H作位移量 DB12H;定義一個(gè)字節(jié)數(shù)據(jù) DW1234H;定義一個(gè)字?jǐn)?shù)據(jù) DD12345678H;定義一個(gè)雙字?jǐn)?shù)據(jù) DB 9BD;定義三個(gè)字節(jié)的字符串?dāng)?shù)據(jù),在

6、內(nèi)存中就是39H、42H、44H,10/96,(2)表達(dá)式及運(yùn)算符,算術(shù)運(yùn)算符 移位運(yùn)算符 邏輯運(yùn)算符 關(guān)系運(yùn)算符 分析運(yùn)算符 綜合運(yùn)算符,表達(dá)式由常數(shù)、寄存器、標(biāo)號(hào)、變量與一些運(yùn)算符組合而成,分為數(shù)字表達(dá)式和地址表達(dá)式。匯編過程中,匯編程序按照一定的優(yōu)先規(guī)則,對(duì)表達(dá)式進(jìn)行計(jì)算后得到一個(gè)數(shù)值或地址,用作指令的操作數(shù)。,11/96,算術(shù)運(yùn)算符: (加)、(減)、*(乘)、(除)、MOD(求模) 移位運(yùn)算符: SHL(左移)、SHR(右移) 可以用于數(shù)值表達(dá)式又可用于地址表達(dá)式。,算術(shù)運(yùn)算符和移位運(yùn)算符,12/96,【例】 算術(shù)和移位運(yùn)算符進(jìn)行數(shù)值表達(dá)式運(yùn)算, NUM1EQU25*4 50;NUM

7、1=50 NUM2EQUNUM1 / 7;NUM2=7 NUM3EQUNUM1 MOD 7;NUM3=1 NUM4EQU0FH MOVAL,NUM4 SHL 4 ;(AL)=11110000B,13/96,與(AND)、或(OR)、異或(XOR)、非(NOT)四種運(yùn)算。 由于邏輯運(yùn)算是按位操作,且在匯編過程中完成,因而運(yùn)算的結(jié)果仍為整數(shù)常量。 【例】 用邏輯運(yùn)算符進(jìn)行運(yùn)算。 MOVAL,34H AND 0FH ;04HAL MOVBL,05H OR 30H ;35HBL MOVCX,NOT 00FFH ;0FF00HCX MOVDX,789AH XOR 000FH ;7895HDX,邏輯運(yùn)算符

8、,14/96,相等(EQ),不等(NE),小于(LT),大于(GT),小于等于(LE)及大于等于(GE)。 運(yùn)算結(jié)果成立時(shí)邏輯值為真,用0FFFFH表示; 關(guān)系不成立時(shí)邏輯值為假,用0表示。 【例】用關(guān)系運(yùn)算符進(jìn)行數(shù)值表達(dá)式運(yùn)算。 NUM1EQU10 LT 5 ;NUM1=0 NUM2EQU0AAAAH GT 7FFFH ;NUM2=0FFFFH MOVAX,A EQ 41H;0FFFFHAX MOVBX,NUM2 LT NUM1;0BX,關(guān)系運(yùn)算符,15/96,把標(biāo)號(hào)或變量所指存儲(chǔ)器地址的屬性(段、偏移量和類型)或一些特征分離出來,作為操作數(shù)使用。主要介紹3個(gè): SEG 運(yùn)算符 OFFSET

9、運(yùn)算符 TYPE運(yùn)算符,分析運(yùn)算符號(hào),16/96,格式:SEG 變量或標(biāo)號(hào) 功能:分離出其后變量或標(biāo)號(hào)所在段的段首址。 【例】已知數(shù)據(jù)段從存儲(chǔ)器的23000H地址開始,DBUF是該段中的一個(gè)變量名。 MOV BX,SEG DBUF 匯編為: MOV BX,2300H, SEG 運(yùn)算符,17/96,格式:OFFSET 變量或標(biāo)號(hào) 功能:分離出其后變量或標(biāo)號(hào)的偏移地址。 【例】已知標(biāo)號(hào)START的段地址為2100H,物理地址為21200H。 MOV DX,OFFSET START 匯編為: MOV DX,0200H 這條指令與指令 LEA DX,START功能相同。, OFFSET 運(yùn)算符,18/

10、96,格式:TYPE 變量或標(biāo)號(hào) 功能:分離出其后變量或標(biāo)號(hào)的類型。如果是變量,將返回該變量的類型對(duì)應(yīng)字節(jié)數(shù);如果是標(biāo)號(hào),則返回代表標(biāo)號(hào)類型的數(shù)值。它們之間的關(guān)系見下表所示。, TYPE運(yùn)算符,【例】已定義 ARRAY DB 22,33 指令 ADD SI,TYPE ARRAY匯編為: ADD SI,1,19/96, 段屬性前綴運(yùn)算符“” 格式為: 段寄存器名地址表達(dá)式 或 段名地址表達(dá)式 或 組名地址表達(dá)式 此運(yùn)算符用來表示一個(gè)標(biāo)號(hào)、變量或地址表達(dá)式的段屬性。 【例】用段前綴指定附加段內(nèi)操作數(shù)的地址 MOV AL,ESDATA ;指令源操作數(shù)在附加段DATA地址單元中,(5)綜合運(yùn)算符,20

11、/96, LOW和HIGH 格式為: LOW 表達(dá)式 或 HIGH 表達(dá)式 此運(yùn)算符用于對(duì)一個(gè)16位數(shù)據(jù)或地址表達(dá)式,用HIGH取其高位字節(jié)、LOW取其低位字節(jié)。所以此運(yùn)算符又稱為字節(jié)分離運(yùn)算符。 【例】已知 RESULT EQU 7788H 則MOV AH , HIGH RESULT 匯編為:MOV AH,77H MOV AL , LOW RESULT 匯編為: MOV AL,88H,(5)綜合運(yùn)算符,21/96,本節(jié)介紹了幾種常用的運(yùn)算符。為了正確計(jì)算表達(dá)式的數(shù)值,應(yīng)該按照運(yùn)算符的優(yōu)先級(jí): 先高后低、自左向右(優(yōu)先級(jí)相同時(shí))地進(jìn)行計(jì)算。括號(hào)內(nèi)的表達(dá)式應(yīng)優(yōu)先計(jì)算。 下面給出相關(guān)運(yùn)算符 從高到

12、低的優(yōu)先級(jí)排列順序:,表達(dá)式及運(yùn)算符小結(jié),22/96,(在圓括號(hào)中的項(xiàng)),方括號(hào)中的項(xiàng),結(jié)構(gòu)變量(變量、字段) LENGTH,SIZE、WIDTH和MASK PTR,OFFSET,SEG,TYPE,THIS及段運(yùn)算符 HIGH和 LOW *,MOD,SHL(左移),SHR(右移) +,- EQ,NE,LT,LE,GT,GE NOT AND OR,XOR SHORT,表達(dá)式及運(yùn)算符小結(jié),23/96,4.注釋項(xiàng),一行語(yǔ)句分號(hào)后面的內(nèi)容,主要用來說明程序或語(yǔ)句功能,增加程序的可讀性。對(duì)于較大的程序,注釋項(xiàng)更不能缺少。 分號(hào)(;)放在語(yǔ)句后,用來說明該語(yǔ)句的功能; 分號(hào)放在某一行的開頭,用來說明下面一

13、段程序的功能; 分號(hào)加到指令前,可暫時(shí)凍結(jié)有疑問的指令,調(diào)試正確后,再把這些指令解凍或刪除,這樣可減少語(yǔ)句增、刪的編輯工作。,24/96,MOV CX,0;傳送指令,具有2個(gè)操作數(shù) DELAY:NOP ;空操作指令,沒有操作數(shù),帶有標(biāo)號(hào) LOOP DELAY;循環(huán)指令,標(biāo)號(hào)DELAY說明轉(zhuǎn)移位置 BUFFER DB 1,2,3,4,5,6,7 ;數(shù)據(jù)定義偽指令,在主存中開辟7個(gè)連續(xù)的字節(jié)單元,初值依次為17,BUFFER表示首地址,匯編語(yǔ)言語(yǔ)句實(shí)例,25/96,本節(jié)小結(jié),匯編語(yǔ)言指令格式 名字項(xiàng) 操作項(xiàng) 操作數(shù)項(xiàng) ;注釋項(xiàng) 標(biāo)號(hào)和變量的屬性: 段屬性、偏移屬性、類型屬性 操作數(shù)的表達(dá)形式 算術(shù)

14、、移位、邏輯、關(guān)系、屬性、綜合運(yùn)算符,首頁(yè),26/96,二、匯編語(yǔ)言偽指令,偽指令:在匯編程序?qū)υ闯绦騾R編期間由匯編程序處理的操作(不是真正執(zhí)行的指令),可以完成處理器選擇、定義程序模式、定義數(shù)據(jù)、分配存儲(chǔ)區(qū)、指示程序結(jié)束等功能。 常用偽指令:,處理器選擇偽指令; 段定義偽指令 程序開始與結(jié)束偽指令; 數(shù)據(jù)定義與存儲(chǔ)器分配偽指令;,賦值偽指令; 地址計(jì)數(shù)器與對(duì)準(zhǔn)偽指令; 基數(shù)控制偽指令; 偶地址對(duì)準(zhǔn)偽指令;,27/96,1.處理器選擇偽操作,.8086 選擇 8086 指令系統(tǒng) .286 選擇 80286 指令系統(tǒng) .286P 選擇保護(hù)模式下的 80286 指令系統(tǒng) .386 選擇 80386

15、 指令系統(tǒng) .386P 選擇保護(hù)模式下的 80386 指令系統(tǒng) .486 選擇 80486 指令系統(tǒng) .486P 選擇保護(hù)模式下的 80486 指令系統(tǒng) .586 選擇 Pentium 指令系統(tǒng) .586P 選擇保護(hù)模式下的 Pentium 指令系統(tǒng),一般放在整個(gè)程序的最前面。默認(rèn)值為.8086,28/96,2.段定義偽指令,完整的匯編語(yǔ)言源程序由段組成 一個(gè)匯編語(yǔ)言源程序可以包含若干個(gè)代碼段、數(shù)據(jù)段、附加段或堆棧段,段與段之間的順序可隨意排列。 需獨(dú)立運(yùn)行的程序必須包含一個(gè)代碼段,并指示程序執(zhí)行的起始點(diǎn),一個(gè)程序只有一個(gè)起始點(diǎn) 所有的可執(zhí)行性語(yǔ)句必須位于某一個(gè)代碼段內(nèi),說明性語(yǔ)句可根據(jù)需要位

16、于任一段內(nèi) 通常,程序還需要一個(gè)堆棧段,29/96,2.段定義偽操作,源程序分別用兩種格式書寫 第一種格式從MASM 5.0開始支持 簡(jiǎn)化段定義格式 第二種格式MASM 5.0以前就具有 完整段定義格式,Hello, Everybody !,30/96,;EXAMPLE5.42;程序注釋 ;數(shù)據(jù)段說明 2 DATA SEGMENT;數(shù)據(jù)段 3 DATA ENDS ;堆棧段說明 STACK SEGMENT PARA STACKSTACK;堆棧段 5 STACK ENDS ;代碼段說明 6 CODE SEGMENT;代碼段 7 START PROC FAR; 遠(yuǎn)過程調(diào)用定義 8ASSUME CSC

17、ODE,DSDATA,ESDATA,SSSTACK,完整段定義偽操作基本格式(1),31/96,9 PUSH DS ;保存返回地址 10 MOV AX , 0 11PUSH AX 12MOV AX , DATA ;初始化DS,ES 13MOV DS , AX 14MOV ES , AX ;自己編寫的程序 ; 15RET;返回DOS 16START ENDP ; 17 CODE ENDS;代碼段結(jié)束 ; 18 END START;匯編到此結(jié)束,32/96,;EXAMPLE5.42;程序注釋 ;數(shù)據(jù)段說明 2 DATA SEGMENT;數(shù)據(jù)段 3 DATA ENDS ;堆棧段說明 STACK SE

18、GMENT STACK ;堆棧段 5 STACK ENDS ;代碼段說明 6 CODE SEGMENT;代碼段 8ASSUME CSCODE,DSDATA,ESDATA,SSSTACK,完整段定義偽操作基本格式(2),33/96,12 START: MOV AX , DATA ;初始化DS,ES 13 MOV DS , AX 14 MOV ES , AX ;自己編寫的程序 ; 15 MOVAH,4CH;用DOS調(diào)用功能返回操作系統(tǒng) 16 INT21H ; 17 CODE ENDS ; 18 END START,34/96,;lt401b.asm(文件名) stacksegment stack;

19、定義堆棧段 dw 512 dup(?) ;堆棧段有512字(1024字節(jié))空間 stackends;堆棧段結(jié)束 datasegment;定義數(shù)據(jù)段 stringdb Hello, Everybody !,0dh,0ah,$ dataends codesegment code;定義代碼段 assume cs:code,ds:data,ss:stack start:mov ax,data;建立DS段地址 mov ds,ax,【例】完整段定義格式舉例,35/96,mov dx,offset string ;顯示字符串 mov ah,9 int 21h mov ax,4c00h int 21h;利用功

20、能調(diào)用返回DOS codeends;代碼段結(jié)束 end start ;匯編結(jié)束,同時(shí)指明程序起始點(diǎn),【例】完整段定義格式舉例(續(xù)),36/96,;SampleC.ASM .model small;存儲(chǔ)模型(各段在存儲(chǔ)器中的存放方式) .stack 100H;定義堆棧段 .data .;在數(shù)據(jù)段定義數(shù)據(jù) .code start:mov ax,data mov ds,ax .;在代碼段填入指令序列 mov ax,4c00h int 21h .;子程序代碼 end start,簡(jiǎn)化段定義格式( MASM 5.x支持),37/96,;lt401a.asm(文件名) .model small;定義程序的

21、存儲(chǔ)模式 .stack;定義堆棧段 .data;定義數(shù)據(jù)段 stringdb Hello, Everybody !,0dh,0ah,$ ;在數(shù)據(jù)段定義要顯示的字符串 .code;定義代碼段 start:mov ax,data ;程序起始點(diǎn),建立DS、SS mov ds,ax mov dx,offset string;指定字符串 mov ah,9 int 21h;利用功能調(diào)用顯示信息 mov ax,4c00h;程序結(jié)束點(diǎn),返回DOS int 21h end;匯編結(jié)束,【例】簡(jiǎn)化段定義格式舉例( MASM 5.x支持),38/96,;SampleA.ASM .model small .stack

22、.data .;在數(shù)據(jù)段定義數(shù)據(jù) .code .startup ;(定義程序初始入口點(diǎn)) .;在代碼段填入指令序列 .exit 0 ;(返回操作系統(tǒng)) . ;子程序代碼 end ;(源程序結(jié)束),簡(jiǎn)化段定義格式( MASM 6.x支持),注意: 簡(jiǎn)化段定義比完整段格式簡(jiǎn)單得多。但完整段定義可以全面地說明段的各種類型與屬性,因此在很多情況下仍需使用。,39/96,(1)程序開始偽指令 此指令指明程序模塊的開始,并定義模塊名。 指令格式: NAME 模塊名 或 TITLE 標(biāo)題名 程序中若缺省該偽指令,則取TITLE語(yǔ)句中的頁(yè)標(biāo)題前6個(gè)字符;若沒有TITLE語(yǔ)句,則取源程序文件名為模塊名。 (2)

23、源程序結(jié)束偽指令 此指令指明匯編語(yǔ)言程序模塊的結(jié)束。 指令格式: END 標(biāo)號(hào) 標(biāo)號(hào)指示程序的起始地址。多個(gè)程序模塊連接時(shí),只有主程序需要使用標(biāo)號(hào),其他子程序模塊則不必指定標(biāo)號(hào)。,3. 程序開始和結(jié)束偽指令,40/96,4.數(shù)據(jù)定義及存儲(chǔ)器分配偽指令,指令格式:變量名 助記符表達(dá)式; 注釋 功能:從變量名所代表的地址單元開始定義數(shù)據(jù)存儲(chǔ)區(qū),類型由數(shù)據(jù)定義偽指令確定,。 變量名DB表達(dá)式;定義字節(jié)變量。 變量名DW表達(dá)式;定義字變量。 變量名DD表達(dá)式;定義雙字變量。 變量名DQ表達(dá)式;定義四字變量。 變量名DT表達(dá)式;定義十字節(jié)變量。,41/96,表達(dá)式項(xiàng)是給變量或指定存儲(chǔ)單元賦予初值,它有以

24、下幾種形式: (1)數(shù)值表達(dá)式 (2) 字符串表達(dá)式:以單引號(hào)括起,存放為ASCII碼 (3 ) ? 表達(dá)式:保留存儲(chǔ)空間,但不存入數(shù)據(jù) (4)帶DUP的表達(dá)式:數(shù)組表達(dá)式,4.數(shù)據(jù)定義及存儲(chǔ)器分配偽指令表達(dá)式的形式,42/96,【例】操作數(shù)為常數(shù)或表達(dá)式,DATA_BYTE DB15,8,15H DATA_WORD DW 200,200H,-10 DATA_DW DD 4*30,0AFFDH,43/96,【例】操作數(shù)為字符串,STR1 DB Hello STR2 DB ABC STR3 DW AB,CD,注意:不能寫成 DB ABCD,44/96,【例】操作數(shù)為?,CNT1 DB 0,?,?

25、,0 CNT2 DW ?,100,?,注意:?為系統(tǒng)保留單元,一般系統(tǒng)填充為00H,45/96,【例】DUP的使用,DA1 DB 2 DUP (5,6) ; 從DA1地址單元開始存放二組“05H,06H”共4個(gè)地址單元 DA2 DW 40 DUP(?) ; 從DA2地址單元開始保留40個(gè)字共80個(gè)地址單元 DA3 DB 2 DUP(1,2 DUP(3),4) ;從DA3地址單元開始存放2組“01,03,03,04”,共占用8個(gè)地址單元。,46/96,datasegment;數(shù)據(jù)段 Xdb a,-5 db 2 dup(100),? Ydb ABC dataends,字節(jié)單元定義實(shí)例,應(yīng)用,47/

26、96,LEA AX , X ; AX0000H,在數(shù)據(jù)定義偽指令前面的變量的值,是該偽指令中的第一個(gè)數(shù)據(jù)項(xiàng)在當(dāng)前段內(nèi)的第一個(gè)字節(jié)的偏移地址。 MOV AL,X ;此處X表示它的第1個(gè)數(shù)據(jù),故ALa DEC X+1 ;對(duì)X為始的第2個(gè)數(shù)據(jù)減1,故成為-6 MOV Y,AL ;現(xiàn)在Y這個(gè)字符串成為 aBC,字節(jié)變量的應(yīng)用,48/96,5.表達(dá)式賦值偽操作,利用一個(gè)標(biāo)識(shí)符表達(dá)的一個(gè)數(shù)值。MASM提供等價(jià)機(jī)制,用于常量定義 等價(jià)EQU偽指令 符號(hào)名 EQU 數(shù)值表達(dá)式 符號(hào)名 EQU 等號(hào)=偽指令 符號(hào)名 = 數(shù)值表達(dá)式 常數(shù)若使用有意義的符號(hào)名來表示,可以提高程序的可讀性,同時(shí)更具有通用性,EQU和

27、=的區(qū)別: EQU偽操作中的標(biāo)號(hào)名是不允許重復(fù)定義的; “=” 偽操作是允許重復(fù)定義的。,49/96,表達(dá)式名 EQU 表達(dá)式 ALPHA EQU 9 BETA EQU ALPHA+18 BB EQU BP+8 “ = ” 偽操作 (允許重復(fù)定義) EMP = 7 EMP = EMP+1 , 表達(dá)式賦值偽操作:,50/96,符號(hào)定義 DosWriteChar equ 2 CarriageReturn = 13 CallDOS equ 符號(hào)應(yīng)用(左邊程序段等價(jià)右側(cè)的符號(hào)形式) mov ah,2;mov ah,DosWriteChar mov dl,13;mov dl,CarriageReturn

28、 int 21h;CallDOS,符號(hào)常數(shù)實(shí)例,51/96,6.地址計(jì)數(shù)器與對(duì)準(zhǔn)偽操作,定位偽指令控制數(shù)據(jù)的偏移地址 ORG 參數(shù) ;將當(dāng)前偏移地址指針指向參數(shù)表達(dá)的偏移地址: ORG 100h;從100h處安排數(shù)據(jù)或程序 ORG $+10 ;使偏移地址加10,即跳過10個(gè)字節(jié)空間 MASM中,符號(hào)“$”表示當(dāng)前偏移地址值 EVEN;從偶地址開始 ALIGN n;從n的整數(shù)倍地址開始,52/96,org $+10 arraydb 45,45h .code mov ax,seg array mov ds,ax mov bx,offset array ;等價(jià)于 lea bx,array mov c

29、l,array+4 ;等效于 mov cl,array4 mov ax,es:2000h,地址操作符實(shí)例,53/96,ARRAY DW 1, 2, + 4, 3, 4, + 4假設(shè)匯編時(shí)ARRAY 分配的偏移地址為0074H,則匯編后,+ 4所在的兩個(gè)字單元: (ARRAY+4)=0078+4=007CH(ARRAY+0A)=007E+4=0082H,地址操作符實(shí)例,54/96,1. 設(shè)X和X+2單元的內(nèi)容為雙精度數(shù)P,Y和Y+2單元的內(nèi)容為雙精度數(shù)Q,X、Y為低位字。下列程序段使2PQ時(shí)(AX)1,2P=Q時(shí)(AX)2。請(qǐng)將程序段填寫完整。MOV DX,X2MOV AX,XADD AX,XA

30、DC DX,X2CMP DX,Y2 L2 L1CMP AX,Y L2L1: MOV AX,1JMP EXITL2: MOV AX,2EXIT:,JL,JG,JLE,55/96,2. 假設(shè)程序中的數(shù)據(jù)定義如下, PARTNO DW ?PNAMEDB 16 DUP(?)COUNTDD ?PLENTH EQU $-PARTNO問PLENTH的值為多少?,56/96,3. 給出賦值語(yǔ)句如下:ALPHA EQU 100BETA EQU 25GAMMA EQU 2下列表達(dá)式的值是多少? (1) ALPHA * 100 + BETA(2) ALPHA MOD GAMMA + BETA(3) ( ALPHA+

31、2 ) * BETA - 2(4) ( BETA/3 ) MOD 5(5) ( ALPHA+3 ) * ( BETA MOD GAMMA ) (6) ALPHA GE GAMMA(7) BETA AND 7(8) GAMMA OR 3,57/96,4. 對(duì)于下面的數(shù)據(jù)定義,各條MOV指令單獨(dú)執(zhí)行后,有關(guān)寄存器的內(nèi)容是什么?FLDB DB ?TABLEA DW 20 DUP(?)TABLEB DB ABCD(1)MOV AX, TYPE FLDB (2)MOV AX, TYPE TABLEA(3)MOV CX, LENGTH TABLEA(4)MOV DX, SIZE TABLEA(5)MOV

32、CX, LENGTH TABLEB,58/96,本節(jié)小結(jié),本節(jié)重點(diǎn)掌握: 1)DB、DW、DD、DQ、DT功能 2)EQU、ORG、END、EVEN偽指令功能 3)段定義偽指令SEGMENT/ENDS 4)過程定義偽指令,作業(yè):P142 5,6,10,11,首頁(yè),59/96,四、 簡(jiǎn)單匯編語(yǔ)言程序設(shè)計(jì),一、順序程序設(shè)計(jì) 計(jì)算機(jī)執(zhí)行程序的方式是“從頭到尾”,逐條順序執(zhí)行指令語(yǔ)句,直到程序結(jié)束。,例5.1:把BUF開始的兩個(gè)字節(jié)單元中的壓縮BCD數(shù)相加,結(jié)果存入字單元RES中。 NAME EXAM1 DATA SEGMENT BUF DB 89H,34H RES DW? DATA ENDS COD

33、E SEGMENT ASSUMECS:CODE,DS:DATA START:MOVAX,DATA MOVDS,AX,LEABX,BUF MOVAL,BUF ;取加數(shù) ADDAL,BX+1 ;做二進(jìn)制加法 DAA ;調(diào)整為十進(jìn)制結(jié)果 LAHF ;(AH)(PSW低字節(jié)) ANDAH,01H;取CF位 MOVRES,AX;存結(jié)果 MOVAH,4CH INT21H CODE ENDS ENDSTART,60/96,1. 順序程序設(shè)計(jì),例:試編寫一程序計(jì)算以下表達(dá)式的值。 =(v-(*+-540)/x 式中x、v均為有符號(hào)字?jǐn)?shù)據(jù)。 設(shè)、的值存放在字變量、V中,結(jié)果存放在雙字變量之中,程序的流程圖如圖4

34、.1所示。,圖4.1 順序運(yùn)算程序流程圖,61/96,DATA SEGMENT ;數(shù)據(jù)段 XDW200 YDW100 ZDW3000 VDW10000 WDW2 DUP(?) DATA ENDS STACK SEGMENT STACK ;堆棧段 DB 200 DUP(0) STACKENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK,例:源程序(1):,62/96,START: MOVAX,DATA MOVDS,AX;DATAAX,指定數(shù)據(jù)段段名 MOVAX,X IMULY ;(X)*(Y)DX:AX MOVCX,AX MOVBX,DX ;(DX

35、:AX)(BX:CX) MOVAX,Z CWD ;(Z)符號(hào)擴(kuò)展,在(DX:AX) ADD CX,AX ADC BX,DX ;(BX:CX)+(DX:AX)(BX:CX) SUB CX,540 SBB BX,0 ;(BX:CX)-540(BX:CX) MOVAX,V,例:源程序(2):,63/96,CWD;(V)符號(hào)擴(kuò)展 SUB AX,CX SBB DX,BX ;(DX:AX)-(BX:CX)(DX:AX) IDIV X ;(DX:AX)/X MOV W,AX;商W MOVW+2,DX;余數(shù)DXW+2 MOVAH,4CH;返回DOS INT 21H CODE ENDS;ENDSTART,例:源

36、程序(3):,64/96,2. 分支程序設(shè)計(jì),在設(shè)計(jì)中經(jīng)會(huì)遇到判斷“相等”和“不相等”、“負(fù)”和“正”、 “滿足條件”和“不滿足條件”等等。 例5.3:將內(nèi)存中以STRI1為首址的50個(gè)字節(jié)單元中的數(shù)據(jù)傳送到以STRI2為首址的50個(gè)單元中。 分析:根據(jù)源數(shù)據(jù)塊與目的數(shù)據(jù)塊位置的不同,可分為兩種情況: 1)源數(shù)據(jù)塊的首址高于目的數(shù)據(jù)塊的首址,考慮到兩塊部分沒重疊,用增址方式傳送; 2)源數(shù)據(jù)塊的首址低于目的數(shù)據(jù)塊的首址,考慮到有可能兩塊部分重疊,用減址方式傳送。程序流程圖見4.2所示。,65/96,2. 分支程序設(shè)計(jì),66/96,2. 分支程序設(shè)計(jì)方式(1),NAME EXAM3;將內(nèi)存中以S

37、TRI1為首址數(shù)據(jù)傳送到以STRI2為首址的單元 DATA SEGMENT STRI DB200 DUP(?) STRI1 EQU STRI+30 STRI2 EQU STRI+70 COUNT EQU 50 DATA ENDS STACK SEGMENTPARA STACK STACK STAPN DB100 DUP(?) TOP EQULENGTH STAPN STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK START:MOVAX,DATA MOVDS,AX;數(shù)據(jù)段地址裝填 MOVES,AX;附加段地址裝填 M

38、OVSP,TOP;送堆棧指針 MOV CX,COUNT;送字節(jié)數(shù) MOV SI,OFFSET STRI1;送STRI1地址指針 MOV DI,OFFSET STRI2;送STRI2地址指針,CMP SI , DI ; 從首址開始? JA A2 ; 是,轉(zhuǎn)移 ADD SI , CX ; 否,以末地址開始搬家 ADD DI , CX DEC SI DEC DI A1: MOV AL , SI ; 從首址開始搬家 MOV DI ,AL DEC SI DEC DI DEC CX JNE A1 JMP A3 A2: MOV AL,SI MOV DI,AL INC SI INC DI DEC CX JNE

39、 A2 ;未完,繼續(xù) A3:MOV AH,4CH INT 21H;返回DOS CODE ENDS END START,67/96,2. 分支程序設(shè)計(jì)方式(2):串操作,NAME EXAM3;將內(nèi)存中以STRI1為首址數(shù)據(jù)傳送到以STRI2為首址的單元 DATA SEGMENT STRI DB 200 DUP(?) STRI1 EQU STRI+30 STRI2 EQU STRI+70 COUNT EQU 50 DATA ENDS STACK SEGMENTPARA STACK STACK STAPN DB100 DUP(?) TOP EQULENGTH STAPN STACK ENDS COD

40、E SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK START:MOVAX,DATA MOVDS,AX;數(shù)據(jù)段地址裝填 MOVES,AX;附加段地址裝填 MOVSP,TOP;送堆棧指針,MOV CX,COUNT;送串長(zhǎng) MOV SI,OFFSET STRI1;送STRI1地址指針 MOV DI,OFFSET STRI2;送STRI2地址指針 CLD ;正向 CMP SI,DI ;兩串首地址比較 JA RES ;(SI)(DI),轉(zhuǎn)移 ADD SI,COUNT-1;源塊尾址 ADD DI,COUNT-1;目的塊尾址 STD ;反向 RES:REP

41、MOVSB;數(shù)據(jù)塊傳送 MOV AH,4CH INT 21H;返回DOS CODE ENDS END START,68/96,3. 循環(huán)程序設(shè)計(jì),循環(huán)程序是強(qiáng)制計(jì)算機(jī)重復(fù)執(zhí)行某一指令系列的一種程序結(jié)構(gòu)形式。 1、循環(huán)程序的構(gòu)成 循環(huán)初始部分:為進(jìn)入循環(huán)做必要的準(zhǔn)備工作; 循環(huán)體:是程序中重復(fù)執(zhí)行的程序段 循環(huán)控制部分:為進(jìn)入下一次循環(huán),修改地址指針、計(jì)數(shù)器內(nèi)容等項(xiàng)參數(shù);檢測(cè)循環(huán)是否已執(zhí)行了規(guī)定的次數(shù),從而確定繼續(xù)循環(huán)還是結(jié)束循環(huán)。 循環(huán)結(jié)束部分:進(jìn)行循環(huán)之后的處理。,69/96,3. 循環(huán)程序設(shè)計(jì),2、控制循環(huán)次數(shù)的方法: 1)計(jì)數(shù)控制循環(huán):對(duì)于循環(huán)次數(shù)已知的程序,或是在進(jìn)入循環(huán)前可由某變量確

42、定循環(huán)次數(shù)的程序,通常用計(jì)數(shù)器來控制循環(huán)。 例5.4:把BUF開始的10個(gè)字節(jié)單元中的二進(jìn)制數(shù)據(jù)累加,求得的和放到RES字單元。,70/96,例:計(jì)數(shù)控制循環(huán),NAMEEXAM5 DATASEGMENT BUF DB 1,4,9,5,21,64,12,6,10,23 RESDW ? DATAENDS STACKSEGMENT PARA STACK STACK DB 100 DUP(?) STACKENDS CODESEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX,MOV AX,0;AL清0 MOV CX,0

43、AH;置計(jì)數(shù)器初值 MOV BX,OFFSET BUF;置地址指針 LP:ADD AL,BX;取一個(gè)數(shù)累加到AL上 ADC AH,0 INC BX;地址加1 LOOP LP;不為0,循環(huán) MOV RES,AX;傳送結(jié)果 MOV AH,4CH ;返回DOS INT 21H CODEENDS,71/96,例:條件控制循環(huán),2)用條件控制循環(huán):適用于某些循環(huán)次數(shù)未知的程序,或循環(huán)次數(shù)可變的程序,可以由問題給出的條件控制循環(huán)結(jié)束。 例5.5:編制程序 使S=1+2*3+3*4+4*5+N*(N+!),直到N*(N+!)項(xiàng)大于200為止。,72/96,例: 條件控制循環(huán),CMP AX,00C8H ;和數(shù)

44、大于200? JNA A1 ;不大于,繼續(xù) A2: INT 03H ;單步中斷 CODE ENDS END START,STACK SEGMENG STACK DW 64 DUP (?) STACK ENDS CODE SEGMENT ASSUME CS:CODE START: MOV DX, 0001H MOV BL, 02H A1: MOV AL,BL INC BL MUL BL;(AL)*(BL) ADD DX,AX;保存和數(shù),73/96,4. 子程序設(shè)計(jì),子程序是具有獨(dú)立功能的程序模塊,可供程序其它地方需要時(shí)調(diào)用。在匯編語(yǔ)言中,子程序又稱過程。 子程序的執(zhí)行過程: 保護(hù)現(xiàn)場(chǎng)(一些將在子

45、程序運(yùn)行時(shí)將要被破壞的寄存器的內(nèi)容)。 依入口參數(shù)從指定位置取要加工處理的信息。 加工處理。 依出口參數(shù)向指定位置送經(jīng)加工處理后的結(jié)果信息。 返回調(diào)用程序。,74/96,(1) 子程序(過程)的定義,指令格式: 過程名 PROC NEAR 或 FAR 過程名 ENDP 注意: 1)PROC和ENDP必須成對(duì)使用。 2)過程名是自定義符,可以作為標(biāo)號(hào)被指令CALL調(diào)用。 調(diào)用格式: CALL 過程名 3)過程由RET指令返回,返回調(diào)用程序的操作與過程的屬性有關(guān)。NEAR型過程屬于段內(nèi)調(diào)用,則RET是段內(nèi)返回;FAR型過程屬于段間調(diào)用,RET是段間返回。系統(tǒng)設(shè)定的缺省類型為NEAR。,75/96,

46、(2)子程序應(yīng)用舉例,例5.6 求無(wú)符號(hào)字節(jié)序列中的最大值和最小值。 設(shè)有一字節(jié)序列,其存儲(chǔ)首址為BUF,字節(jié)數(shù)為COUNT。利用子程序的方法編程求出該序列中的最大值和最小值。,76/96,例: 程序清單:,;出口:(AH)=大數(shù);(AL)=小數(shù) NAMESHIYAN4 DATASEGMENT BUF DB 1,4,9,5,21,64,12,6,10,23 COUNTEQU 10 DATAENDS STACK SEGMENT STACK DW 64 DUP (?) STACK ENDS CODE SEGMENT ASSUME CS:CODE;DS:DATA;SS:STACK START:MOV

47、 AX, DATA MOV DS, AX LEA SI,BUF MOV CX,COUNT CALL BRANCH ;調(diào)用判斷最大和最小值的子程序 INT 03H,BRANCH PROC NEAR JCXZ A4;(CX)=0則退出 PUSH SI;保護(hù)現(xiàn)場(chǎng) PUSH CX PUSH BX MOV BH,SI ;取源數(shù)據(jù)到BH中 MOV BL,BH ;存入BL中 A1:LODSB;取SI指向的單元中的數(shù)據(jù)到AL中 CMP AL,BH ;AL和BH中的數(shù)據(jù)比較 JBE A2 ;(AL)(BL),則轉(zhuǎn)移 MOV BL,AL;存小數(shù)到BL中 A3:LOOP A1;比較完否? MOV AX,BX ;大數(shù)

48、存AH中,小數(shù)存AL中 POP BX;恢復(fù)現(xiàn)場(chǎng) POP CX A4:RET BRANCH ENDP CODE ENDS END START,77/96,本節(jié)小結(jié),匯編語(yǔ)言程序結(jié)構(gòu)一般分為順序、分支、循環(huán)和子程序幾種。 分支程序一般根據(jù)有條件轉(zhuǎn)移指令進(jìn)行轉(zhuǎn)移判斷,根據(jù)條件可以形成二分支及多分支轉(zhuǎn)移。 循環(huán)程序要注意循環(huán)的條件的選擇,一般有計(jì)數(shù)器控制和條件控制兩種循環(huán)模式。串操作是循環(huán)的一種簡(jiǎn)便模式。 學(xué)習(xí)中要多參考例題,多模仿,多訓(xùn)練,首頁(yè),78/96,5. 宏指令,5.4.1 宏定義偽指令 匯編語(yǔ)言程序設(shè)計(jì)中,當(dāng)多處使用一組功能相同的程序段,而只是每次參與操作的參數(shù)不同時(shí),就可以用宏指令將這段

49、程序定義為一個(gè)宏名字。宏名可以當(dāng)作指令使用,匯編過程中,匯編程序?qū)⑺淼脑闯绦蛑噩F(xiàn)在宏名字處。 1. 宏定義 用于將程序中重復(fù)出現(xiàn)的一組語(yǔ)句定義為一條宏指令,并確定形式參數(shù)。指令格式如下: 宏指令名 MACRO 形式參數(shù)1, 形式參數(shù)2 , 宏體 ENDM,79/96,注意:宏指令名是用戶自定義符號(hào),它可以作為一條指令,直接用在匯編語(yǔ)言程序中。形式參數(shù)是可選項(xiàng),簡(jiǎn)稱形參或啞參數(shù)。宏體是一段可重復(fù)引用的指令序列。宏指令必須先定義后調(diào)用。宏定義可以嵌套。 例5.31用宏指令定義兩個(gè)字節(jié)數(shù)相加,結(jié)果存入RESULT單元的操作。 宏定義: ADDM MACRO OPR1,OPR2,RESULT ;形參是OPR1,OPR2,RESULT MOV AL , OPR1 ADD AL, OPR2 MOV RESULT,AL ENDM,(1) 宏定義,80/96,宏調(diào)用:在匯編語(yǔ)言程序中,使用宏指令稱為宏調(diào)用。 宏調(diào)用格式為: 宏指令名 實(shí)在參數(shù)1 , 實(shí)在參數(shù)2 , 宏展開:源程序匯編時(shí),在引用宏名

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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)論