第七講微型計(jì)算機(jī)匯編語(yǔ)言及匯編程序ppt課件_第1頁(yè)
第七講微型計(jì)算機(jī)匯編語(yǔ)言及匯編程序ppt課件_第2頁(yè)
第七講微型計(jì)算機(jī)匯編語(yǔ)言及匯編程序ppt課件_第3頁(yè)
第七講微型計(jì)算機(jī)匯編語(yǔ)言及匯編程序ppt課件_第4頁(yè)
第七講微型計(jì)算機(jī)匯編語(yǔ)言及匯編程序ppt課件_第5頁(yè)
已閱讀5頁(yè),還剩57頁(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、第七講第七講 微型計(jì)算機(jī)匯編語(yǔ)言微型計(jì)算機(jī)匯編語(yǔ)言及匯編程序及匯編程序曾鐵軍主要內(nèi)容主要內(nèi)容 宏匯編語(yǔ)言的基本語(yǔ)法宏匯編語(yǔ)言的基本語(yǔ)法1 偽指令偽指令2 宏指令宏指令3 系統(tǒng)功能調(diào)用系統(tǒng)功能調(diào)用4 匯編程序的功能及匯編過(guò)程匯編程序的功能及匯編過(guò)程5 匯編語(yǔ)言程序設(shè)計(jì)匯編語(yǔ)言程序設(shè)計(jì)6匯編語(yǔ)言程序設(shè)計(jì)與執(zhí)行過(guò)程匯編語(yǔ)言程序設(shè)計(jì)與執(zhí)行過(guò)程v輸入?yún)R編語(yǔ)言源程序輸入?yún)R編語(yǔ)言源程序 源文件源文件 .ASMv匯編編譯)匯編編譯) 目標(biāo)文件目標(biāo)文件 .OBJv鏈接鏈接 可執(zhí)行文件可執(zhí)行文件 .EXEv調(diào)試調(diào)試 最終程序最終程序匯編語(yǔ)言源程序的結(jié)構(gòu)匯編語(yǔ)言源程序的結(jié)構(gòu) 匯編語(yǔ)言源程序通常由一個(gè)或幾個(gè)程序匯編語(yǔ)

2、言源程序通常由一個(gè)或幾個(gè)程序模塊組成模塊組成, ,每個(gè)模塊一般由三個(gè)邏輯段組每個(gè)模塊一般由三個(gè)邏輯段組成:成: 數(shù)據(jù)段數(shù)據(jù)段存放數(shù)據(jù)、變量存放數(shù)據(jù)、變量 堆棧段堆棧段堆棧區(qū)域堆棧區(qū)域 代碼段代碼段存放程序指令存放程序指令v一個(gè)基本的匯編語(yǔ)言程序框架如下:一個(gè)基本的匯編語(yǔ)言程序框架如下:v stack SEGMENT PARA stackv DB 100 DUP(stack)v stack ENDSv data SEGMENTv v data ENDSv code SEGMENTv ASSUME CS:code, DS:data, ES:datav start: MOV AX, datav MO

3、V DS, AXv MOV ES, AXv v MOV AL, 4CHv INT 21Hv code ENDSv END start v匯編語(yǔ)言的語(yǔ)句有兩種:匯編語(yǔ)言的語(yǔ)句有兩種:v指令性語(yǔ)句指令性語(yǔ)句由由80868086指令助記符構(gòu)成的語(yǔ)句指令助記符構(gòu)成的語(yǔ)句v指示性語(yǔ)句指示性語(yǔ)句由偽指令構(gòu)成的語(yǔ)句由偽指令構(gòu)成的語(yǔ)句v指令性語(yǔ)句的格式為:指令性語(yǔ)句的格式為:v 標(biāo)號(hào)標(biāo)號(hào): : 指令助記符指令助記符 目的操作數(shù),源操作數(shù)目的操作數(shù),源操作數(shù) ; ;注釋注釋v 指示性語(yǔ)句的格式為:指示性語(yǔ)句的格式為:v 名字名字 偽指令偽指令 操作數(shù)操作數(shù)1,1,操作數(shù)操作數(shù)2,2,操作數(shù)操作數(shù)n n ; ;注

4、釋注釋v v注:各部分之間至少要用一個(gè)空格作為分隔符。注:各部分之間至少要用一個(gè)空格作為分隔符。指令性語(yǔ)句由指令性語(yǔ)句由CPUCPU執(zhí)行,每一條指令性語(yǔ)句都有一條機(jī)器執(zhí)行,每一條指令性語(yǔ)句都有一條機(jī)器碼指令與其對(duì)應(yīng);碼指令與其對(duì)應(yīng);指示性語(yǔ)句由匯編程序執(zhí)行。它指出匯編程序應(yīng)如何對(duì)指示性語(yǔ)句由匯編程序執(zhí)行。它指出匯編程序應(yīng)如何對(duì)源程序進(jìn)行匯編,如何定義變量、分配存儲(chǔ)單元以及指示源程序進(jìn)行匯編,如何定義變量、分配存儲(chǔ)單元以及指示程序開(kāi)始和結(jié)束等。指示性語(yǔ)句無(wú)機(jī)器碼指令與其相對(duì)應(yīng)程序開(kāi)始和結(jié)束等。指示性語(yǔ)句無(wú)機(jī)器碼指令與其相對(duì)應(yīng)。 指令性語(yǔ)句匯編時(shí)生成機(jī)器碼;指令性語(yǔ)句匯編時(shí)生成機(jī)器碼; 指示性語(yǔ)句

5、匯編時(shí)不生成機(jī)器碼。指示性語(yǔ)句匯編時(shí)不生成機(jī)器碼。語(yǔ)句的構(gòu)成元素:語(yǔ)句的構(gòu)成元素:標(biāo)號(hào)標(biāo)號(hào)指令的符號(hào)地址,用來(lái)代表指令在存儲(chǔ)器中指令的符號(hào)地址,用來(lái)代表指令在存儲(chǔ)器中的地址。只能出現(xiàn)在指令性語(yǔ)句中,標(biāo)號(hào)后應(yīng)加上的地址。只能出現(xiàn)在指令性語(yǔ)句中,標(biāo)號(hào)后應(yīng)加上冒號(hào)。冒號(hào)。名字名字段、過(guò)程、變量的名字,用來(lái)代表它們?cè)诖娑巍⑦^(guò)程、變量的名字,用來(lái)代表它們?cè)诖鎯?chǔ)器中的地址。只能出現(xiàn)在指示性語(yǔ)句中,名字后儲(chǔ)器中的地址。只能出現(xiàn)在指示性語(yǔ)句中,名字后不加冒號(hào)。不加冒號(hào)。指令助記符指令助記符80868086助記符、偽指令助記符、偽指令操作數(shù)操作數(shù)即指令的操作對(duì)象即指令的操作對(duì)象對(duì)指令性語(yǔ)句對(duì)指令性語(yǔ)句00,1

6、1,2 2個(gè)個(gè)對(duì)指示性語(yǔ)句對(duì)指示性語(yǔ)句根據(jù)需要而定根據(jù)需要而定操作數(shù)之間以逗號(hào)分隔操作數(shù)之間以逗號(hào)分隔操作數(shù)可以是:寄存器、存儲(chǔ)單元、常數(shù)或表達(dá)式操作數(shù)可以是:寄存器、存儲(chǔ)單元、常數(shù)或表達(dá)式 v注釋注釋以分號(hào)開(kāi)頭,可放在指令后,也可單獨(dú)以分號(hào)開(kāi)頭,可放在指令后,也可單獨(dú)一行。一行。v 注意注解的寫(xiě)法。要寫(xiě)指令段在程序中注意注解的寫(xiě)法。要寫(xiě)指令段在程序中的作用,而不要寫(xiě)指令的操作。的作用,而不要寫(xiě)指令的操作。v 例如:以下為同一條指令寫(xiě)的注釋例如:以下為同一條指令寫(xiě)的注釋v 1MOV CX,100 ;傳送傳送100到到CXv 2MOV CX,100 ;循環(huán)計(jì)數(shù)器置初值循環(huán)計(jì)數(shù)器置初值v 顯然,第

7、二種寫(xiě)法要比第一種寫(xiě)法要好。顯然,第二種寫(xiě)法要比第一種寫(xiě)法要好。 INT 21H INT 21H; ;退回退回DOSDOSprog ENDSprog ENDS END start END start1.1.常量常量二進(jìn)制數(shù)二進(jìn)制數(shù), ,以以B B結(jié)尾。如結(jié)尾。如01001101B01001101B。十進(jìn)制數(shù)十進(jìn)制數(shù), ,如如8585。十六進(jìn)制數(shù)十六進(jìn)制數(shù), ,以以H H結(jié)尾。第結(jié)尾。第1 1個(gè)數(shù)字為個(gè)數(shù)字為A-FA-F時(shí),時(shí),前面應(yīng)加前面應(yīng)加0 0,如,如0F160H0F160H。字符串:用引號(hào)括起來(lái)的字符串:用引號(hào)括起來(lái)的1 1個(gè)或多個(gè)字符。個(gè)或多個(gè)字符。如如ERROR!, a,ERROR!

8、, a,匯編時(shí)被翻譯成對(duì)應(yīng)匯編時(shí)被翻譯成對(duì)應(yīng)的的ASCIIASCII碼碼45H,52H,52H,4FH,52H,21H45H,52H,52H,4FH,52H,21H和和61H61H。(1) 指令語(yǔ)句中源操作數(shù)中作立即數(shù),它應(yīng)與目指令語(yǔ)句中源操作數(shù)中作立即數(shù),它應(yīng)與目的操作數(shù)的位數(shù)相一致,可以是的操作數(shù)的位數(shù)相一致,可以是8位或位或16位,例位,例如:如:MOVAX,0A5F1H(2) 在指令語(yǔ)句的基址加變址的尋址方式中作位在指令語(yǔ)句的基址加變址的尋址方式中作位移量,例如:移量,例如:MOVBX,SI+32H(3) 在數(shù)據(jù)定義偽指令中,例如:在數(shù)據(jù)定義偽指令中,例如:DB12H; 定義一個(gè)字節(jié)數(shù)

9、據(jù)定義一個(gè)字節(jié)數(shù)據(jù)DW1234H; 定義一個(gè)字?jǐn)?shù)據(jù)定義一個(gè)字?jǐn)?shù)據(jù)DD12345678H; 定義一個(gè)雙字?jǐn)?shù)據(jù)定義一個(gè)雙字?jǐn)?shù)據(jù)DBA B C D; 定義定義4個(gè)字節(jié)的字符串?dāng)?shù)據(jù)個(gè)字節(jié)的字符串?dāng)?shù)據(jù)有三個(gè)屬性:有三個(gè)屬性: 段地址:即標(biāo)號(hào)所在段的段地址;段地址:即標(biāo)號(hào)所在段的段地址; 偏移量:標(biāo)號(hào)所代表存儲(chǔ)單元的段內(nèi)偏移地址偏移量:標(biāo)號(hào)所代表存儲(chǔ)單元的段內(nèi)偏移地址; 類類 型:型:NEARNEAR或或FARFAR: NEAR NEAR表示標(biāo)號(hào)所在語(yǔ)句與轉(zhuǎn)移指令表示標(biāo)號(hào)所在語(yǔ)句與轉(zhuǎn)移指令/ / 調(diào)用指令在同一碼段內(nèi)調(diào)用指令在同一碼段內(nèi), ,跳轉(zhuǎn)跳轉(zhuǎn)時(shí)時(shí) 只需改變只需改變IPIP即可。即可。 FAR FA

10、R標(biāo)號(hào)所在語(yǔ)句與轉(zhuǎn)移指令標(biāo)號(hào)所在語(yǔ)句與轉(zhuǎn)移指令/ /調(diào)調(diào)用用 指令不在同一代碼段內(nèi)。指令不在同一代碼段內(nèi)。 若沒(méi)有對(duì)類型進(jìn)行說(shuō)明若沒(méi)有對(duì)類型進(jìn)行說(shuō)明, ,默認(rèn)為默認(rèn)為NEARNEAR。標(biāo)號(hào)通常作為轉(zhuǎn)移指令或標(biāo)號(hào)通常作為轉(zhuǎn)移指令或CALLCALL指令的轉(zhuǎn)移地址。指令的轉(zhuǎn)移地址。2.2.標(biāo)號(hào)標(biāo)號(hào) 變量變量即內(nèi)存中的存儲(chǔ)單元或數(shù)據(jù)區(qū)。即內(nèi)存中的存儲(chǔ)單元或數(shù)據(jù)區(qū)。 變量名變量名是存儲(chǔ)單元是存儲(chǔ)單元( (數(shù)據(jù)區(qū)數(shù)據(jù)區(qū)) )的符號(hào)地的符號(hào)地 址或名字。址或名字。變量也有三個(gè)屬性變量也有三個(gè)屬性: :段地址段地址變量所在段的段地址變量所在段的段地址偏移量偏移量變量單元地址與段首地址之間的位移量。變量單元地址

11、與段首地址之間的位移量。類類 型型有有BYTEBYTE、WORDWORD和和DWORDDWORD三種。三種。變量在程序中作為存儲(chǔ)器操作數(shù)被引用。變量在程序中作為存儲(chǔ)器操作數(shù)被引用。3.3.變量變量v標(biāo)號(hào)和變量名的使用規(guī)則標(biāo)號(hào)和變量名的使用規(guī)則v組成:組成:A-Z(不分大小寫(xiě)不分大小寫(xiě)), 0-9, ? . _ $v不能以數(shù)字開(kāi)頭,句號(hào)不能以數(shù)字開(kāi)頭,句號(hào)(.)只能作為首字符只能作為首字符v長(zhǎng)度小于長(zhǎng)度小于31個(gè)字符個(gè)字符v不能與保留字不能與保留字(指令助記符、偽指令、預(yù)定義符號(hào)指令助記符、偽指令、預(yù)定義符號(hào)等等)重名重名v不能重復(fù)定義不能重復(fù)定義v例如:例如:v 正確的:正確的:LP1, AG

12、AIN, NEXT, _GO, OK_1v 錯(cuò)誤的:錯(cuò)誤的:4M, LOOP, AAA, #HELP, +ONEVAR_DATA SEGMENTDATA1DB 12HDATA2DB ?DATA3DW5678HSTRING1 DB ABCDD_B1 DB DUP(4)VAR_DATA ENDSMOV AL, DATA1MOV AX, DATA3表達(dá)式是常數(shù)、寄存器、標(biāo)號(hào)、變量與運(yùn)算符的表達(dá)式是常數(shù)、寄存器、標(biāo)號(hào)、變量與運(yùn)算符的組合。組合。有數(shù)字表達(dá)式和地址表達(dá)式兩種。有數(shù)字表達(dá)式和地址表達(dá)式兩種。匯編時(shí)按優(yōu)先規(guī)則對(duì)表達(dá)式進(jìn)行計(jì)算,計(jì)算出具匯編時(shí)按優(yōu)先規(guī)則對(duì)表達(dá)式進(jìn)行計(jì)算,計(jì)算出具體的數(shù)值或地址。

13、運(yùn)行時(shí)不能改變。體的數(shù)值或地址。運(yùn)行時(shí)不能改變。表達(dá)式中的運(yùn)算符有表達(dá)式中的運(yùn)算符有6 6類:算術(shù)、邏輯、關(guān)系、類:算術(shù)、邏輯、關(guān)系、取地址、屬性、雜類。取地址、屬性、雜類。用于數(shù)字表達(dá)式用于數(shù)字表達(dá)式, ,例:例: MOV AX,4 MOV AX,4* *10241024匯編后的形式為匯編后的形式為: : MOV AX,4096 MOV AX,4096 用于地址表達(dá)式用于地址表達(dá)式, ,例例: : LEA SI,TAB+3 LEA SI,TAB+3若若TABTAB的偏移地址為的偏移地址為1000H1000H,則匯編后的形式為:,則匯編后的形式為: LEA SI,1003H LEA SI,10

14、03H 1)1)算術(shù)運(yùn)算符算術(shù)運(yùn)算符 + +、- -、* *、/ /,MODMOD邏輯運(yùn)算符只能用于數(shù)字表達(dá)式中。邏輯運(yùn)算符只能用于數(shù)字表達(dá)式中。 例:例:MOVMOV CL,36H AND 0FHCL,36H AND 0FH 經(jīng)匯編后:經(jīng)匯編后:MOV CL,06HMOV CL,06H留意,不要把邏輯運(yùn)算符與邏輯運(yùn)算指令混淆:留意,不要把邏輯運(yùn)算符與邏輯運(yùn)算指令混淆: 例:例:AND AX, 3FC0H AND 0FF00HAND AX, 3FC0H AND 0FF00H 匯編后源操作數(shù)被翻譯為:匯編后源操作數(shù)被翻譯為:3F00H3F00H,所以上述指,所以上述指令與令與AND AX, 3F

15、00HAND AX, 3F00H等價(jià)。等價(jià)。2)2)邏輯運(yùn)算符邏輯運(yùn)算符 AND AND、OROR、XORXOR、NOTNOT關(guān)系運(yùn)算的結(jié)果是一個(gè)邏輯值:真或假關(guān)系運(yùn)算的結(jié)果是一個(gè)邏輯值:真或假 關(guān)系為真關(guān)系為真, ,結(jié)果為全結(jié)果為全1 1 關(guān)系為假關(guān)系為假, ,結(jié)果為全結(jié)果為全0 0例:例:MOV BX,PORT GT 300HMOV BX,PORT GT 300H 若若PORTPORT的值大于的值大于300H,300H,則匯編后為:則匯編后為: MOV BX,0FFFFH MOV BX,0FFFFH 否則匯編后為:否則匯編后為: MOV BX,0 MOV BX,03)3)關(guān)系運(yùn)算符關(guān)系運(yùn)算

16、符EQEQ、NENE、LTLT、GTGT、LELE、GEGE4)取地址運(yùn)算符取地址運(yùn)算符-SEGOFFSETSEG:取變量:取變量/標(biāo)號(hào)的段地址標(biāo)號(hào)的段地址OFFSET:取變量:取變量/標(biāo)號(hào)的偏移地址標(biāo)號(hào)的偏移地址例:例:VAR DB 12H MOV BX,OFFSET VAR ;取變量;取變量VAR的的偏移地址偏移地址 MOV AX,SEG VAR ;取變量;取變量VAR的的段地址段地址留意,以下指令的異同:留意,以下指令的異同: MOV BX, OFFSET VAR LEA BX, VAROFFSET只能取靜態(tài)的偏移地址;只能取靜態(tài)的偏移地址;LEA指令即可取靜態(tài)的偏移地址,也可取動(dòng)態(tài)的偏

17、移地指令即可取靜態(tài)的偏移地址,也可取動(dòng)態(tài)的偏移地址。址。 vTYPE 取變量的類型取變量的類型1,2,4)vLENGTH 取所定義變量的長(zhǎng)度取所定義變量的長(zhǎng)度v (即變量中元素的個(gè)數(shù))(即變量中元素的個(gè)數(shù))vSIZE 取所定義存儲(chǔ)區(qū)的字節(jié)數(shù)取所定義存儲(chǔ)區(qū)的字節(jié)數(shù)v (=TYPE*LENGTH)v例:例:VAR DW 1,2,3,4,5 v 那么那么 TYPE VAR = 2v LENGTH VAR = 5v SIZE VAR = 105)5)取值運(yùn)算符取值運(yùn)算符TYPETYPE、LENGTHLENGTH、SIZESIZE6)6)屬性運(yùn)算符屬性運(yùn)算符PTRPTR用來(lái)指定地址操作數(shù)的類型。用來(lái)指定

18、地址操作數(shù)的類型。格式:格式: PTR PTR 類型類型BYTE, WORD, DWORD, BYTE, WORD, DWORD, NEAR, FARNEAR, FARBYTEBYTE、WORDWORD、DWORDDWORD 用于描述數(shù)據(jù)存儲(chǔ)單元用于描述數(shù)據(jù)存儲(chǔ)單元( (變量變量) )地址地址NEARNEAR、FARFAR 用于描述轉(zhuǎn)移、調(diào)用的目的地址用于描述轉(zhuǎn)移、調(diào)用的目的地址例:例:MOVMOVBYTE PTRDI,0 ;BYTE PTRDI,0 ;字節(jié)類型字節(jié)類型 MOV MOVWORD PTRDI,0 ;WORD PTRDI,0 ;字類型字類型 MOV MOVDI,0B5H ;DI,0

19、B5H ;類型不定類型不定PTRPTR也可用來(lái)進(jìn)行強(qiáng)制類型轉(zhuǎn)換也可用來(lái)進(jìn)行強(qiáng)制類型轉(zhuǎn)換例:例:STR1 DW STR1 DW ? ;STR1 ;STR1定義為字類型定義為字類型 MOV MOVAX,STR1 ;AX,STR1 ;合法合法 MOV MOVAL,STR1 ;AL,STR1 ;非法非法 MOV AL,BYTE PTR STR1 ; MOV AL,BYTE PTR STR1 ;合法合法vLOW 取低字節(jié)取低字節(jié)vHIGH 取高字節(jié)取高字節(jié)v例:設(shè)例:設(shè)SSY = 2050H vMOV AL , LOW 3080H; AL=80HvMOV AH, HIGH SSY; AH=20HvMOV

20、 CL, LOW 3A4BH; CL=4BH7)7)分離運(yùn)算符分離運(yùn)算符LOWLOW、HIGHHIGH8) 8) 運(yùn)算優(yōu)先級(jí)見(jiàn)運(yùn)算優(yōu)先級(jí)見(jiàn)P160P160表表7-27-27.2 偽指令偽指令v數(shù)據(jù)定義偽指令數(shù)據(jù)定義偽指令v符號(hào)定義偽指令符號(hào)定義偽指令v段定義和段寄存器指定偽指令段定義和段寄存器指定偽指令v過(guò)程定義偽指令過(guò)程定義偽指令v結(jié)束偽指令結(jié)束偽指令 由匯編程序執(zhí)行的指令,它本身不被匯編由匯編程序執(zhí)行的指令,它本身不被匯編成機(jī)器指令。常用的偽指令有:成機(jī)器指令。常用的偽指令有:1 1) 數(shù)據(jù)定義偽指令數(shù)據(jù)定義偽指令 用于定義變量,即內(nèi)存單元或數(shù)據(jù)區(qū)。數(shù)據(jù)定義用于定義變量,即內(nèi)存單元或數(shù)據(jù)區(qū)

21、。數(shù)據(jù)定義偽指令的格式為:偽指令的格式為:變量名變量名 數(shù)據(jù)定義偽指令數(shù)據(jù)定義偽指令 操作數(shù),操作數(shù),操作數(shù),操作數(shù),常用的數(shù)據(jù)定義偽指令有如下幾種:常用的數(shù)據(jù)定義偽指令有如下幾種: DB DB 定義字節(jié)定義字節(jié) DW DW 定義字定義字 DD DD 定義雙字定義雙字操作數(shù)可以是常數(shù)、變量或表達(dá)式操作數(shù)可以是常數(shù)、變量或表達(dá)式例例1 1:DATA_B DB 10,5,10HDATA_B DB 10,5,10HDATA_W DW 100H,-4DATA_W DW 100H,-4DATA_D DD 0FFFBHDATA_D DD 0FFFBH匯編后的內(nèi)存分配情況匯編后的內(nèi)存分配情況如右圖所示。如右

22、圖所示。例例2 2:操作數(shù)可以是字符串,例如:操作數(shù)可以是字符串,例如STR DBSTR DBHELLOHELLO匯編后的情況如圖:匯編后的情況如圖:操作數(shù)操作數(shù)? ?用來(lái)保留存儲(chǔ)空間用來(lái)保留存儲(chǔ)空間, ,但不存入數(shù)據(jù)但不存入數(shù)據(jù). .例例3 3:ABC DB 0,1,2,3,4,OK,$ABC DB 0,1,2,3,4,OK,$ RSV DW ?,?,?,?,?,?,?,? RSV DW ?,?,?,?,?,?,?,?復(fù)制操作符復(fù)制操作符DUP:DUP:重復(fù)的數(shù)據(jù)可以使用復(fù)制操作符重復(fù)的數(shù)據(jù)可以使用復(fù)制操作符DUP,DUP,如上面如上面RSVRSV亦亦可寫(xiě)成可寫(xiě)成: : RSV DW 8 D

23、UP(?) RSV DW 8 DUP(?)若操作數(shù)中若使用若操作數(shù)中若使用$,$,則表示的是地址計(jì)數(shù)器的當(dāng)則表示的是地址計(jì)數(shù)器的當(dāng)前值。前值。v例:例: TABLE DB 10 DUP(?) TABLE DB 10 DUP(?)v BUFFER DW TABLE,$+3 BUFFER DW TABLE,$+3v設(shè)設(shè)TABLETABLE的偏移地址為的偏移地址為0080H,0080H,則匯編后如下圖所則匯編后如下圖所示:示:2 2符號(hào)定義偽指令符號(hào)定義偽指令 把一個(gè)表達(dá)式用一個(gè)符號(hào)表示,以后凡出現(xiàn)該表把一個(gè)表達(dá)式用一個(gè)符號(hào)表示,以后凡出現(xiàn)該表達(dá)式的地方都可用這個(gè)符號(hào)表示。類似于達(dá)式的地方都可用這個(gè)

24、符號(hào)表示。類似于C C語(yǔ)言中語(yǔ)言中的的#define#define。符號(hào)定義偽指令有兩種:符號(hào)定義偽指令有兩種:EQUEQU,= =用用EQUEQU定義的符號(hào)未清除前定義的符號(hào)未清除前, ,不能重新定不能重新定義。清除義。清除EQUEQU定義可用定義可用PURGEPURGE偽指令。偽指令。用用”=”=”定義的符號(hào)可在任何時(shí)候進(jìn)行重定義的符號(hào)可在任何時(shí)候進(jìn)行重定義。定義。二者均不占用存儲(chǔ)空間二者均不占用存儲(chǔ)空間, ,僅是給符號(hào)賦值僅是給符號(hào)賦值 例:例:FIVE EQU 5FIVE EQU 5 COUNT EQU CX COUNT EQU CX TEN EQU 10 TEN EQU 10 DIS

25、T = BYTE PTRSI+BP DIST = BYTE PTRSI+BP GOTO = JMP GOTO = JMP MOV AX, TEN MOV AX, TEN MOV CX, COUNT MOV CX, COUNT ADD DIST, FIVE ADD DIST, FIVE DIST = WORD PTRSI+BP+1 DIST = WORD PTRSI+BP+1 ADD DIST, AX ADD DIST, AX GOTO LABEL GOTO LABEL 3 3段定義偽指令段定義偽指令 匯編語(yǔ)言程序是按段來(lái)組織程序和數(shù)據(jù)的。匯編語(yǔ)言程序是按段來(lái)組織程序和數(shù)據(jù)的。 和存儲(chǔ)器的物理段

26、相對(duì)應(yīng),匯編語(yǔ)言程序中的段和存儲(chǔ)器的物理段相對(duì)應(yīng),匯編語(yǔ)言程序中的段稱為邏輯段。匯編連接后被映射到物理段中。稱為邏輯段。匯編連接后被映射到物理段中。 三類段:代碼三類段:代碼( (程序程序) )、數(shù)據(jù)、堆棧、數(shù)據(jù)、堆棧 段定義偽指令:段定義偽指令:SEGMENTSEGMENT、ENDSENDS、ASSUMEASSUME、ORGORG 定義一個(gè)段的基本格式:定義一個(gè)段的基本格式: 段名段名 SEGMENT SEGMENT 定位類型定位類型組合方式組合方式類別類別 段名段名 ENDS ENDS 這兩個(gè)偽指令總是成對(duì)出現(xiàn),二者前面的段名這兩個(gè)偽指令總是成對(duì)出現(xiàn),二者前面的段名應(yīng)一致。應(yīng)一致。SEGM

27、ENTSEGMENT說(shuō)明了一個(gè)段的開(kāi)始,說(shuō)明了一個(gè)段的開(kāi)始,ENDSENDS說(shuō)說(shuō)明了一個(gè)段的結(jié)束。明了一個(gè)段的結(jié)束。 對(duì)數(shù)據(jù)段和堆棧段,段中的語(yǔ)句一般是變量定對(duì)數(shù)據(jù)段和堆棧段,段中的語(yǔ)句一般是變量定義。對(duì)代碼段則是指令語(yǔ)句。義。對(duì)代碼段則是指令語(yǔ)句。 如:如: data SEGMENT data SEGMENT data ENDS data ENDS SEGMENT和和ENDS偽指令偽指令A(yù)SSUME偽指令偽指令在代碼段中,還必須明確段和段寄存器的關(guān)系,在代碼段中,還必須明確段和段寄存器的關(guān)系,這由這由ASSUMEASSUME語(yǔ)句來(lái)指定。如語(yǔ)句來(lái)指定。如 ASSUME CS:code, DS:

28、data, ES:data ASSUME CS:code, DS:data, ES:data 語(yǔ)句中的語(yǔ)句中的codecode和和datadata為段名。為段名。 這個(gè)語(yǔ)句說(shuō)明:這個(gè)語(yǔ)句說(shuō)明: 1. CS 1. CS將指向名字為將指向名字為codecode的代碼段的代碼段 2. DS 2. DS和和ESES將指向名字為將指向名字為datadata的數(shù)據(jù)段的數(shù)據(jù)段但要注意但要注意,ASSUME,ASSUME偽指令只是告知匯編程序有關(guān)偽指令只是告知匯編程序有關(guān)段寄存器與段的關(guān)系段寄存器與段的關(guān)系, ,并沒(méi)有給段寄存器賦予實(shí)并沒(méi)有給段寄存器賦予實(shí)際的初值。故下面的語(yǔ)句際的初值。故下面的語(yǔ)句 MOV

29、MOVAX,DATAAX,DATA MOV MOVDS,AXDS,AX MOV MOVES,AXES,AX將段基址裝入段寄存器。如果程序中用到堆棧段將段基址裝入段寄存器。如果程序中用到堆棧段,則,則SSSS也需裝入實(shí)際的初值。也需裝入實(shí)際的初值。代碼段基地址不需要程序員裝入代碼段基地址不需要程序員裝入CSCS寄存器,而由寄存器,而由OSOS負(fù)責(zé)裝入。負(fù)責(zé)裝入。SEGMENT語(yǔ)句后可以帶有可選參數(shù),用以規(guī)定語(yǔ)句后可以帶有可選參數(shù),用以規(guī)定邏輯段的其他一些屬性。邏輯段的其他一些屬性。1) 定位類型定位類型說(shuō)明如何確定邏輯段的邊界。有四種:說(shuō)明如何確定邏輯段的邊界。有四種:PARA(Paragrap

30、h): 邏輯段從一個(gè)節(jié)邏輯段從一個(gè)節(jié) (16個(gè)字節(jié)個(gè)字節(jié)) 的邊界開(kāi)始。即段的起始的邊界開(kāi)始。即段的起始地址應(yīng)能被地址應(yīng)能被16整除整除, 或這說(shuō)段起始物理或這說(shuō)段起始物理地址應(yīng)為地址應(yīng)為0H。默認(rèn)類型默認(rèn)類型BYTE : 邏輯段從字節(jié)邊界開(kāi)始,即段可邏輯段從字節(jié)邊界開(kāi)始,即段可以從任何地址開(kāi)始。以從任何地址開(kāi)始。WORD : 邏輯段從字邊界開(kāi)始。即段的邏輯段從字邊界開(kāi)始。即段的起始地址必須是偶數(shù)。起始地址必須是偶數(shù)。PAGE : 邏輯段從頁(yè)邊界開(kāi)始。邏輯段從頁(yè)邊界開(kāi)始。256字節(jié)字節(jié)稱為一頁(yè),故段的起始物理地址應(yīng)為稱為一頁(yè),故段的起始物理地址應(yīng)為00H。 2) 組合類型組合類型說(shuō)明不同模塊中

31、同名段的組合方式。說(shuō)明不同模塊中同名段的組合方式。PUBLIC: 所有此類型的同名段組合成一個(gè)邏輯段,公用一個(gè)段地址,運(yùn)行時(shí)裝入同一個(gè)物理段中。所有此類型的同名段組合成一個(gè)邏輯段,公用一個(gè)段地址,運(yùn)行時(shí)裝入同一個(gè)物理段中。COMMON : 所有此類型的同名段具有相同的起始地址所有此類型的同名段具有相同的起始地址(覆蓋覆蓋),共享相同的存儲(chǔ)區(qū)域。,共享相同的存儲(chǔ)區(qū)域。AT : 按絕對(duì)地址定位,段地址就是表達(dá)式的值。按絕對(duì)地址定位,段地址就是表達(dá)式的值。STACK : 專用于說(shuō)明堆棧段,組合方式同專用于說(shuō)明堆棧段,組合方式同PUBLIC3) 類別類別用單引號(hào)括起來(lái)的字符串。所有同類別的段被安用單引

32、號(hào)括起來(lái)的字符串。所有同類別的段被安排在連續(xù)的存儲(chǔ)區(qū)域中。排在連續(xù)的存儲(chǔ)區(qū)域中。如:在模塊如:在模塊1中有段定義:中有段定義: seg1 SEGMENT PARA STACK stack seg1 ENDS 在模塊在模塊2中有段定義:中有段定義: seg2 SEGMENT PARA STACK stack seg2 ENDS則連接時(shí)這兩個(gè)段被安排在一起。則連接時(shí)這兩個(gè)段被安排在一起。ORG規(guī)定了段內(nèi)的指令或數(shù)據(jù)存放的開(kāi)始地址規(guī)定了段內(nèi)的指令或數(shù)據(jù)存放的開(kāi)始地址(偏移地址的初值偏移地址的初值),其格式為:,其格式為: ORG 表達(dá)式的值即為開(kāi)始地址,從此地址起連續(xù)存放表達(dá)式的值即為開(kāi)始地址,從此

33、地址起連續(xù)存放程序或數(shù)據(jù)。程序或數(shù)據(jù)。例:例: ABC SEGMENT ORG 100H begin: ABC ENDS 4ORG偽指令偽指令指令從100H開(kāi)始存放5 5過(guò)程定義偽指令過(guò)程定義偽指令PROCPROC、ENDPENDP 過(guò)程就是子程序。一個(gè)過(guò)程可以被其它程序所調(diào)過(guò)程就是子程序。一個(gè)過(guò)程可以被其它程序所調(diào)用用( (用用CALLCALL指令指令) ),過(guò)程的最后一條指令一般是返回,過(guò)程的最后一條指令一般是返回指令指令(RET)(RET)。 過(guò)程定義偽指令的格式為過(guò)程定義偽指令的格式為 PROC PROC 類型類型 RET RET ENDP ENDP 留意:留意:PROCPROC和和E

34、NDPENDP必須成對(duì)出現(xiàn)。必須成對(duì)出現(xiàn)。 過(guò)程的類型有兩種:過(guò)程的類型有兩種: NEAR( NEAR(默認(rèn)類型默認(rèn)類型) )表示段內(nèi)調(diào)用表示段內(nèi)調(diào)用 FAR FAR表示段間調(diào)用表示段間調(diào)用 調(diào)用一個(gè)過(guò)程的格式為:調(diào)用一個(gè)過(guò)程的格式為:CALL CALL 6)6)模塊開(kāi)始偽指令模塊開(kāi)始偽指令 格式:格式:NAME NAME 模塊名模塊名 該偽指令指明程序模塊的開(kāi)始,并指出模塊名。該偽指令指明程序模塊的開(kāi)始,并指出模塊名。7)7)模塊結(jié)束偽指令模塊結(jié)束偽指令 格式:格式:END END 啟動(dòng)標(biāo)號(hào)或過(guò)程名啟動(dòng)標(biāo)號(hào)或過(guò)程名 該偽指令告訴匯編程序源文件結(jié)束,并給出執(zhí)行程序的入該偽指令告訴匯編程序源文件

35、結(jié)束,并給出執(zhí)行程序的入口地址??诘刂?。ENDEND后跟的表達(dá)式通常就是程序第一條指令的標(biāo)號(hào),后跟的表達(dá)式通常就是程序第一條指令的標(biāo)號(hào),指示程序的啟動(dòng)地址指示程序的啟動(dòng)地址( (要執(zhí)行的第一條指令的地址要執(zhí)行的第一條指令的地址) )。 在主模塊中,啟動(dòng)標(biāo)號(hào)或者過(guò)程名才有意義。分模塊中,在主模塊中,啟動(dòng)標(biāo)號(hào)或者過(guò)程名才有意義。分模塊中,模塊結(jié)束偽指令只寫(xiě)模塊結(jié)束偽指令只寫(xiě)ENDEND。7.3 宏指令宏指令宏代換語(yǔ)句宏代換語(yǔ)句 如果需要多次使用同一個(gè)程序段,可以將這個(gè)程序段定如果需要多次使用同一個(gè)程序段,可以將這個(gè)程序段定義為一個(gè)宏指令義為一個(gè)宏指令”,然后在需要時(shí),可簡(jiǎn)單地用宏指令名來(lái),然后在需

36、要時(shí),可簡(jiǎn)單地用宏指令名來(lái)代替這個(gè)程序段。代替這個(gè)程序段。格式:格式: MACRO MACRO 形參形參1 1,形參,形參2 2, ENDM ENDM宏指令使用的步驟:宏指令使用的步驟:(1)宏定義:對(duì)各個(gè)宏指令進(jìn)行定義,并分別起名字宏定義:對(duì)各個(gè)宏指令進(jìn)行定義,并分別起名字(2)宏調(diào)用:在需要使用宏指令的地方,通過(guò)宏指令名來(lái)調(diào)用宏調(diào)用:在需要使用宏指令的地方,通過(guò)宏指令名來(lái)調(diào)用(3)宏擴(kuò)展:由宏匯編程序用宏定義中的指令來(lái)代替宏調(diào)用中宏擴(kuò)展:由宏匯編程序用宏定義中的指令來(lái)代替宏調(diào)用中的宏指令名。的宏指令名。例例: :兩個(gè)數(shù)之和的宏定義和宏調(diào)用。兩個(gè)數(shù)之和的宏定義和宏調(diào)用。 宏定義為:宏定義為:

37、DADD MACRO XDADD MACRO X,Y Y,Z Z MOV AX MOV AX,X X ADD AX ADD AX,Y Y MOV Z MOV Z,AXAX ENDM ENDMX X、Y Y、Z Z是形式參數(shù)。調(diào)用宏是形式參數(shù)。調(diào)用宏DADDDADD時(shí)可寫(xiě)為:時(shí)可寫(xiě)為: DADD DATA1 DADD DATA1,DATA2DATA2,SUMSUMDATA1DATA1,DATA2DATA2,SUMSUM是實(shí)際參數(shù),由它們替換定義中的是實(shí)際參數(shù),由它們替換定義中的X X、Y Y、Z Z。例:宏定義為:例:宏定義為: DISPLAY MACRO STRING LEA DX,STRIN

38、G MOV AH,9 INT 21H ENDM 程序中宏調(diào)用:程序中宏調(diào)用: DISPLAY ERROR_MESSAGE DISPLAY EXIT_MESSAGE 匯編后的結(jié)果:匯編后的結(jié)果:(帶有帶有+號(hào)的指令為宏展開(kāi)后的結(jié)果號(hào)的指令為宏展開(kāi)后的結(jié)果) + LEA DX,ERROR_MESSAGE + MOV AH,9 + INT 21H + LEA DX,EXIT_MESSAGE + MOV AH,9 + INT 21H 當(dāng)需要多次執(zhí)行的同一個(gè)程序段比較長(zhǎng),對(duì)速度的當(dāng)需要多次執(zhí)行的同一個(gè)程序段比較長(zhǎng),對(duì)速度的要求不很高,并且不要求修改參數(shù)的條件下,可以采要求不很高,并且不要求修改參數(shù)的條件

39、下,可以采用過(guò)程調(diào)用方式;用過(guò)程調(diào)用方式; 程序段比較短,希望每次調(diào)用中可以修改參數(shù)的條程序段比較短,希望每次調(diào)用中可以修改參數(shù)的條件下,可以采用宏調(diào)用方式;件下,可以采用宏調(diào)用方式;7.4 系統(tǒng)功能調(diào)用系統(tǒng)功能調(diào)用系統(tǒng)功能調(diào)用:由系統(tǒng)功能調(diào)用:由OSOS提供的一組實(shí)現(xiàn)特殊功能的子程提供的一組實(shí)現(xiàn)特殊功能的子程序供程序員在程序中調(diào)用,以減輕編程工作量。序供程序員在程序中調(diào)用,以減輕編程工作量。用戶程序在調(diào)用這些系統(tǒng)服務(wù)程序時(shí),不是用用戶程序在調(diào)用這些系統(tǒng)服務(wù)程序時(shí),不是用CALLCALL命命令,而是采用軟中斷指令令,而是采用軟中斷指令 INT n INT n 來(lái)實(shí)現(xiàn)。來(lái)實(shí)現(xiàn)。在在DOSDOS系

40、統(tǒng)中,系統(tǒng)功能調(diào)用都是用軟中斷指令系統(tǒng)中,系統(tǒng)功能調(diào)用都是用軟中斷指令I(lǐng)NT INT 21H21H來(lái)實(shí)現(xiàn)的。來(lái)實(shí)現(xiàn)的。D0SD0S系統(tǒng)功能調(diào)用的使用方法如下:系統(tǒng)功能調(diào)用的使用方法如下: 傳送入口參數(shù)到指定的寄存器中;傳送入口參數(shù)到指定的寄存器中; AHAH功能號(hào);功能號(hào); 執(zhí)行執(zhí)行INT 21HINT 21H指令;指令;1. 1. 鍵盤(pán)輸入單字符鍵盤(pán)輸入單字符( (功能號(hào)功能號(hào)=1)=1) MOV AH,1 MOV AH,1 INT 21H INT 21H 沒(méi)有入口參數(shù),執(zhí)行時(shí),系統(tǒng)等待鍵盤(pán)輸入,待沒(méi)有入口參數(shù),執(zhí)行時(shí),系統(tǒng)等待鍵盤(pán)輸入,待程序員按下任何一個(gè)鍵,若是程序員按下任何一個(gè)鍵,若是

41、Ctrl-BreakCtrl-Break鍵則退出,鍵則退出,若不是,則將鍵入字符的若不是,則將鍵入字符的ASCIIASCII碼置入碼置入ALAL中,并在顯中,并在顯示器上顯示。示器上顯示。 例例: :程序中有時(shí)需要用戶對(duì)提示做出應(yīng)答。程序中有時(shí)需要用戶對(duì)提示做出應(yīng)答。 GET_KEY: MOV AH,1 ; GET_KEY: MOV AH,1 ;等待鍵入字符等待鍵入字符 INT 21H INT 21H ; ;結(jié)果在結(jié)果在ALAL中中 CMP AL, CMP AL,Y Y ; ;是是Y Y? ? JZ YES JZ YES ; ;是是, ,轉(zhuǎn)轉(zhuǎn)YESYES CMP AL, CMP AL,N N

42、; ;是是N N? ? JZ NO JZ NO; ;是是, ,轉(zhuǎn)轉(zhuǎn)NONO JMP GET_KEY JMP GET_KEY; ;否則繼續(xù)等待輸入否則繼續(xù)等待輸入 YES: YES: NO: NO: 2.2.鍵盤(pán)輸入字符串鍵盤(pán)輸入字符串( (功能號(hào)功能號(hào)=0AH)=0AH) 功能:從鍵盤(pán)輸入一串字符并把它存入用戶指定的緩沖區(qū)中,功能:從鍵盤(pán)輸入一串字符并把它存入用戶指定的緩沖區(qū)中,此緩沖區(qū)必須預(yù)先指定。此緩沖區(qū)必須預(yù)先指定。格式:格式: MOV DX, MOV DX, MOV AH, 0AH MOV AH, 0AH INT 21H INT 21H N3 N2N1N1: 緩沖區(qū)能存放的字節(jié)數(shù)緩沖區(qū)

43、能存放的字節(jié)數(shù)N2: 留給系統(tǒng)填寫(xiě)實(shí)際鍵入的字符數(shù)留給系統(tǒng)填寫(xiě)實(shí)際鍵入的字符數(shù)(不包括回車符不包括回車符)N3:存放鍵入的字符串,長(zhǎng)度為:存放鍵入的字符串,長(zhǎng)度為N1個(gè)字節(jié),回車鍵個(gè)字節(jié),回車鍵(ODH)標(biāo)志著鍵入內(nèi)容結(jié)束,標(biāo)志著鍵入內(nèi)容結(jié)束, 也算作鍵入字符。若沒(méi)有回車毽,則不接受鍵入的字符。也算作鍵入字符。若沒(méi)有回車毽,則不接受鍵入的字符。用戶定義的輸入字符串的緩沖區(qū)格式:用戶定義的輸入字符串的緩沖區(qū)格式: 若用戶鍵入的字符數(shù)若用戶鍵入的字符數(shù)( (包括回車包括回車) )不足以填滿緩沖區(qū)不足以填滿緩沖區(qū)時(shí),則空余字節(jié)補(bǔ)時(shí),則空余字節(jié)補(bǔ)0 0,若實(shí)際鍵入的字符數(shù)超過(guò)緩沖區(qū),若實(shí)際鍵入的字符數(shù)

44、超過(guò)緩沖區(qū)的容量,則超出的字符將被丟失,并且響鈴向程序員發(fā)的容量,則超出的字符將被丟失,并且響鈴向程序員發(fā)出警告。出警告。例:設(shè)在數(shù)據(jù)段定義鍵盤(pán)緩沖區(qū)如下:例:設(shè)在數(shù)據(jù)段定義鍵盤(pán)緩沖區(qū)如下: STR1 DB 10,?,10 DUP(?) STR1 DB 10,?,10 DUP(?) 調(diào)用調(diào)用DOSDOS功能的功能的0AH0AH號(hào)功能的程序段為:號(hào)功能的程序段為: LEA DX LEA DX,STR1STR1 MOV AH MOV AH,0AH0AH INT 21H INT 21H 此程序段最多從鍵盤(pán)接收此程序段最多從鍵盤(pán)接收1010個(gè)字符包括回車)。個(gè)字符包括回車)。3.3.輸出單字符輸出單字符( (功能號(hào)功能號(hào)=2)=2) MOV DL, MOV DL, MOV AH, 2 MOV AH, 2 INT 21H INT 21H 例:在顯示器上顯示一個(gè)字符例:在顯示器上顯示一個(gè)字符AA MOV DL, A ; MOV DL, A ;或或

溫馨提示

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