




已閱讀5頁,還剩202頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第三章 第4章 匯編語言程序設(shè)計,第4章 匯編語言程序設(shè)計,4.1 概述 4.2 匯編語言程序的格式與基本語法 4.3 偽操作命令與宏指令 4.4 DOS與BIOS的調(diào)用 4.5 匯編語言程序設(shè)計,主要內(nèi)容:,匯編語言源程序的結(jié)構(gòu) 匯編語言語句格式 偽指令 功能調(diào)用 匯編語言程序設(shè)計,4.1 概述,一、機器語言(Machine Language)二進制數(shù)形式的指令和數(shù)據(jù)。 B0 64 這就是機器語言。既不直觀,又不易理解和記憶. 目標程序(Object Program)用機器語言編寫的程序,MOV AL,64H ;這就是助記符。 助記符用便于記憶的英語單詞表示的指令操作碼。它反映了指令的功能和主要特征,便于人們理解和記憶。,二、匯編語言(Assembly Language)指令助記符,符號地址,標號,偽指令等語言元素的集合以及這些元素使用的規(guī)則。,采用標號或符號來代替地址,匯編語言源程序(Source Program)用匯編語言編寫的程序。,操作數(shù)可能放在存儲器中,這就涉及操作數(shù)的地址。程序中遇到轉(zhuǎn)移指令或調(diào)用指令,也需要知道轉(zhuǎn)移地址,若采用具體地址就很不方便,一旦有錯,改動也很麻煩。,10D1:0100 09750B OR DI+0B,SI 10D1:0103 807C0A2C CMP BYTE PTR SI+0A,2C 10D1:0107 7505 JNZ 010E 10D1:0109 FF36A22C PUSH 2CA2 10D1:010D 41 INC CX 10D1:010E 93 XCHG BX,AX 10D1:010F 33D2 XOR DX,DX 10D1:0111 EBA7 JMP 00BA 10D1:0113 33D2 XOR DX,DX 10D1:0115 33C0 XOR AX,AX 10D1:0117 FF36952C PUSH 2C95 10D1:011B C3 RET 10D1:011C 33D2 XOR DX,DX 10D1:011E 0BC9 OR CX,CX,匯編程序,源程序的編譯程序,匯編程序,匯編語言源程序,機器語言目標程序,匯編源程序需翻譯成機器語言,變成可執(zhí)行文件,機器才能執(zhí)行,這個翻譯過程叫匯編。高級語言中稱該過程為“解釋”或“編譯”。執(zhí)行翻譯的程序稱為“匯編程序”。,匯編語言程序設(shè)計與執(zhí)行過程,輸入?yún)R編語言源程序,源文件 .ASM,匯編(編譯),目標文件 .OBJ,鏈接,可執(zhí)行文件 .EXE,調(diào)試,最終程序,MASM、DEBUG,MASM X.ASM,LINK X.OBJ,X.EXE,三、高級語言(High level Language),適合于描述各種算法,不依賴于計算機結(jié)構(gòu)和指令系統(tǒng)。 可移植性好,編成方法適合人們的習(xí)慣、通用性好。 編譯和解釋程序復(fù)雜,占內(nèi)存大,產(chǎn)生目標代碼長。執(zhí)行速度慢。處理中斷和接口困難。,高級語言源程序,目標 程序,編譯,編譯軟件程序或解釋軟件程序,4.1.1 匯編語言源程序的結(jié)構(gòu),匯編語言源程序通常由一個或幾個程序模塊組成,每個模塊一般由三個邏輯段組成: 數(shù)據(jù)段存放數(shù)據(jù)、變量 堆棧段堆棧區(qū)域 代碼段存放程序指令,堆棧段,數(shù)據(jù)段,代碼段,一個基本的匯編語言程序框架如下:,4.2 匯編語言源程序的格式與基本語法,匯編語言的語句有三種: 指令性語句由8086指令助記符構(gòu)成的語句,由CPU執(zhí)行,每一條指令性語句都有一條機器碼指令與其對應(yīng)。 指示性語句由偽指令構(gòu)成的語句,由匯編程序執(zhí)行。它指出匯編程序應(yīng)如何對源程序進行匯編,如何定義變量、分配存儲單元以及指示程序開始和結(jié)束等。指示性語句無機器碼指令與其相對應(yīng)。 宏指令語句簡化匯編語言,可以用一條宏指令指令代替定義過的一段程序,匯編時將該段程序插入對應(yīng)程序中。,一、語句的種類,指令性語句的格式為: 標號: 指令助記符 目的操作數(shù),源操作數(shù) ;注釋 指示性語句的格式為: 名字 偽指令 參數(shù)1,參數(shù)2,參數(shù)n ;注釋 宏指令語句的格式為: 標號: 宏指令 參數(shù)1,參數(shù)2,參數(shù)n ;注釋 注:各部分之間至少要用一個空格作為分隔符。,二、語句的構(gòu)成元素: 標號指令的符號地址,用來代表指令在存儲器中的地址。只能出現(xiàn)在指令性語句中,標號后應(yīng)加上冒號。 名字段、過程、變量的名字,用來代表它們在存儲器中的地址。只能出現(xiàn)在指示性語句中,名字后不加冒號。 指令助記符8086助記符、偽指令 操作數(shù)即指令的操作對象 對指令性語句0,1,2個 對指示性語句根據(jù)需要而定 操作數(shù)之間以逗號分隔 操作數(shù)可以是:寄存器、存儲單元、常數(shù)或表達式 例如:AX,DI+BX+10,200,16*8+TABLE,等等,注釋以分號開頭,可放在指令后,也可單獨一行。 注意注解的寫法。要寫指令(段)在程序中的作用,而不要寫指令的操作。 例如:以下為同一條指令寫的注釋 1)MOV CX,100 ;傳送100到CX 2)MOV CX,100 ;循環(huán)計數(shù)器置初值 顯然,第二種寫法要比第一種寫法要好。,匯編語言的一個實例: hello.asm data SEGMENT Hello DB Hello, world!,0DH,0AH,$ data ENDS prog SEGMENT ASSUME CS:prog,DS:data start: MOV AX,data MOV DS,AX LEA DX,hello ;取字符串首地址 MOV AH,9 INT 21H ;顯示字符串 MOV AH,4CH INT 21H ;退回DOS prog ENDS END start,名字,標號,三、數(shù)據(jù)項與表達式,數(shù)據(jù)項包括常量、變量、標號及表達式。 1.常量 常數(shù) 二進制數(shù),以B結(jié)尾。如01001101B。 十進制數(shù),如85。 十六進制數(shù),以H結(jié)尾。第1個數(shù)字為A-F時,前面應(yīng)加0,如0F160H。 字符串:用引號括起來的1個或多個字符。如ERROR!, a,匯編時被翻譯成對應(yīng)的ASCII碼45H,52H,52H,4FH,52H,21H和61H。 數(shù)值符號名:用偽指令定義的(EQU)符號名. 常量表達式:用各種運算符與各種數(shù)值常數(shù)組成的可求值的表達式。由匯編程序計算而得。,有三個屬性: 段地址:即標號所在段的段地址; 偏移量:標號所代表存儲單元的段內(nèi)偏移地址; 類 型:NEAR或FAR: NEAR表示標號所在語句與轉(zhuǎn)移指令/ 調(diào)用指令在同一碼段內(nèi),跳轉(zhuǎn)時 只需改變IP即可。 FAR標號所在語句與轉(zhuǎn)移指令/調(diào)用 指令不在同一代碼段內(nèi)。 若沒有對類型進行說明,默認為NEAR。 標號通常作為轉(zhuǎn)移指令或CALL指令的轉(zhuǎn)移地址。,2.標號指令所在內(nèi)存單元的符號地址,變量即內(nèi)存中的存儲單元或數(shù)據(jù)區(qū)。 變量名是存儲單元(數(shù)據(jù)區(qū))的符號地 址或名字。 變量也有三個屬性: 段地址變量所在段的段地址 偏移量變量單元地址與段首地址之間的位移量。 類 型有BYTE、WORD和DWORD三種。 變量在程序中作為存儲器操作數(shù)被引用。,3.變量,標號和變量名的使用規(guī)則 組成:A-Z(不分大小寫), 0-9, ? . _ $ 不能以數(shù)字開頭,句號(.)只能作為首字符 長度小于31個字符 不能與保留字(指令助記符、偽指令、預(yù)定義符號等)重名 不能重復(fù)定義 例如: 正確的:LP1, AGAIN, NEXT, _GO, OK_1 錯誤的:4M, LOOP, AAA, #HELP, +ONE,4.表達式,表達式是常數(shù)、寄存器、標號、變量與運算符的組合。 有數(shù)字表達式和地址表達式兩種。 匯編時按優(yōu)先規(guī)則對表達式進行計算,計算出具體的數(shù)值或地址。運行時不能改變。 表達式中的運算符有5類:算術(shù)運算符、邏輯運算符、關(guān)系運算符、分析運算符和合成運算符。,用于數(shù)字表達式,例: MOV AX,4*1024 匯編后的形式為: MOV AX,4096 用于地址表達式,例: LEA SI,TAB+3 若TAB的偏移地址為1000H,則匯編后的形式為: LEA SI,1003H,1)算術(shù)運算符 +、-、*、/,MOD,SHL,SHR,邏輯運算符只能用于數(shù)字表達式中。 例:MOV CL,36H AND 0FH 經(jīng)匯編后:MOV CL,06H 注意,不要把邏輯運算符與邏輯運算指令混淆: 例:AND AX, 3FC0H AND 0FF00H 匯編后源操作數(shù)被翻譯為:3F00H,所以上述指令與AND AX, 3F00H等價。,2)邏輯運算符 AND、OR、XOR、NOT,關(guān)系運算的結(jié)果是一個邏輯值:真或假 關(guān)系為真,結(jié)果為全1 關(guān)系為假,結(jié)果為全0,3)關(guān)系運算符EQ、NE、LT、GT、LE、GE,例:MOV BX,PORT GT 300H; 若PORT的值大于300H,則匯編后為:MOV BX,0FFFFH 否則匯編后為: MOV BX,0,例: MOV BX,(PORT GT 300H) AND 20H) OR (PORT LE 300H) AND 30H) 若PORT的值大于300H,則匯編后為: MOV BX,20H 否則匯編后為: MOV BX,30H,SEG:取變量/標號的段地址 OFFSET:取變量/標號的偏移地址 例:VAR DB 12H MOV BX,OFFSET VAR ;取變量VAR的偏移地址 MOV AX,SEG VAR ;取變量VAR的段地址 注意,以下指令的異同: MOV BX, OFFSET VAR LEA BX, VAR OFFSET只能取靜態(tài)的偏移地址; LEA指令即可取靜態(tài)的偏移地址,也可取動態(tài)的偏移地址。,取地址運算符SEG、OFFSET,4)分析運算符: 分析對MEM(變量或標號)的三個重要的屬性。,TYPE 取變量的類型(1,2,4) LENGTH 取所定義變量的長度 (即變量中元素的個數(shù)) SIZE 取所定義存儲區(qū)的字節(jié)數(shù) (=TYPE*LENGTH) 例:VAR DW 20 DUP(?),2 DAT1 DB 5,1 則 TYPE VAR = 2 LENGTH VAR = 20 SIZE VAR = 40 LENGTH、SIZE 僅用于帶DUP的外層有效,取值運算符TYPE、LENGTH、SIZE,格式 運算符 操作數(shù),SEG OFFSET TYPE,變量名或標號 變量名或標號 標號 或變量名,返回其所在段的段基址 返回其所在段的偏移地址 返回其屬性值NEAR、FAR DB、DW、DD、DQ、DT,變量名 變量名,LENGTH SIZE,1、 2、 4、 8、 10,-1、 -2,元素個數(shù) 字節(jié)數(shù),SIZE=TYPE*LENGTH,用于帶DUP的外層有效,6)合成運算符PTR、THIS,用來指定地址操作數(shù)的類型。 格式: PTR 類型BYTE, WORD, DWORD, NEAR, FAR BYTE、WORD、DWORD 用于描述數(shù)據(jù)存儲單元(變量)地址 NEAR、FAR 用于描述轉(zhuǎn)移、調(diào)用的目的地址,變量:指令中臨時指定的變量的新屬性 可利用PTR指定地址相同而類型不同的新變量,例:MOV BYTE PTRDI,0 ;字節(jié)類型 MOV WORD PTRDI,0 ;字類型 MOV DI,0B5H ;類型不定 例: STR1 DW ? ;STR1定義為字類型 STR2 EQU BYTE PTR STAR1 MOV AX,STR1 ;合法 MOV AL,STR1 ;非法 MOV AL,BYTE PTR STR1 ;合法 MOV AL,STR2,標號:可用PTR建立地址相同而類型不同的新符號。 可臨時指定其標號的新屬性。 C1 SEGMENT ASSUME C1:CS JMP NEAR PTR NEXT;超前引用 FNEXT EQU FAR PTR NEXT FFNEXT EQU THIS FAR NEXT:MOV BX,100 C2 SEGMENT C2:CS JMP FNEXT ,符號 equ this 類型 另一符號;放于被指定類型前,6.匯編運算符(THIS),格式:THIS 類型 可以像PTR一樣建立一個指定類型的地址操作數(shù),該操作數(shù)的段地址和偏移地址與下一個存儲單元地址相同。,例: BUFB EQU THIS BYTE BUFW DW 1234H,5678H . MOV AX,BUFW ;AX=1234H MOV BL,BUFB ;BL=34H,BUFB的偏移地址和BUFW完全相同,但它是字節(jié)類型;而BUFW則是字類型。,P237頁 運算符的優(yōu)先級,4.3 偽操作命令與宏指令,數(shù)據(jù)定義偽指令 符號定義偽指令 模塊定義偽指令(段) 過程定義偽指令 宏指令 模塊連接 列表偽指令,由匯編程序執(zhí)行的指令,它本身不被匯編成機器指令。這里僅介紹MASM常用的偽指令。,4.3.1 數(shù)據(jù)定義與存儲器分配偽指令(define),用于定義變量,即內(nèi)存單元或數(shù)據(jù)區(qū)。 數(shù)據(jù)定義偽指令的格式為: 變量名 數(shù)據(jù)定義偽指令 操作數(shù),操作數(shù), DB、DW、DD、DQ、DT 作用:定義變量類型屬性,并可以進行初始化 常數(shù)或表達式 字符串(hello表示其ASC值的) ?(該單元不初始化,預(yù)留出存儲空間) 帶DUP表達式 n dup(操作數(shù)) 帶$(表示地址計數(shù)器當(dāng)前值),常數(shù)或表達式: DATA_B DB 10,5,10H DATA_W DW 100H,-4 DATA_D DD 0FFFBH,注意下面兩個定義的不同之處: DB AB;41H在低字節(jié) ;42H在高字節(jié) DW AB;42H在低字節(jié), ;41H在高字節(jié),操作數(shù)可以是字符串,例如 STR DB HELLO,操作數(shù)?用來保留存儲空間,但不存入數(shù)據(jù). 例3:ABC DB 0,1,2,3,4,OK,$ RSV DW ?,?,?,?,?,?,?,? 復(fù)制操作符DUP: 重復(fù)的數(shù)據(jù)可以使用復(fù)制操作符DUP,如上面RSV亦可寫成: RSV DW 8 DUP(?),若操作數(shù)中若使用$,則表示的是地址計數(shù)器的當(dāng)前值。 例: TABLE DB 10 DUP(?) BUFFER DW TABLE,$+3 設(shè)TABLE的偏移地址為0080H,則匯編后如下圖所示: $表示當(dāng)前存儲單元的偏移地址。,BUFFER,0080H,80H,TABLE,008AH 008BH 008CH 008DH,. . .,8FH,00H,00H,0089H,10 Bytes,DATA SEGMENT DAT1 DB 40H DAT10 EQU WORD PTR DAT1 DAT9 EQU THIS WORD DAT2 DW 00H,23H DAT3 DB 2 DUP(20H) DAT4 DB AB DAT5 DW AB DAT6 DW ?,$+3 DAT7 DB 25H*4 A1 EQU 10H DAT8 DB 2 DUP(2 DUP(A1) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA MOV AX,DATA MOV DS,AX MOV BX,SEG DAT2 MOV CX,OFFSET DAT2 XX: MOV DX,TYPE DAT2 MOV AX,TYPE XX MOV AL,LENGTH DAT3 MOV AH,LENGTH DAT8 MOV BL,SIZE DAT8 mov ah,4ch int 21h CODE ENDS END,?H,?H,10H,00H,94H,10H,10H,10H,10H,09H,10H,41H,42H,42H,41H,20H,20H,00H,23H,00H,00H,40H,DAT9,DAT10,D:MASM1DEBUG DEFINED.EXE -D 1254:0000 40 00 00 23 00 20 20 41-42 42 41 00 00 10 00 94 #. ABBA. 1254:0010 10 10 10 10 00 00 00 00-00 00 00 00 00 00 00 00 1254:0020 B8 54 12 8E D8 BB 54 12-B9 01 00 BA 02 00 B8 FF 8TX;T.9:8. 1254:0030 FF B0 02 B4 00 B3 00 B4-4C CD 21 00 00 00 00 00 .LM!. 1254:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 1254:0050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 1254:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 1254:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 -,AX=0000 BX=0000 CX=0082 DX=0002 SP=0000 BP=0000 SI=0000 DI=0000 DS=1244 ES=1244 SS=1254 CS=1254 IP=0020 NV UP DI PL NZ NA PO NC 1254:0020 B85412 MOV AX,1254 -T AX=1254 BX=0000 CX=0082 DX=0002 SP=0000 BP=0000 SI=0000 DI=0000 DS=1244 ES=1244 SS=1254 CS=1254 IP=0023 NV UP DI PL NZ NA PO NC 1254:0023 8ED8 MOV DS,AX -T AX=1254 BX=0000 CX=0082 DX=0002 SP=0000 BP=0000 SI=0000 DI=0000 DS=1254 ES=1244 SS=1254 CS=1254 IP=0025 NV UP DI PL NZ NA PO NC 1254:0025 BB5412 MOV BX,1254 -T AX=1254 BX=1254 CX=0082 DX=0002 SP=0000 BP=0000 SI=0000 DI=0000 DS=1254 ES=1244 SS=1254 CS=1254 IP=0028 NV UP DI PL NZ NA PO NC 1254:0028 B90100 MOV CX,0001 -T AX=1254 BX=1254 CX=0001 DX=0002 SP=0000 BP=0000 SI=0000 DI=0000 DS=1254 ES=1244 SS=1254 CS=1254 IP=002B NV UP DI PL NZ NA PO NC 1254:002B BA0200 MOV DX,0002 -,AX=1254 BX=1254 CX=0001 DX=0002 SP=0000 BP=0000 SI=0000 DI=0000 DS=1254 ES=1244 SS=1254 CS=1254 IP=002E NV UP DI PL NZ NA PO NC 1254:002E B8FFFF MOV AX,FFFF -T AX=FFFF BX=1254 CX=0001 DX=0002 SP=0000 BP=0000 SI=0000 DI=0000 DS=1254 ES=1244 SS=1254 CS=1254 IP=0031 NV UP DI PL NZ NA PO NC 1254:0031 B002 MOV AL,02 -T AX=FF02 BX=1254 CX=0001 DX=0002 SP=0000 BP=0000 SI=0000 DI=0000 DS=1254 ES=1244 SS=1254 CS=1254 IP=0033 NV UP DI PL NZ NA PO NC 1254:0033 B402 MOV AH,02 -T AX=0202 BX=1254 CX=0001 DX=0002 SP=0000 BP=0000 SI=0000 DI=0000 DS=1254 ES=1244 SS=1254 CS=1254 IP=0035 NV UP DI PL NZ NA PO NC 1254:0035 B302 MOV BL,02 -T AX=0202 BX=1202 CX=0001 DX=0002 SP=0000 BP=0000 SI=0000 DI=0000 DS=1254 ES=1244 SS=1254 CS=1254 IP=0037 NV UP DI PL NZ NA PO NC 1254:0037 B44C MOV AH,4C -,4.3.2 符號定義偽指令,用EQU定義的符號未清除前,不能重新定義。清除EQU定義可用PURGE偽指令。 用”=”定義的符號可在任何時候進行重定義。 二者均不占用存儲空間,僅是給符號賦值,格式: 符號名 EQU或= 表達式,把一個表達式用一個符號表示,以后凡出現(xiàn)該表達式的地方都可用這個符號表示。類似于C語言中的#define。 符號定義偽指令有兩種:EQU,=,可以為數(shù)值和地址及其表達式,變量,標號、指令助記符,例:FIVE EQU 5 COUNT EQU CX TEN EQU 10 DIST = BYTE PTRSI+BP GOTO = JMP MOV AX, TEN MOV CX, COUNT ADD DIST, FIVE DIST = WORD PTRSI+BP+1 ADD DIST, AX GOTO LABEL,定義,引用,4.3.3 程序模塊定義偽指令,當(dāng)功能復(fù)雜、大型的程序設(shè)計任務(wù),先分解成多個相對獨立的小任務(wù),單獨編寫 、調(diào)試、匯編。,格式: NAME module_name,1、NAME可省 2、NAME省后文件模塊名? (1)若有TITLE test ,默認test前6字符 (2)都無,為源文件名(x.asm)為模塊名,TITLE test,END 表達式,最多6個字符,以字母開頭,可指定每頁的打印標題,60多字符(列表文件上),1、可不加表達式,默認第一條成機器碼指令的地址 2、每個模塊僅有一個END 主模塊:END 表達式,為第一條代碼的標號。 子模塊:不加表達式,匯編結(jié)束偽指令,END后不形成機器碼,一、模塊定義偽指令,二、段定義偽指令,匯編語言源程序是按段來組織程序和數(shù)據(jù)的。 匯編語言程序中的段稱為邏輯段。 匯編連接后被映射到物理段中。 三類段:代碼(程序)、數(shù)據(jù)、堆棧 段定義偽指令:SEGMENT、ENDS、ASSUME、ORG 定義一個段的基本格式: 段名 SEGMENT 定位類型組合方式類別 段名 ENDS,這兩個偽指令總是成對出現(xiàn),二者前面的段名應(yīng)一致。SEGMENT說明了一個段的開始,ENDS說明了一個段的結(jié)束。 對數(shù)據(jù)段和堆棧段,段中的語句一般是變量定義。對代碼段則是指令語句。 如: data SEGMENT data ENDS,(一)SEGMENT和ENDS偽指令,SEGMENT語句后可以帶有可選參數(shù),用以規(guī)定邏輯段的其他一些屬性。,1) 定位類型 說明如何確定邏輯段的邊界。有四種: PARA(Paragraph): 邏輯段從一個節(jié) (16個字節(jié)) 的邊界開始。即段的起始地址應(yīng)能被16整除, 或這說段起始物理地址應(yīng)為0H。默認類型 BYTE : 邏輯段從字節(jié)邊界開始,即段可以從任何地址開始。 WORD : 邏輯段從字邊界開始。即段的起始地址必須是偶數(shù)。 PAGE : 邏輯段從頁邊界開始。256字節(jié)稱為一頁,故段的起始物理地址應(yīng)為00H。,2) 組合類型 說明不同模塊中同名段的組合方式。 PUBLIC : 所有此類型的同名段組合成一個邏輯段,公用一個段地址,運行時裝入同一個物理段中。 COMMON : 所有此類型的同名段具有相同的起始地址(覆蓋),共享相同的存儲區(qū)域。 AT : 按絕對地址定位,段地址就是表達式的值。 STACK : 專用于說明堆棧段,組合方式同PUBLIC,3) 類別 用單引號括起來的字符串。所有同類別的段被安排在連續(xù)的存儲區(qū)域中。 如:在模塊1中有段定義: seg1 SEGMENT PARA STACK stack seg1 ENDS 在模塊2中有段定義: seg2 SEGMENT PARA STACK stack seg2 ENDS 則連接時這兩個段被安排在一起。,(二)、ASSUME偽指令,功能:在代碼段中,說明段和段寄存器的關(guān)系,并未將段寄存器賦值。 格式: ASSUME 段寄存器:段名,段寄存器:段名 例: ASSUME CS:code, DS:data, ES:data :程序段比為CS,堆棧段必須為SS 該語句一般放于代碼段的最前面。 僅是說明性語句,除CS外(由系統(tǒng)賦值),各段寄存器均需在程序中賦值 取消語句 ASSUME NOTHING,段寄存器的填入:,1、代碼段段寄存器CS及指令指針I(yè)P的填入 當(dāng)匯編程序掃描到程序結(jié)束偽指令END符號地址時, 系統(tǒng)自動將當(dāng)前代碼段基址CS 同時將END后面的符號地址的偏移地址IP, (若無符號地址,將第一條可執(zhí)行性語句的偏移地址IP),2、數(shù)據(jù)段段寄存器DS及擴展數(shù)據(jù)段段寄存器ES的填入 由指令填入 MOV AX,段名 MOV DS,AX MOV AX,段名 MOV ES,AX,3、堆棧段段寄存器SS及堆棧指針SP的填入 系統(tǒng)自動填入 當(dāng)定義段的組合類型為STACK時。 即STACK SEGMENT STACK ;將相同名連接在一起形成一個大的堆棧段 DW 200 DUP(?) STACK ENDS 系統(tǒng)自動將此段段基址SS 段長度SP 用指令填入 當(dāng)定義段的組合類型缺省(非STACK) 代碼段中用MOV指令來完成,S_SEG SEGMENT STA DB 200 DUP(?) S_SEG ENDS C_SEG SEGMENT ASSUME CS:C_SEG,SS:S_SEG START:MOV AX,S_SEG MOV SS,AX MOV SP,SIZE STA ;或mov sp,length sta CODE ENDS,S_SEG SEGMENT STA DB 200 DUP(?) top equ size sta ;或 top equ length sta S_SEG ENDS C_SEG SEGMENT ASSUME CS:C_SEG,SS:S_SEG START:MOV AX,S_SEG MOV SS,AX MOV SP,TOP CODE ENDS,ORG規(guī)定了段內(nèi)的指令或數(shù)據(jù)存放的開始地址(偏移地址的初值),其格式為: ORG 表達式的值即為開始地址,從此地址起連續(xù)存放程序或數(shù)據(jù)。 例: ABC SEGMENT ORG 100H begin: ABC ENDS,(三)、ORG偽指令,指令從100H開始存放,4.3.4 過程定義偽指令PROC、ENDP,過程就是子程序。一個過程可以被其它程序所調(diào)用(用CALL指令),過程的最后一條指令一般是返回指令(RET) 過程定義偽指令的格式為 PROC 類型 RET ENDP 注意:PROC和ENDP必須成對出現(xiàn)。,過程的類型有兩種: NEAR(默認類型)表示段內(nèi)調(diào)用 FAR表示段間調(diào)用 調(diào)用一個過程的格式為: CALL ,4.3.5 宏定義偽指令,如果需要多次使用同一個程序段,可以將這個程序段定義為一個”宏指令”,然后在需要時,可簡單地用宏指令名來代替這個程序段。,指令的格式為: MACRO 形參表 ENDM,例:兩個數(shù)之和的宏定義和宏調(diào)用。 宏定義為: DADD MACRO X,Y,Z MOV AX,X ADD AX,Y MOV Z,AX ENDM,X、Y、Z是形式參數(shù)。調(diào)用宏DADD時可寫為: DADD DATA1,DATA2,SUM DATA1,DATA2,SUM是實際參數(shù),由它們替換定義中的X、Y、Z。,宏調(diào)用與過程(子程序)調(diào)用都是一次定義,多次調(diào)用。它們之間的差別是: 執(zhí)行形式:宏命令偽指令由宏匯編程序在匯編過理中進行處理,而CALL、RET則是由CPU執(zhí)行的指令。 匯編結(jié)果:宏命令偽指令匯編后被展開。 執(zhí)行速度:宏命令執(zhí)行速度較快(因無調(diào)用轉(zhuǎn)移) 占用內(nèi)存:宏指令簡化了源程序,但不能簡化目標程序,并不節(jié)省內(nèi)存單元。使用過程可以節(jié)省代碼占用的內(nèi)存空間。,宏展開:匯編程序會把宏調(diào)用按宏定義展開。 例如:宏定義為: Display MACRO string LEA DX,string MOV AH,9 INT 21H ENDM 程序中宏調(diào)用: DISPLAY ERROR_MESSAGE DISPLAY EXIT_MESSAGE 匯編后的結(jié)果:(帶有+號的指令為宏展開后的結(jié)果) + LEA DX,ERROR_MESSAGE + MOV AH,9 + INT 21H + LEA DX,EXIT_MESSAGE + MOV AH,9 + INT 21H ,4.3.6 模塊連接偽指令,用于模塊之間的共享信息。 即A模塊中的變量和標號被B模塊使用時必須加以說明,一、PUBLIC;本模塊說明,格式:PUBLIC 符號名1 ,符號名2,功能:公共引用,說明本模塊定義,其它模塊引用的共享信息。,二、EXTRN;引用外模塊的說明(external),格式:EXTRN 符號名:類型,符號名:類型,功能:其他模塊定義的,本模塊引用。,NAME A EXTRN VAR2:WORD,LAB2:FAR PUBLIC VAR1,LAB1,VAR4 DATA1 SEGMENT VAR1 DB 12H,34H VAR3 DW 10 DUP(?) VAR4 DW 10 DUP(?) DATA1 ENDS,NAME B EXTRN VAR1:BYTE,VAR4:WORD PUBLIC VAR2 DATA2 SEGMENT VAR2 DW 0 VAR5 DB 5 DUP(0) DATA2 ENDS,NAME C EXTRN LAB1:FAR,VAR5:BYTE PUBLIC LAB2,存儲模式?jīng)Q定了一個程序的規(guī)模,也確定了子程序調(diào)用、指令轉(zhuǎn)移和數(shù)據(jù)訪問等的缺省屬性 當(dāng)使用簡化段定義的源程序格式時,必須有存儲模式.MODEL語句,且位于所有簡化段定義語句之前。其格式為: .MODEL 存儲模式 .MODEL語句確定了程序采用的存儲模式,MASM有7種可以選擇,4.3.7 存儲模式(Memory Model),2. 邏輯段的簡化定義,.STACK 大小 ;堆棧段定義偽指令.STACK創(chuàng)建一個堆棧段,段名是:STACK??蛇x的“大小”參數(shù)指定堆棧段所占存儲區(qū)的字節(jié)數(shù),默認是1KB(1024400H字節(jié)) .DATA ;數(shù)據(jù)段定義偽指令.DATA創(chuàng)建一個數(shù)據(jù)段,段名是:_DATA。數(shù)據(jù)段名可用DATA預(yù)定義標識符表示 .CODE 段名 ;代碼段定義偽指令.CODE創(chuàng)建一個代碼段,可選的“段名”參數(shù)指定該代碼段的段名。如果沒有給出段名,則采用默認段名,一個段的開始自動結(jié)束前面的一個段 簡化段定義偽指令之前,需有存儲模式語句,3. 程序開始,為了指明程序開始執(zhí)行的位置,需要使用一個標號(例題中采用了start標識符) 連接程序會根據(jù)程序起始點正確地設(shè)置CS和IP值,根據(jù)程序大小和堆棧段大小設(shè)置SS和SP值 連接程序沒有設(shè)置DS和ES值。程序如果使用數(shù)據(jù)段或附加段,必須明確給DS或ES賦值 大多數(shù)程序需要數(shù)據(jù)段,程序的執(zhí)行開始應(yīng)是: start: mov ax,data ;data表示數(shù)據(jù)段的段地址 mov ds,ax ;設(shè)置DS,4. 程序終止,應(yīng)用程序執(zhí)行結(jié)束,應(yīng)該將控制權(quán)交還操作系統(tǒng) 匯編語言程序設(shè)計中,有多種返回DOS的方法,但一般利用DOS功能調(diào)用的4CH子功能實現(xiàn),它需要的入口參數(shù)是AL返回數(shù)碼(通常用0表示程序沒有錯誤) 于是,應(yīng)用程序的終止代碼就是: mov ax,4c00h int 21h,5. 匯編結(jié)束,匯編結(jié)束表示匯編程序到此結(jié)束將源程序翻譯成目標模塊代碼的過程 源程序的最后必須有一條END偽指令 END 標號 可選的“標號”參數(shù)指定程序開始執(zhí)行點,連接程序據(jù)此設(shè)置CS和IP值(例題中采用了start標識符),不要糊涂 程序終止和匯編結(jié)束是兩碼事,第一個源程序文件wjl301.asm,;wjl301.asm .model small .stack .data string db Hello, Assembly !,0dh,0ah,$ .code start: mov ax,data mov ds,ax mov dx,offset string mov ah,9 int 21h mov ax,4c00h int 21h end start,簡化段定義的源程序格式,.model small ;小型模式存儲模式 .stack ; 1KB空間堆棧段 .data ;數(shù)據(jù)段 ;數(shù)據(jù)定義 .code ;代碼段 start: mov ax,data ;起始點 mov ds,ax ;設(shè)置DS ;程序代碼 mov ax,4c00h int 21h ;結(jié)束點,返回DOS ;子程序代碼 end start ;匯編結(jié)束,完整段定義格式,完整段定義利用SEGMENT和ENDS一對偽指令定義邏輯段 同時需要配合ASSUME偽指令指明邏輯段是代碼段、堆棧段、數(shù)據(jù)段還是附加段 完整段定義的優(yōu)勢是可以指明邏輯段的定位、組合、類別等屬性;而簡化段定義只能采用系統(tǒng)默認的屬性 完整段定義和簡化段定義的實質(zhì)是一致的,2.匯編 匯編就是用宏匯編程序MASM.EXE把匯編語言源程序翻譯(匯編)成機器語言的目標程序。宏匯編程序主要有以下功能: 檢查源程序中語法錯誤,給出錯誤信息; 展開宏指令; 生目標程序(.OBJ),列表文件(.LST)和交叉引用文件(.CRF)。,4.3.8 匯編語言上機調(diào)試,1.編輯 調(diào)用編輯程序EDIT.EXE,WS.EXE等,用鍵盤敲入源程序,退出編輯系統(tǒng)時,保存編輯完成的文件,且擴展名為.ASM。,接著屏幕上顯示:,宏匯編程序詢問匯編產(chǎn)生的目標程序文件(目標程序文件是一個純二進制代碼文件,不能直接在屏幕上顯示觀察)的文件名是否為方括號中的默認值(即目標程序與源程序同名)。若是,直接按一回車鍵,否則需自己輸入另一文件名。在回答完這一詢問后,宏匯編程序接著依次詢問產(chǎn)生列表文件(列表文件.LST是一個很有用的文件,文件中包含了源程序中各語句及其對應(yīng)的目標代碼。給出了源程序中各語句所屬段內(nèi)的偏移量,并且把源程序中所用的標號、變量和符號,列出它們的名字、類型和值,便于查閱)和交叉引用文件(交叉引用文件中給出了源程序中定義的符號如標號、變量等以及程序中引用這些符號的情況,且是按字母順序排列的。若要查看這個符號表,必須使用CREF軟件,它根據(jù).CRF文件建立一個擴展名為.REF的文件。然后再顯示.REF文件的內(nèi)容就可以看到這個符號表)的文件名,屏幕上顯示:,這兩個文件是否建立由操作人員確定:若要建立其中一個或兩個,操作人員便可輸入所需建立的文件名,否則直接送入回車鍵。待完成上述人機對話后,宏匯編程序便對源程序進行掃描,檢查源程序中各語句是否有語法錯誤,同時把各語句匯編成對應(yīng)的機器目標代碼。在匯編過程中,若發(fā)現(xiàn)源程序有語法錯誤,便隨時給出出錯信息。屏幕上顯示:,如果警告錯誤和嚴重錯誤總數(shù)都等于零,那么這次源程序的匯編獲得通過,可以進行連接。否則,返回編輯程序,修改源程序,然后再次進行匯編,直到源程序匯編正確無誤。 如果匯編時,無須產(chǎn)生列表文件和交叉引用文件,則在啟動宏匯編程序時可用分號結(jié)尾,比如: C:MASM TEST; 如果需要后面的列表文件和交叉引用文件,且它們的文件名與源文件名相同,這時啟動宏匯編程序時,可用逗號指明,比如: C:MASM TEST,;,3.連接 源程序經(jīng)過匯編后產(chǎn)生的目標程序,必須經(jīng)過連接程序LINK.EXE連接后才能運行。 連接程序把一個或多個獨立的目標程序模塊連接裝配成一個可重定位的可執(zhí)行文件(擴展名為.EXE)。連接程序LINK除產(chǎn)生一個可執(zhí)行文件外,還可產(chǎn)生一個內(nèi)存映象文件(擴展名為.MAP)。LINK連接的一定是擴展名為.OBJ的目標程序。 在操作系統(tǒng)狀態(tài)下,直接啟動連接程序LINK.EXE。 例如: C:LINK TEST 接著屏幕上顯示:,連接程序詢問連接時產(chǎn)生的可執(zhí)行文件名是否用方括號中的默認值(即可執(zhí)行文件與目標程序文件同名)。若是,可直接按一回車鍵,否則需要重新輸入一文件名。接著依次詢問,屏幕上顯示:,其中MAP文件(MAP文件列出各段的起點,終點及長度。)是否建立,由操作人員確定。若要,則輸入一文件名,否則直接送一回車鍵。后一個是詢問在連接時是否要用庫文件。對于來自宏匯編語言程序的目標程序文件,通常是直接送一回車鍵。 與啟動宏匯編程序一樣,可以在啟動連接程序時,用分號結(jié)束后續(xù)詢問。如: C:LINK TEST; 若要產(chǎn)生MAP文件,且使用目標程序文件名,可用一逗號表示。 C:LINK TEST,;,若需要連接多模塊的目標程序時,可用“+”把它們連接起來。例如連接三個目標程序文件P1.OBJ、P2.OBJ、P3.OBJ,其操作如下: C:LINK P1+P2+P3; 這樣產(chǎn)生的一個可執(zhí)行文件是約定取用第一個目標程序文件名,當(dāng)然操作人員也可重新用另外的文件名。,4.調(diào)試運行 在建立好可執(zhí)行文件后,就可以直接從DOS執(zhí)行程序,如下所示: C:TEST.EXE C: 程序運行結(jié)束后返回DOS。如果用戶程序已直接把結(jié)果在終端上顯示出來,那么程序已經(jīng)運行結(jié)束,結(jié)果也已經(jīng)得到了。,生成 .COM文件 .COM文件也是一種可執(zhí)行文件,由程序本身的二進制代碼組成,它沒有 .EXE文件所具有的包括有關(guān)文件信息的標題區(qū)(HEADER),因此它占有的存儲空間比 .EXE文件要小。.COM文件不允許分段,它所占有的空間不允許超過64 KB,因而只能用來編制較小的程序。由于其小而簡單,裝入速度比 .EXE文件要快。 使用 .COM文件時,程序不分段,其入口點(開始運行的起始點)必須是100H(其前的256個字節(jié)為程序段前綴所在地),且不必設(shè)置堆棧段。在程序裝入時,由系統(tǒng)自動把SP建立在該段之末。對于所有的過程則應(yīng)定義為NEAR。,用戶在建立源文件以后,同樣經(jīng)過匯編、連接生成 .EXE文件,然后可以通過DOS操作系統(tǒng)下的EXE2BIN程序來建立 .COM文件,操作方法如下: C:EXE2BIN FILENAME FILENAME.COM 請讀者注意,上行中的第一個FILENAME給出了已形成的 .EXE文件的文件名,但不必給出文件擴展名。第二個FILENAME即為所要求的 .COM文件的文件名,它必須帶有文件擴展名 .COM,這樣就形成了所要的 .COM文件。在DOS系統(tǒng)下,可直接在機器上鍵入文件名以執(zhí)行程序。如果第二個FILENAME后不跟擴展名,則將形成 .BIN文件,在DOS系統(tǒng)下運行該程序時,必須先用RENAME命令把它改名為 .COM文件才能直接運行。 此外,.COM文件還可以直接在調(diào)試程序DEBUG中用A或E命令建立,對于一些短小的程序,這也是一種相當(dāng)方便的方法。,1.DEBUG程序的調(diào)用 在DOS的提示符下,可鍵入命令: C:DEBUG D:PATHFILENAME.EXEPARM1PARM2 其中,文件名是被調(diào)試文件的名字。如用戶鍵入文件,則DEBUG將指定的文件裝入存儲器中,用戶可對其進行調(diào)試。 如果未鍵入文件名,則用戶可以用當(dāng)前存儲器的內(nèi)容工作,或者用DEBUG命令N和L把需要的文件裝入存儲器后再進行調(diào)試。 命令中的D指定指定驅(qū)動器PATH為路徑,PARM1和PARM2則為運行被調(diào)試文件時所需要的命令參數(shù)。,4.3.9 DEBUG主要命令 DEBUG是為匯編語言設(shè)計的一種高度工具,它通過單步、設(shè)置斷點等方式為匯編語言程序員提供了非常有效的調(diào)試手段。,2.DEBUG的主要命令 (1)顯示存儲單元的命令D(DUMP),格式為: _Daddress或 _Drange 例如,D命令的使用情況如下:,(2)修改存儲單元內(nèi)容的命令有兩種。 輸入命令E(ENTER),有兩種格式如下: 第一種格式可以用給定的內(nèi)容表來替代指定范圍的存儲單元內(nèi)容。命令格式為: -E address list 例如,-E DS:100 F3XYZ8D 第二種格式則是采用逐個單元相繼修改的方法。命令格式為: -E address,(3)檢查和修改寄存器內(nèi)容的命令R(register) 它有三種格式 顯示CPU內(nèi)所有寄存器內(nèi)容和標志位狀態(tài),其格式為: -R 顯示和修改某個寄存器內(nèi)容,其格式為: -R register name 顯示和修改標志位狀態(tài),命令格式為: -RF,(4)運行命令G,其格式為: -G=address1address2address3 其中,地址1指定了運行的起始地址,如不指定則從當(dāng)前的CS:IP開始運行。后面的地址均為斷點地址,當(dāng)指令執(zhí)行到斷點時,就停止執(zhí)行并顯示當(dāng)前所有寄存器及標志位的內(nèi)容,和下一條將要執(zhí)行的指令。 (5)跟蹤命令T(Trace),有兩種格式: 逐條指令跟蹤 -T=address 從指定地址起執(zhí)行一條指令后停下來,顯示所有寄存器內(nèi)容及標志位的值。如未指定地址則從當(dāng)前的CS:IP開始執(zhí)行。 多條指令跟蹤 -T=addressvalue 從指定地址起執(zhí)行n條指令后停下來,n由value指定。,(6)匯編命令A(yù)(Assemble),其格式為: -Aaddress 該命令允許鍵入?yún)R編語言語句,并能把它們匯編成機器代碼,相繼地存放在從指定地址開始的存儲區(qū)中。必須注意:DEBUG把鍵入的數(shù)字均看成十六進制數(shù),所以如要鍵入十進制數(shù),則其后應(yīng)加以說明,如120D。 (7)反匯編命令U(
溫馨提示
- 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 教學(xué)進度管理規(guī)定
- 2025年采購師(初級)考試試卷:采購談判與議價技巧
- 雨中情感抒寫作文(4篇)
- 2025公共英語三級考試試卷閱讀理解策略與高分技巧
- 2025年法語DELFC2級口語表達試卷:環(huán)境保護政策
- 2025年電梯安裝改造維修作業(yè)特種作業(yè)操作證考試試卷(電梯操作培訓(xùn)篇)
- 建筑設(shè)計風(fēng)格與元素應(yīng)用案例分析題
- 2025年工業(yè)互聯(lián)網(wǎng)平臺5G通信模組在智能工廠數(shù)據(jù)采集與分析系統(tǒng)的適配性評估報告
- 金融機構(gòu)2025年風(fēng)險管理數(shù)字化轉(zhuǎn)型中的風(fēng)險控制策略優(yōu)化與實踐
- 從課本中看到的世界讀后感結(jié)合課本內(nèi)容創(chuàng)作(4篇)
- 肢體離斷傷的護理
- 2024年中國黑龍江省農(nóng)藥市場調(diào)查報告
- LINE6效果器HD300中文說明書
- 浙江省強基聯(lián)盟學(xué)考模擬2024-2025學(xué)年高二下學(xué)期6月學(xué)考模擬地理試題(含答案)
- 中國美術(shù)學(xué)院非教學(xué)崗位招聘筆試真題2024
- 外賣餐飲平臺管理制度
- 人形機器人深度研究系列八:諧波減速器:差齒傳動持續(xù)進化
- 公立醫(yī)院風(fēng)險評估報告
- 腫瘤婦科進修匯報
- 麻醉意外與并發(fā)癥處理規(guī)范與流程
- 供應(yīng)商入庫協(xié)議
評論
0/150
提交評論