第4章 匯編語言程序設(shè)計(jì)_第1頁
第4章 匯編語言程序設(shè)計(jì)_第2頁
第4章 匯編語言程序設(shè)計(jì)_第3頁
第4章 匯編語言程序設(shè)計(jì)_第4頁
第4章 匯編語言程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩95頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1 n 第第1節(jié)節(jié) MASM宏匯編語言結(jié)構(gòu)宏匯編語言結(jié)構(gòu)n 第第2節(jié)匯編語言的數(shù)據(jù)、表達(dá)式和符號(hào)節(jié)匯編語言的數(shù)據(jù)、表達(dá)式和符號(hào) n 第第3節(jié)節(jié) 偽指令偽指令 n 第第4節(jié)節(jié) 程序設(shè)計(jì)程序設(shè)計(jì) n 第第5節(jié)節(jié) DOS功能調(diào)用功能調(diào)用 n 第第6節(jié)節(jié) 實(shí)用程序設(shè)計(jì)舉例實(shí)用程序設(shè)計(jì)舉例 第第4 4章章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) 24.1 MASM4.1 MASM匯編語句結(jié)構(gòu)匯編語句結(jié)構(gòu)MASMMASM匯編語言有三種語句:指令語句、偽指令語句及宏匯編語言有三種語句:指令語句、偽指令語句及宏指令語句。這里只介紹前兩種。指令語句。這里只介紹前兩種。1 1、指令語句(、指令語句(Instructio

2、n statements)Instruction statements)l指令語句又稱可執(zhí)行語句,要求指令語句又稱可執(zhí)行語句,要求CPUCPU執(zhí)行某種操作。執(zhí)行某種操作。l指令語句的格式為:指令語句的格式為: 標(biāo)號(hào)標(biāo)號(hào): : 指令助記符指令助記符 操作數(shù)操作數(shù) ; ;注釋注釋 標(biāo)號(hào)是該指令的符號(hào)地址,表示該指令第一標(biāo)號(hào)是該指令的符號(hào)地址,表示該指令第一個(gè)字節(jié)的地址。以冒號(hào)作為結(jié)束符。個(gè)字節(jié)的地址。以冒號(hào)作為結(jié)束符。32、偽指令語句(、偽指令語句(pseude instruction statements)l偽指令又稱指示詞句,偽指令又稱指示詞句,它不要求它不要求CPUCPU執(zhí)行某種操作執(zhí)行某種

3、操作,匯編時(shí)也不產(chǎn)生對(duì)應(yīng)的機(jī)器代碼,匯編時(shí)也不產(chǎn)生對(duì)應(yīng)的機(jī)器代碼,而僅僅告訴匯,而僅僅告訴匯編程序,對(duì)它后面的指令語句和操作數(shù)應(yīng)該如何產(chǎn)編程序,對(duì)它后面的指令語句和操作數(shù)應(yīng)該如何產(chǎn)生機(jī)器目標(biāo)代碼。生機(jī)器目標(biāo)代碼。l偽指令的格式為:偽指令的格式為: 符號(hào)名符號(hào)名 定義符定義符 操作數(shù)操作數(shù) ; ;注釋注釋 注意偽指令符號(hào)名后無冒號(hào)注意偽指令符號(hào)名后無冒號(hào)44.2 匯編語言中的數(shù)據(jù)、表達(dá)式和符號(hào)匯編語言中的數(shù)據(jù)、表達(dá)式和符號(hào)1、常數(shù)、常數(shù)l 常數(shù)是編程時(shí)已經(jīng)確定的純數(shù)值。常數(shù)是編程時(shí)已經(jīng)確定的純數(shù)值。l常數(shù)分為兩種類型:常數(shù)分為兩種類型:數(shù)值型常數(shù):如二進(jìn)制數(shù)數(shù)值型常數(shù):如二進(jìn)制數(shù)01110010

4、B、八進(jìn)制數(shù)、八進(jìn)制數(shù)723Q、十進(jìn)制數(shù)、十進(jìn)制數(shù)14D、十六進(jìn)制數(shù)、十六進(jìn)制數(shù)3AH。字符串型常數(shù)字符串型常數(shù) :用單引號(hào)括起來的字符串,如:用單引號(hào)括起來的字符串,如ABC、5。每個(gè)字符在機(jī)內(nèi)以。每個(gè)字符在機(jī)內(nèi)以ASCII碼格式存碼格式存放。放。 52、變量、變量 變量用來定義存放在存儲(chǔ)器單元中的數(shù)據(jù)。其三重變量用來定義存放在存儲(chǔ)器單元中的數(shù)據(jù)。其三重屬性為:屬性為:l 段屬性(段屬性(SEG):變量所在段的段基址。:變量所在段的段基址。l 偏移地址屬性(偏移地址屬性(OFFSET):變量的偏移地址。:變量的偏移地址。l 類型屬性(類型屬性(TYPE):變量占用的字節(jié)數(shù)。:變量占用的字節(jié)數(shù)

5、。例:例:DATA SEGMENTFIRST DB 5AH SECOND DW 1122H DATA ENDS對(duì)變量的操作:對(duì)變量的操作:LEA AX,F(xiàn)IRSTMOV AL,F(xiàn)IRSTMOV AX,SECOND變量名:存放數(shù)據(jù)存儲(chǔ)單元的符號(hào)地址。變量名:存放數(shù)據(jù)存儲(chǔ)單元的符號(hào)地址。63、標(biāo)號(hào)、標(biāo)號(hào) 給指令語句所在地址取的名字。標(biāo)號(hào)與變量類似,給指令語句所在地址取的名字。標(biāo)號(hào)與變量類似,也有三重屬性。也有三重屬性。 l 段屬性(段屬性(SEG):標(biāo)號(hào)所在段的段基址。:標(biāo)號(hào)所在段的段基址。l 偏移地址屬性(偏移地址屬性(OFFSET):標(biāo)號(hào)的偏移地址。:標(biāo)號(hào)的偏移地址。l 距離屬性(距離屬性(D

6、istance):當(dāng)標(biāo)號(hào)作為轉(zhuǎn)移類指令:當(dāng)標(biāo)號(hào)作為轉(zhuǎn)移類指令的操作數(shù)時(shí),可以在同一段或不同段之間執(zhí)行轉(zhuǎn)移的操作數(shù)時(shí),可以在同一段或不同段之間執(zhí)行轉(zhuǎn)移。若只在同一段內(nèi)轉(zhuǎn)移,距離屬性為。若只在同一段內(nèi)轉(zhuǎn)移,距離屬性為NEAR,否則,否則距離屬性為距離屬性為FAR。 例:例:LOP:MOV AX,0000 JMP LOP74、表達(dá)式、表達(dá)式 MASM 允許使用的表達(dá)式分為兩類:允許使用的表達(dá)式分為兩類: 1)數(shù)值表達(dá)式)數(shù)值表達(dá)式 數(shù)值表達(dá)式的結(jié)果是一個(gè)常數(shù)。數(shù)值表達(dá)式的結(jié)果是一個(gè)常數(shù)。例:例:MOV DX,(,(6*A - B)/2 ;(A、B為變量)為變量) 2)地址表達(dá)式)地址表達(dá)式 地址表達(dá)

7、式的結(jié)果是一個(gè)存儲(chǔ)單元的地址。地址表達(dá)式的結(jié)果是一個(gè)存儲(chǔ)單元的地址。 例:例:MOV AX,ES:BX+SI+1000H 85、運(yùn)算符、運(yùn)算符 MASM的運(yùn)算符分為六大類:的運(yùn)算符分為六大類: 1)算數(shù)運(yùn)算符)算數(shù)運(yùn)算符 2)邏輯運(yùn)算符)邏輯運(yùn)算符 3)關(guān)系運(yùn)算符)關(guān)系運(yùn)算符 4)分析運(yùn)算符)分析運(yùn)算符 5)合成運(yùn)算符)合成運(yùn)算符 6)其它運(yùn)算符)其它運(yùn)算符由運(yùn)算符組成的表達(dá)式可以得到一個(gè)確定的值,在由運(yùn)算符組成的表達(dá)式可以得到一個(gè)確定的值,在指令中可以作為指令中可以作為源操作數(shù)源操作數(shù)。9MASM支持的運(yùn)算符支持的運(yùn)算符運(yùn)算符運(yùn)算符類型類型符號(hào)符號(hào)名稱名稱運(yùn)算結(jié)果運(yùn)算結(jié)果實(shí)例實(shí)例算術(shù)運(yùn)算符算

8、術(shù)運(yùn)算符+加法加法和和減法減法差差*乘法乘法乘積乘積/除法除法商商MOD模除模除余數(shù)余數(shù)SHL左移左移左移后二進(jìn)制數(shù)左移后二進(jìn)制數(shù)SHR右移右移右移后二進(jìn)制數(shù)右移后二進(jìn)制數(shù)2+6=88-2=68 *5=4022/5=412 MOD 3= 032 MOD 6= 2 0010B SHL 2=1000B1100B SHR 1=0110B10例:例:A1 EQU 1020+3300MOV BX,A1-1000MOV AX,35*5MOV DX, A1/100MOV CX,A1 MOD 100MOV AL,00001010B SHL 4等效于:等效于: A1 EQU 4320 MOV BX,3320 M

9、OV AX,175 MOV DX, 43 MOV CX,20 MOV AL,10100000B運(yùn)算符和運(yùn)算指令的區(qū)別:運(yùn)算符和運(yùn)算指令的區(qū)別:1、運(yùn)算符如果在指令語句中指令助記符的位置時(shí)為運(yùn)算指令,、運(yùn)算符如果在指令語句中指令助記符的位置時(shí)為運(yùn)算指令,在其它位置時(shí),如在源操作數(shù)的位置,為運(yùn)算符。在其它位置時(shí),如在源操作數(shù)的位置,為運(yùn)算符。2、運(yùn)算指令在可執(zhí)行程序執(zhí)行時(shí)進(jìn)行,而運(yùn)算符是在匯編時(shí)由、運(yùn)算指令在可執(zhí)行程序執(zhí)行時(shí)進(jìn)行,而運(yùn)算符是在匯編時(shí)由匯編程序完成其運(yùn)算功能。匯編程序完成其運(yùn)算功能。*算術(shù)運(yùn)算符組成的算術(shù)表達(dá)式的值取其整數(shù)。算術(shù)運(yùn)算符組成的算術(shù)表達(dá)式的值取其整數(shù)。11運(yùn)算符運(yùn)算符類型

10、類型符號(hào)符號(hào)名稱名稱運(yùn)算結(jié)果運(yùn)算結(jié)果實(shí)例實(shí)例邏輯運(yùn)算符邏輯運(yùn)算符NOT非運(yùn)算非運(yùn)算邏輯非結(jié)果邏輯非結(jié)果AND與運(yùn)算與運(yùn)算邏輯與結(jié)果邏輯與結(jié)果OR或運(yùn)算或運(yùn)算邏輯或結(jié)果邏輯或結(jié)果XOR異或運(yùn)算異或運(yùn)算 邏輯異或結(jié)果邏輯異或結(jié)果NOT 1010B=0101B1011B AND1100B=1000B1011B OR 1100B=1111B1011B XOR 1100B=0110B12運(yùn)算符運(yùn)算符類型類型符號(hào)符號(hào)名稱名稱運(yùn)算結(jié)果運(yùn)算結(jié)果實(shí)例實(shí)例關(guān)系運(yùn)算符關(guān)系運(yùn)算符EQ相等相等NE不等不等LT小于小于LE不大于不大于GT大于大于GE不小于不小于 6EQ11B=全全06NE11B=全全15LT8=全全17

11、LE101B=全全06GT100B=全全16GE111B=全全0結(jié)果為真輸出結(jié)果為真輸出全全1結(jié)果為假輸出結(jié)果為假輸出全全013例例2: MOV AX,5 EQ 101B ADD BL,10H GT 16例例1: MOV AL,NOT 10101010B MOV AL,11110000B AND 10111101B等效于:等效于: MOV AL,01010101B MOV AL,10110000B等效于:等效于:MOV AX,F(xiàn)FFFH ADD BL,00H14運(yùn)算符運(yùn)算符類型類型符號(hào)符號(hào)運(yùn)算結(jié)果運(yùn)算結(jié)果實(shí)例實(shí)例分析運(yùn)算符分析運(yùn)算符SEG返回返回變量或標(biāo)號(hào)的變量或標(biāo)號(hào)的段基段基址址OFFSET

12、返回變量或標(biāo)號(hào)的偏移返回變量或標(biāo)號(hào)的偏移地址地址LENGTH返回變量的單元數(shù)返回變量的單元數(shù)TYPE返回變量單元字節(jié)數(shù)或返回變量單元字節(jié)數(shù)或標(biāo)號(hào)的距離屬性標(biāo)號(hào)的距離屬性SIZE返回變量總字節(jié)數(shù)返回變量總字節(jié)數(shù)=LENGTH*TYPESEG N1=N1所在所在段段基址段段基址OFFSET N1=N1的偏移地址的偏移地址LENGTH N2=N2單元數(shù)單元數(shù)TYPE N2=N2元素字節(jié)數(shù)元素字節(jié)數(shù)SIZE N2=N2總字節(jié)數(shù)總字節(jié)數(shù)15 MOV AX,SEG FIRST MOV DI,OFFSET FIRST MOV AL,TYPE FIRST ;(AL)=1 (字節(jié)字節(jié)) MOV AL,TYPE

13、SECOND ;(AL)=2 (字節(jié)字節(jié)) MOV BX,SEG LOP MOV SI,OFFSET LOP MOV AL,LENGTH FIRST ; (AL)=2 MOV AL,SIZE SECOND ; (AL)=2例:例:DATA SEGMENT LOP:MOV AX,0000 FIRST DB 5AH,6BH SECOND DW 1122H JMP LOP DATA ENDS 16ES:BX;DS:BLOCK運(yùn)算符運(yùn)算符類型類型符號(hào)符號(hào)名稱名稱運(yùn)算結(jié)果運(yùn)算結(jié)果實(shí)例實(shí)例修改運(yùn)算符修改運(yùn)算符PTR修改類型屬性修改類型屬性 修改后類型修改后類型THIS指定類型指定類型/距離屬性距離屬性指定

14、后類型指定后類型段寄存段寄存器名器名段前綴段前綴修改段修改段HIGH分離高字節(jié)分離高字節(jié)高字節(jié)高字節(jié)LOW分離低字節(jié)分離低字節(jié)低字節(jié)低字節(jié)SHORT 短轉(zhuǎn)移說明短轉(zhuǎn)移說明BYTE PTRBXALPHA EQU THIS BYTEHIGH 2345H=23HLOW 2345H=45HJMP SHORT LABEL17nPTR :強(qiáng)制類型轉(zhuǎn)換。用于修改變量的類型或修強(qiáng)制類型轉(zhuǎn)換。用于修改變量的類型或修改標(biāo)號(hào)的距離屬性。改標(biāo)號(hào)的距離屬性。例例 : F1 DB 15H F2 DW 3132H ALPHA: MOV AL,BYTE PTR F2 JMP FAR PTR ALPHAn(EQU) THIS:

15、指定類型及距離屬性指定類型及距離屬性例:例:B-GAMA EQU THIS BYTE W-GAMA DW 1234H MOV AL,B-GAMA MOV AX,W-GAMA可以這樣嗎?可以這樣嗎?AL中中存的是什么?能通過存的是什么?能通過debug解決此問題?解決此問題?18運(yùn)算符運(yùn)算符類型類型符號(hào)符號(hào)名稱名稱運(yùn)算結(jié)果運(yùn)算結(jié)果實(shí)例實(shí)例其它運(yùn)算符其它運(yùn)算符( )圓括號(hào)圓括號(hào)改變運(yùn)算級(jí)優(yōu)先級(jí)改變運(yùn)算級(jí)優(yōu)先級(jí) 方括號(hào)方括號(hào)下標(biāo)或間接尋址下標(biāo)或間接尋址點(diǎn)運(yùn)算符點(diǎn)運(yùn)算符連接結(jié)構(gòu)與變量連接結(jié)構(gòu)與變量尖括號(hào)尖括號(hào)修改變量修改變量MASK返回字段屏返回字段屏蔽碼蔽碼字段屏蔽碼字段屏蔽碼WIDTH返回記錄返回

16、記錄寬度寬度記錄記錄 / 字段位字段位數(shù)數(shù)(84)*4=16MOV AX,BXTABT1MASK CWIDTH W(了解)(了解)19運(yùn)算符的優(yōu)先級(jí)表(了解)運(yùn)算符的優(yōu)先級(jí)表(了解)優(yōu)先級(jí)優(yōu)先級(jí)符號(hào)符號(hào)高高低低1234567891011LENGTH,SIZE,WIDTH,MASK,( ), ,PTR,OFFSET,SEG,TYPE,THISHIGH,LOW+, (單目單目)*,/,MOD,SHL,SHR+,(雙目雙目)EQ,NE,LT,LE,GT,GENOTANDOR,XORSHORT204.3 4.3 偽指令(指示語言)偽指令(指示語言) 偽指令是偽指令是說明性語句說明性語句,它沒有對(duì)應(yīng)的機(jī)

17、器指令,它沒有對(duì)應(yīng)的機(jī)器指令,不由,不由CPUCPU執(zhí)行,而是在匯編程序匯編時(shí)識(shí)別,用執(zhí)行,而是在匯編程序匯編時(shí)識(shí)別,用于說明于說明CPUCPU的類型、段結(jié)構(gòu)、源程序起止信息和段的類型、段結(jié)構(gòu)、源程序起止信息和段內(nèi)存的安排等。內(nèi)存的安排等。 MASMMASM的偽指令可分為變量定義語句、符號(hào)定義的偽指令可分為變量定義語句、符號(hào)定義語句、段定義語句、段分配語句、過程定義語句、語句、段定義語句、段分配語句、過程定義語句、群定義語句、結(jié)構(gòu)定義語句、記錄定義語句等。群定義語句、結(jié)構(gòu)定義語句、記錄定義語句等。211、變量定義語句變量定義語句 變量定義語句用來定義字節(jié)、字或雙字等變量,變量定義語句用來定義字

18、節(jié)、字或雙字等變量,變量定義語句有兩種不同的格式。變量定義語句有兩種不同的格式。 1)格式一)格式一 變量名變量名 DB / DW / DD / DQ / DT 表達(dá)式表達(dá)式 功能:為每個(gè)表達(dá)式分配功能:為每個(gè)表達(dá)式分配 1 字節(jié)字節(jié)/ 2 字節(jié)字節(jié)/ 4 字節(jié)字節(jié)/ 8 字節(jié)字節(jié)/ 10字節(jié)的存儲(chǔ)單元,并賦值。字節(jié)的存儲(chǔ)單元,并賦值。注意注意: :變量定義語句前的變量名不是一定要有的。如在堆棧變量定義語句前的變量名不是一定要有的。如在堆棧段中,通過變量定義語句規(guī)定堆棧的容量時(shí),在其前面就不段中,通過變量定義語句規(guī)定堆棧的容量時(shí),在其前面就不需要變量名。見需要變量名。見PPT33PPT33。2

19、2(1)表達(dá)式為數(shù)值。例如:表達(dá)式為數(shù)值。例如:K1 DB 5AH ;將將5AH賦給字節(jié)變量賦給字節(jié)變量K1K2 DW 2354H ;將將2354H賦給字變量賦給字變量K2K3 DD 2A00 4455H ;將將2A00 4455H賦給雙字變量賦給雙字變量K35AH54H23H55H44H00H2AHK1K2K3如果表達(dá)式是?,表示一個(gè)不確定如果表達(dá)式是?,表示一個(gè)不確定的值,要求系統(tǒng)分配(預(yù)留)與其的值,要求系統(tǒng)分配(預(yù)留)與其類型相匹配的存儲(chǔ)單元。例如:類型相匹配的存儲(chǔ)單元。例如:BLOW DW ? ;定義變量定義變量BLOW為不確定值的字變量為不確定值的字變量23(2)表達(dá)式為字符串。例

20、如:表達(dá)式為字符串。例如:ONE DB “HOW ARE YOU” ;將將“HOW ARE YOU” 字符串賦給變量字符串賦給變量ONE。TWO DW OK ;將將OK字符串賦給變字符串賦給變 量量TWOHOW KOONETWO字符串以字符串以ASCII碼的形式儲(chǔ)存,一碼的形式儲(chǔ)存,一個(gè)個(gè)ASCII碼占一個(gè)字節(jié)。碼占一個(gè)字節(jié)。*單引號(hào),雙引號(hào)無區(qū)別。一般習(xí)單引號(hào),雙引號(hào)無區(qū)別。一般習(xí)慣上字符用單引號(hào),字符串用雙引慣上字符用單引號(hào),字符串用雙引號(hào)。號(hào)。24(3)表達(dá)式為數(shù)組。例如:表達(dá)式為數(shù)組。例如:A1 DB 00H,11H,22H,33HA2 DW 3456H,1025H,25*25,100

21、0/3,10A0H例:例:MOV AL,A13 ;(AL)=33H MOV AX,A21 ;(AX)=1025H*A1、A2為變量名,是其所存放數(shù)據(jù)單元的符號(hào)地址,等為變量名,是其所存放數(shù)據(jù)單元的符號(hào)地址,等于數(shù)據(jù)單元第一個(gè)字節(jié)的偏移地址。見課本于數(shù)據(jù)單元第一個(gè)字節(jié)的偏移地址。見課本P64。MOV AL,A13 ;源操作數(shù)為直接尋址,源操作數(shù)為直接尋址,MOV AL, AL+3MOV AX,A22; 因?yàn)橐驗(yàn)锳2是字變量,所以是字變量,所以A2+2為為1025H的偏移地址。的偏移地址。25 2)格式二)格式二 格式格式 2 用于定義重復(fù)變量,其格式為:用于定義重復(fù)變量,其格式為: DB DW

22、DD DF DQ DT變量名變量名n DUP(表達(dá)式)表達(dá)式)例:例:TAB1 DB 10 DUP(0) TAB2 DW 2 DUP(?)(?) TAB3 DB 4 DUP(1,2 DUP(50H)262、符號(hào)定義語句、符號(hào)定義語句 1)等值語句()等值語句(EQU) 格式:符號(hào)格式:符號(hào) EQU 表達(dá)式表達(dá)式 功能:用左邊的符號(hào)代替右邊的將表達(dá)式。表功能:用左邊的符號(hào)代替右邊的將表達(dá)式。表達(dá)式可以是常數(shù)、變量、標(biāo)號(hào)、寄存器名、數(shù)值或地達(dá)式可以是常數(shù)、變量、標(biāo)號(hào)、寄存器名、數(shù)值或地址表達(dá)式。址表達(dá)式。 在同一程序中,不能對(duì)在同一程序中,不能對(duì)EQU定義的符號(hào)定義的符號(hào)重新重新定義。定義。EQU

23、偽指令只是為常量、表達(dá)式等定義偽指令只是為常量、表達(dá)式等定義一個(gè)符號(hào)名,但并不申請(qǐng)分配內(nèi)存。一個(gè)符號(hào)名,但并不申請(qǐng)分配內(nèi)存。 2)等號(hào)語句)等號(hào)語句 格式:符號(hào)格式:符號(hào) = 表達(dá)式表達(dá)式 等號(hào)語句(等號(hào)語句(=)與)與EQU語句有同樣的功能,區(qū)別語句有同樣的功能,區(qū)別在于等號(hào)語句定義的符號(hào)允許重新定義,使用更加方在于等號(hào)語句定義的符號(hào)允許重新定義,使用更加方便靈活。便靈活。27【例例1】 :ACOS EQU 1250H COUNT EQU 100 BUF EQU ACOS+1000H MOV CL,COUNT【例例2】 :ONE =100 COUNT =100 A=ONE S=COUNT+1

24、00 A=A+100使用符號(hào)定義語句主要是為了編程方便,或是提高程使用符號(hào)定義語句主要是為了編程方便,或是提高程序的可讀性。序的可讀性。283、段定義指令段定義指令 在匯編程序設(shè)計(jì)中,需要將存儲(chǔ)器分成若干段,在匯編程序設(shè)計(jì)中,需要將存儲(chǔ)器分成若干段,80X86CPU訪問存儲(chǔ)器時(shí),憑借段寄存器對(duì)各個(gè)段進(jìn)訪問存儲(chǔ)器時(shí),憑借段寄存器對(duì)各個(gè)段進(jìn)行訪問。通常用段定義語句(行訪問。通常用段定義語句(SEGMENT/ENDS)來來定義各種類型的邏輯段。定義各種類型的邏輯段。 格式:格式: 段名段名 SEGMENT定位類型定位類型 ,組合類型組合類型,字字長選擇長選擇,分類名分類名 (段體)(段體) 段名段名

25、 ENDS 1)完整段定義偽指令)完整段定義偽指令29l段名:自己選定,前后一致段名:自己選定,前后一致l定位類型:表示對(duì)段的定位類型:表示對(duì)段的 起始邊界的要求,規(guī)定邏輯段起始邊界的要求,規(guī)定邏輯段的起始地址能夠被的起始地址能夠被256、16、4、2、1整除:整除:PAGE(頁頁):表示該段從一表示該段從一“頁頁”的邊界開始。段的邊界開始。段的首地址后兩位為的首地址后兩位為00H。一頁為。一頁為256個(gè)字節(jié)。個(gè)字節(jié)。PARA(節(jié)節(jié)):表示該段從一表示該段從一“節(jié)節(jié)”的邊界開始。的邊界開始。 段段的首地址后的首地址后1位為位為0H,節(jié)邊界。一節(jié)為節(jié)邊界。一節(jié)為16個(gè)字節(jié)。個(gè)字節(jié)。DWORD(雙

26、字雙字):表示該段從表示該段從4的倍數(shù)的地址開始的倍數(shù)的地址開始。WORD(字字):表示該段從表示該段從2的倍數(shù)的地址開始。的倍數(shù)的地址開始。BYTE(節(jié)節(jié)):表示該段從任一字節(jié)開始。表示該段從任一字節(jié)開始。若定位類型省略,系統(tǒng)默認(rèn)為若定位類型省略,系統(tǒng)默認(rèn)為PARA。30l組合類型:匯編時(shí)如何對(duì)各邏輯段進(jìn)行連接。例如:組合類型:匯編時(shí)如何對(duì)各邏輯段進(jìn)行連接。例如:NONE:(:(隱含)與其它同名段不連接,獨(dú)立存在。隱含)與其它同名段不連接,獨(dú)立存在。STACK:表明匯編時(shí)帶有表明匯編時(shí)帶有STACK組合類型的同名段連成一組合類型的同名段連成一個(gè)大的堆棧段,系統(tǒng)自動(dòng)對(duì)個(gè)大的堆棧段,系統(tǒng)自動(dòng)對(duì)S

27、S和和SP初始化。否則,初始化。否則,SS和和SP需需程序指定。程序指定。AT 表達(dá)式:表示本段可定義在表達(dá)式指示的節(jié)邊界上。注表達(dá)式:表示本段可定義在表達(dá)式指示的節(jié)邊界上。注意,這一組合類型不能用于代碼段。意,這一組合類型不能用于代碼段。例:例:MCODE SEGMENT AT 2050H;該段的首地址為該段的首地址為20500H。l字長選擇:用于定義段中使用偏移地址和寄存器字長,字長選擇:用于定義段中使用偏移地址和寄存器字長,只用于只用于32位系統(tǒng)。如省略,則系統(tǒng)默認(rèn)為位系統(tǒng)。如省略,則系統(tǒng)默認(rèn)為USE32。USE16:段字長為段字長為16位,最大段長為位,最大段長為64KBUSE32:段

28、字長為段字長為32位,最大段長為位,最大段長為4GBl分類名:分類名: 用單引號(hào)括起,分類名相同的邏輯段存放在連續(xù)存儲(chǔ)空間。用單引號(hào)括起,分類名相同的邏輯段存放在連續(xù)存儲(chǔ)空間。31l 段分配語句(段分配語句(ASSUME) 段分配語句用來說明源程序中定義的段由哪個(gè)段寄段分配語句用來說明源程序中定義的段由哪個(gè)段寄存器去尋址。段寄存器可以是存器去尋址。段寄存器可以是CS,SS,DS,ES,F(xiàn)S或或GS。 格式:格式: ASSUME 段寄存器:段名,段寄存器:段名段寄存器:段名,段寄存器:段名注意:注意:ASSUMEASSUME語句只建立當(dāng)段和段寄存器之間的聯(lián)系,但語句只建立當(dāng)段和段寄存器之間的聯(lián)系

29、,但ASSUMEASSUME語句不能將各段的段基值裝入各個(gè)段寄存器,段基址的語句不能將各段的段基值裝入各個(gè)段寄存器,段基址的裝入是用程序的辦法。對(duì)于代碼段,裝入是用程序的辦法。對(duì)于代碼段,CSCS和和IPIP的內(nèi)容由匯編程序的內(nèi)容由匯編程序自動(dòng)裝入;對(duì)于數(shù)據(jù)段自動(dòng)裝入;對(duì)于數(shù)據(jù)段DSDS和附加段和附加段ESES、FSFS、GS,GS,在代碼段中裝在代碼段中裝入段基值;對(duì)于堆棧段,如果在組合類型中選擇了入段基值;對(duì)于堆棧段,如果在組合類型中選擇了STACK,SS和和IP由由匯編程序自動(dòng)裝入,否則要在程序中匯編程序自動(dòng)裝入,否則要在程序中設(shè)置。設(shè)置。32DS、ES、FS和和GS的裝入:的裝入: D

30、S、ES、FS和和GS不能用立即數(shù)不能用立即數(shù)尋址方式直接裝入,段基值需先送入通用寄存器,再傳送給段尋址方式直接裝入,段基值需先送入通用寄存器,再傳送給段寄存器。寄存器。 SS及及SP的裝入:在段定義偽指令中,選用的裝入:在段定義偽指令中,選用 “STACK”參數(shù)項(xiàng)參數(shù)項(xiàng),在,在ASSUME語句中,把堆棧段分配給語句中,把堆棧段分配給SS,則則SS和和SP自動(dòng)裝入自動(dòng)裝入。如未使用。如未使用“STACK”參數(shù)項(xiàng),則用程序?qū)崿F(xiàn)參數(shù)項(xiàng),則用程序?qū)崿F(xiàn)SS和和SP的裝入。的裝入。例:例:MOV AX,DATA MOV DS,AX CS的裝入的裝入 :由起始標(biāo)號(hào)確定:由起始標(biāo)號(hào)確定CS和和IP。注意:此

31、處段名表示段基址。在注意:此處段名表示段基址。在MOVMOV指令中,不允許將立即數(shù)指令中,不允許將立即數(shù)直接送給段寄存器,通常借助通用寄存器中轉(zhuǎn)。直接送給段寄存器,通常借助通用寄存器中轉(zhuǎn)。33通知:下周三(通知:下周三(29日)晚日)晚19:00-21:00 微機(jī)原理期中考試。范圍:前微機(jī)原理期中考試。范圍:前4章章。地點(diǎn)地點(diǎn)SY109??荚囶}型:填空題、??荚囶}型:填空題、選擇題、指令改錯(cuò)題、程序分析題、選擇題、指令改錯(cuò)題、程序分析題、編寫程序題。編寫程序題。答疑:本周二下午答疑:本周二下午14:00-17:00。9教南教南308。助教:張曉斌。助教:張曉斌34例:

32、例: STACK2 SEGMENT DW 40 DUP(?)(?) BOTTOM LABEL WORD;堆棧底的位置堆棧底的位置 STACK2 ENDS CODE SEGMENT ASSUME CS:CODE SS:STACK2START: MOV AX,STACK2 MOV SS,AX MOV SP,OFFSET BOTTOM CODE ENDS END START35例:DATA SEGMENT BCDBUF DB 22H DATA ENDS EXTRA SEGMENT BUFF DB 20 DUP(00H) EXTRA ENDS STACK SEGMENT STACK SBUFF DB

33、200 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:EXTRA,SS:STACKSTART: MOV AX,DATA MOV DS,AX MOV AX,EXTRA MOV ES,AXCODE ENDS END START 36 2)簡化段定義偽指令)簡化段定義偽指令l內(nèi)存模式語句(內(nèi)存模式語句(.MODEL) 格式:格式:.MODEL 模式類型模式類型 功能:指定數(shù)據(jù)和代碼允許使用的長度。功能:指定數(shù)據(jù)和代碼允許使用的長度。l其它簡化的段定義語句其它簡化的段定義語句 .x86: 定義定義80 x86微處理器微處理器 .DAT

34、A:定義數(shù)據(jù)段定義數(shù)據(jù)段 37例:例:MODEL SMALL486(支持支持32位寄存器操作位寄存器操作)STACK DB 200HDATA BCDBUF DB 12HCODESTART: END START384、過程定義偽指令(過程定義偽指令(PROC/ENDP) 在程序設(shè)計(jì)中,常把具有一定功能的程序段設(shè)計(jì)在程序設(shè)計(jì)中,常把具有一定功能的程序段設(shè)計(jì)成一個(gè)子程序,又稱為過程。成一個(gè)子程序,又稱為過程。 過程定義偽指令的格式如下:過程定義偽指令的格式如下:過程名過程名 PROC(NEAR/FAR)RET過程名過程名 ENDPRETRETRET是過程返回語是過程返回語句。在過程內(nèi)部任句。在過程內(nèi)

35、部任意位置都可以設(shè)置意位置都可以設(shè)置多個(gè)返回指令作為多個(gè)返回指令作為過程的出口。但過過程的出口。但過程的最后一個(gè)指令程的最后一個(gè)指令必須是必須是RETRET語句。語句。395、其他偽指令、其他偽指令1. LABEL 偽指令偽指令: 用于給已定義的變量或標(biāo)號(hào)起一個(gè)別名,用于給已定義的變量或標(biāo)號(hào)起一個(gè)別名,并可重新定義它的類型或距離屬性。(詳見課本并可重新定義它的類型或距離屬性。(詳見課本P115) 格式:名稱格式:名稱 LABLE 類型類型/距離距離2. (1)定位偽指令定位偽指令 格式:格式:ORG 表達(dá)式表達(dá)式 表達(dá)式給出的是表達(dá)式給出的是ORG語句后第一條指令或第一個(gè)數(shù)據(jù)的偏移語句后第一條

36、指令或第一個(gè)數(shù)據(jù)的偏移地址。地址。 (詳見課本(詳見課本P116) 40 (2)當(dāng)前位置計(jì)數(shù)器當(dāng)前位置計(jì)數(shù)器:在匯編程序時(shí),用:在匯編程序時(shí),用 $ 表示當(dāng)前位置的偏表示當(dāng)前位置的偏移地址值移地址值。 DATA SEGMENT ST DB ABCDEFGH COUNT EQU $-ST DATA ENDS 在程序中經(jīng)常用這種方法獲得字符串的長度。在程序中經(jīng)常用這種方法獲得字符串的長度。 3、END 偽指令偽指令: 作為匯編源程序的結(jié)束語句,放在程序的最作為匯編源程序的結(jié)束語句,放在程序的最后一行。后一行。 格式:格式:END 標(biāo)號(hào)標(biāo)號(hào)此處的標(biāo)號(hào)是源程序中第一條可執(zhí)行語句的標(biāo)號(hào),是源程序的此處的

37、標(biāo)號(hào)是源程序中第一條可執(zhí)行語句的標(biāo)號(hào),是源程序的起始地址。見課本起始地址。見課本P127參考程序。參考程序。41 與高級(jí)語言程序設(shè)計(jì)類似,在用匯編語言進(jìn)行程與高級(jí)語言程序設(shè)計(jì)類似,在用匯編語言進(jìn)行程序設(shè)計(jì)時(shí),同樣應(yīng)按以下步驟進(jìn)行。序設(shè)計(jì)時(shí),同樣應(yīng)按以下步驟進(jìn)行。 1. 1.分析問題,明確要解決的問題和要求分析問題,明確要解決的問題和要求 2. 2.確定解決問題的思路和方法確定解決問題的思路和方法 3. 3.將解決問題的方案編制程序流程圖將解決問題的方案編制程序流程圖 4. 4.根據(jù)流程圖,逐條編制程序根據(jù)流程圖,逐條編制程序 5. 5.調(diào)試程序,驗(yàn)證程序是否正確調(diào)試程序,驗(yàn)證程序是否正確4.4

38、 4.4 程序設(shè)計(jì)程序設(shè)計(jì)42一個(gè)源程序的基本格式如下:一個(gè)源程序的基本格式如下:DATA SEGMENT DATA ENDSEXTRA SEGEMNT EXTRA ENDSSTACK1 SEGMENT PARA STACK STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA ASSUME SS:STACK1,ES:EXTRA;存放數(shù)據(jù)項(xiàng)的數(shù)據(jù)段;存放數(shù)據(jù)項(xiàng)的數(shù)據(jù)段;存放數(shù)據(jù)項(xiàng)的附加段;存放數(shù)據(jù)項(xiàng)的附加段;堆棧段;堆棧段43START: MOV AX,DATA MOV DS,AX MOV AX,EXTRA MOV ES,AX MOV AH,4CH I

39、NT 21HCODE ENDS END START(核心程序段核心程序段);DS裝入段基址裝入段基址;ES裝入段基址裝入段基址;系統(tǒng)功能調(diào)用:;系統(tǒng)功能調(diào)用:返回操作系返回操作系統(tǒng)統(tǒng)444.4.1 順序結(jié)構(gòu)程序順序結(jié)構(gòu)程序例:編制程序,求下列公式中的例:編制程序,求下列公式中的Z值,值,Z =(X+Y)*8 - X2設(shè)設(shè)X,Y的值分別存放在的值分別存放在VARX,VARY單元中,結(jié)果存單元中,結(jié)果存放到放到RESULT單元中。運(yùn)算結(jié)果不超過單元中。運(yùn)算結(jié)果不超過16位。設(shè)位。設(shè)X=0006H, Y=0007H。解:解: (1)存儲(chǔ)單元存儲(chǔ)單元 RESULT 用來存放結(jié)果,用來存放結(jié)果,VARX

40、 和和 VARY 放放 X、Y的值。寄存器的值。寄存器 DX 放中間運(yùn)算結(jié)果,左移放中間運(yùn)算結(jié)果,左移 1 位相當(dāng)位相當(dāng)于乘于乘 2,右移,右移 1 位相當(dāng)于除位相當(dāng)于除 2,所以可以用左移,所以可以用左移 3 位得到乘以位得到乘以 8 的結(jié)果。的結(jié)果。 45開始開始預(yù)置段寄存器預(yù)置段寄存器DX XDX X+YDX右移得右移得(X+Y)*8-X)/2RESULT DX結(jié)束結(jié)束DX左移左移3次次(X+Y)*8DX (DX)-X(2)程序流程圖和程序如下:程序流程圖和程序如下:46DATA SEGMENT VARX DW 0006H VARY DW 0007H RESUL DW ?DATA END

41、SSTACK1 SEGMENT PARA STACK DW 100H DUP(?)STACK1 ENDSCOSEG SEGMENT ASSUME CS:COSEG, DS:DATA ASSUME SS:STACK147 START: MOV AX , DATA MOV DS , AX;- MOV DX,VARX ;DXX ADD DX,VARY ;DX X+Y MOV CL , 3 SAL DX,CL ;DX (X+Y)*8 SUB DX,VARX ;DX (X+Y)*8-X SAR DX,1 ;DX ( (X+Y)*8-X )/2 MOV RESULT,DX;- MOV AH,4CH INT

42、 21H ;系統(tǒng)功能調(diào)用,返回操作系統(tǒng)系統(tǒng)功能調(diào)用,返回操作系統(tǒng)COSEG ENDS END START注意:段名就是段基址。在注意:段名就是段基址。在MOVMOV指令指令中,不允許將立即數(shù)直接送給段寄存中,不允許將立即數(shù)直接送給段寄存器,通常借助通用寄存器中轉(zhuǎn)。器,通常借助通用寄存器中轉(zhuǎn)。思考:此題需要設(shè)置堆棧段嗎?思考:此題需要設(shè)置堆棧段嗎?484.4.2 分支程序分支程序n條件轉(zhuǎn)移:條件轉(zhuǎn)移:Jcc Jcc 目標(biāo)目標(biāo)n用于程序需要進(jìn)行分別處理的情況。用于程序需要進(jìn)行分別處理的情況。n主要使用轉(zhuǎn)移指令。主要使用轉(zhuǎn)移指令。n轉(zhuǎn)移指令分為無條件轉(zhuǎn)移指令和條件轉(zhuǎn)移指令。轉(zhuǎn)移指令分為無條件轉(zhuǎn)移指令

43、和條件轉(zhuǎn)移指令。n無條件轉(zhuǎn)移指令:無條件轉(zhuǎn)移指令: JMP JMP 目標(biāo)目標(biāo)n在進(jìn)行分支程序設(shè)計(jì)時(shí),通常用比較、測試,或算在進(jìn)行分支程序設(shè)計(jì)時(shí),通常用比較、測試,或算術(shù)運(yùn)算、邏輯運(yùn)算影響標(biāo)志位,然后選擇轉(zhuǎn)移指令。術(shù)運(yùn)算、邏輯運(yùn)算影響標(biāo)志位,然后選擇轉(zhuǎn)移指令。49【課本例課本例4-4】 符號(hào)函數(shù)符號(hào)函數(shù) y= 1 x0 0 x=0 -1 x 0與與0比較比較X 0AL=0AL-1AL0AL1 NYNYYAL結(jié)束結(jié)束51DATA SEGMENT XX DB x YY DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART: MOV AX,DAT

44、A MOV DS, AX;-(分支程序內(nèi)容,見后頁分支程序內(nèi)容,見后頁);- MOV AH, 4CH INT 21HCODE ENDS END START52MOV AL, XX CMP AL, 0 ;x-0,建標(biāo)志位,建標(biāo)志位 JGE BIGD ;x 0轉(zhuǎn)移轉(zhuǎn)移 MOV AL,-1 ;x0轉(zhuǎn)移轉(zhuǎn)移 MOV AL, 0 ;x=0 JMP JUS2 ;與;與JUS1隔離。隔離。 JUS1: MOV AL, 1 ;x0JUS2: MOV YY, AL如無此指令,上一條指令執(zhí)行完后如無此指令,上一條指令執(zhí)行完后,會(huì)按順序執(zhí)行,會(huì)按順序執(zhí)行JUS1指令,對(duì)指令,對(duì)AL重新賦值。重新賦值。534.4.3

45、 循環(huán)程序循環(huán)程序 一個(gè)循環(huán)程序通常由以下四部分組成:一個(gè)循環(huán)程序通常由以下四部分組成:n初始化部分初始化部分 :建立循環(huán)的初始值,如初始化地址:建立循環(huán)的初始值,如初始化地址指針、計(jì)數(shù)器及給變量賦初值等。指針、計(jì)數(shù)器及給變量賦初值等。n循環(huán)體:循環(huán)的操作處理部分。循環(huán)體:循環(huán)的操作處理部分。n修改部分:為執(zhí)行循環(huán)修改地址指針、計(jì)數(shù)器或變修改部分:為執(zhí)行循環(huán)修改地址指針、計(jì)數(shù)器或變量等。量等。n控制部分:判斷循環(huán)是否結(jié)束。通常采用兩種方法:控制部分:判斷循環(huán)是否結(jié)束。通常采用兩種方法:計(jì)數(shù)器控制循環(huán)計(jì)數(shù)器控制循環(huán)和和條件控制循環(huán)條件控制循環(huán)。前者通常用于。前者通常用于先先執(zhí)行后判斷執(zhí)行后判斷的

46、循環(huán)結(jié)構(gòu)。后者通常用于的循環(huán)結(jié)構(gòu)。后者通常用于先判斷后執(zhí)先判斷后執(zhí)行行的循環(huán)結(jié)構(gòu)。的循環(huán)結(jié)構(gòu)。54常用的計(jì)數(shù)器控制循環(huán)指令有:常用的計(jì)數(shù)器控制循環(huán)指令有:LOOP, LOOPE, LOOPNE。對(duì)應(yīng)的控制循環(huán)結(jié)構(gòu)分別為:。對(duì)應(yīng)的控制循環(huán)結(jié)構(gòu)分別為: MOV CX, n標(biāo)號(hào)標(biāo)號(hào): .LOOP 標(biāo)號(hào)標(biāo)號(hào); (CX0)時(shí)重復(fù)時(shí)重復(fù)MOV CX, n標(biāo)號(hào)標(biāo)號(hào): .CMP dst, srcLOOPE 標(biāo)號(hào)標(biāo)號(hào);(CX0)且相等且相等時(shí)重復(fù)時(shí)重復(fù)MOV CX, n標(biāo)號(hào)標(biāo)號(hào): .CMP dst, srcLOOPNE 標(biāo)號(hào)標(biāo)號(hào);(CX0)且不相且不相等時(shí)重復(fù)等時(shí)重復(fù)注意:標(biāo)號(hào)為循環(huán)體的入口。注意:標(biāo)號(hào)為循環(huán)體

47、的入口。循環(huán)控制指令計(jì)數(shù)器必須選擇循環(huán)控制指令計(jì)數(shù)器必須選擇CX。LOOP、LOOPE、LOOPNE用于計(jì)數(shù)器用于計(jì)數(shù)器 循環(huán)控制。每執(zhí)行一次循環(huán)控制。每執(zhí)行一次循環(huán),循環(huán),CX-1。CX=0時(shí)退出循環(huán)。見下例。時(shí)退出循環(huán)。見下例。55【課本例課本例4-6】計(jì)算計(jì)算Y= 201iia解:定義數(shù)組名解:定義數(shù)組名TABL存放存放 a1a20;和存放于單元和存放于單元YY中。中。中間結(jié)果存于寄存器中間結(jié)果存于寄存器AX中。中。BX寄存器為地址指針,寄存器為地址指針,CX寄存器作計(jì)數(shù)器。寄存器作計(jì)數(shù)器。設(shè)設(shè) a1,a2,a20是一組無符號(hào)十六位二進(jìn)制數(shù),并設(shè)是一組無符號(hào)十六位二進(jìn)制數(shù),并設(shè)其和不大于

48、其和不大于2個(gè)字節(jié)個(gè)字節(jié) 。56DATASEGMENTTABL DW A1,A2, . A20YY DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX;-;- MOV AH,4CH INT 21HCODE ENDS END START57MOVAX,0 MOV BX,OFFSET TABL MOV CX,20LOP:ADD AX,BX INC BXINC BX LOOP LOPMOV YY,AX 修改部分修改部分初始化部分初始化部分循環(huán)體循環(huán)體控制部分:循環(huán)控制部分:循環(huán)20次后,次后,CX=0,

49、 退出循環(huán)。退出循環(huán)。581 1、循環(huán)的基本結(jié)構(gòu)、循環(huán)的基本結(jié)構(gòu)A A. .先執(zhí)行,后判斷結(jié)構(gòu)先執(zhí)行,后判斷結(jié)構(gòu)(通常采用計(jì)數(shù)器控制(通常采用計(jì)數(shù)器控制循環(huán)循環(huán) )流程圖如右:流程圖如右:初始化部分初始化部分循環(huán)體循環(huán)體修改部分:修改部分:修改參數(shù)修改參數(shù)控制部分:控制部分:循環(huán)結(jié)束?循環(huán)結(jié)束?出口出口Y YN N入口入口59例:編程統(tǒng)計(jì)數(shù)據(jù)塊中正數(shù)的個(gè)數(shù),并將其送例:編程統(tǒng)計(jì)數(shù)據(jù)塊中正數(shù)的個(gè)數(shù),并將其送 RS單單元中。(繼續(xù)深入:課后習(xí)題元中。(繼續(xù)深入:課后習(xí)題20)解:數(shù)據(jù)塊定義為解:數(shù)據(jù)塊定義為 D1,RS單元存放正數(shù)的個(gè)數(shù),單元存放正數(shù)的個(gè)數(shù),數(shù)據(jù)塊長度用數(shù)據(jù)塊長度用 COUNT表示

50、。表示。BX作地址指針,作地址指針,CX作計(jì)數(shù)器,作計(jì)數(shù)器,DX記錄正數(shù)的個(gè)數(shù)。記錄正數(shù)的個(gè)數(shù)。60START預(yù)置段預(yù)置段RBX D1 DX 0 CX COUNT BX0? DX DX+1BX BX+1 CX CX-1CX=0?RS (DX)ENDNYNY61DATASEGMENT D1 DB -1,-3,5,7,-9,-6,8,4COUNT EQU $-D1RS DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOVAX,DATA MOV DS,AX;-;- MOVAH,4CH INT 21HCODE ENDS END START補(bǔ)碼

51、表示補(bǔ)碼表示:FFH表示當(dāng)前偏移地址表示當(dāng)前偏移地址.詳見課本詳見課本P11762 MOV RS,DX JUSTI:INC BX DEC CX JNZ LOP1MOV BX,OFFSET D1MOV CX,COUNTMOV DX,0LOP1:MOV AL,BX CMP AL,0JLE JUSTIINC DX如果求數(shù)據(jù)塊中大于如果求數(shù)據(jù)塊中大于0的數(shù)之和的數(shù)之和,結(jié)果送結(jié)果送RS單元單元,試修改程序試修改程序.等價(jià)于等價(jià)于LOOP LOP1初始化部分初始化部分循環(huán)體循環(huán)體修改部分修改部分控制部分控制部分63B.先判斷,后執(zhí)行結(jié)構(gòu)(通常采用條件控制循環(huán))先判斷,后執(zhí)行結(jié)構(gòu)(通常采用條件控制循環(huán))流

52、程圖如右流程圖如右初始化部分初始化部分循環(huán)結(jié)循環(huán)結(jié)束?束?循環(huán)體循環(huán)體修改部分修改部分出口出口YN入口入口64【課本例課本例4-7】 AX寄存器中有一個(gè)寄存器中有一個(gè) 16位的二進(jìn)制數(shù),位的二進(jìn)制數(shù),編程統(tǒng)計(jì)其中值為編程統(tǒng)計(jì)其中值為 1的位的個(gè)數(shù),并將結(jié)果存于的位的個(gè)數(shù),并將結(jié)果存于CX中。中。解:解: 由于由于AX有可能有可能為為 0,若,若AX=0則不則不必再往下作統(tǒng)計(jì)工必再往下作統(tǒng)計(jì)工作,因此可采用先作,因此可采用先判斷,后執(zhí)行結(jié)構(gòu)。判斷,后執(zhí)行結(jié)構(gòu)。流程圖如右:流程圖如右:STARTCX0AX=0?AX左移左移CF=0?CX CX+1ENDYNYN65CODE SEGMENTASSUM

53、ECS:CODESTART:NOP;-MOVAX,1100101000111101BXORCX,CXAGAIN:CMPAX,0;建立標(biāo)志位建立標(biāo)志位ZF JZNEXTSHLAX,1JNCAGAIN;判斷判斷CF,CF等于等于0跳轉(zhuǎn)跳轉(zhuǎn)INCCXJMPAGAINNEXT: NOP;-MOVAH,4CHINT21HCODE ENDSEND STARTTEST AX,0FFFFH(AND AX,AX)66例:在一串字符串中查找某一關(guān)鍵字例:在一串字符串中查找某一關(guān)鍵字#,若查到,若查到,記下存放該關(guān)鍵字單元的偏移地址,若找不到用記下存放該關(guān)鍵字單元的偏移地址,若找不到用 -1 作作標(biāo)記。標(biāo)記。解:設(shè)

54、串變量名解:設(shè)串變量名 STRING,關(guān)鍵字單元關(guān)鍵字單元CHAR,關(guān)鍵關(guān)鍵字單元的偏移地址放字單元的偏移地址放 FLAG單元。寄存器單元。寄存器 SI為字符為字符串的地址指針,串的地址指針,CX為字符串長度,為字符串長度,AL用于放關(guān)鍵字用于放關(guān)鍵字#。67STARTSI STRING的的EA CX 串長度串長度 AL #SI=AL?SI=SI+1CX-1=0?FLAG -1ENDFLAG SIYNYN還可用字符串指令實(shí)現(xiàn)還可用字符串指令實(shí)現(xiàn)683、 多重循環(huán)多重循環(huán)循環(huán)體中又有循環(huán)稱多重循環(huán)。循環(huán)體中又有循環(huán)稱多重循環(huán)。 開始開始循環(huán)控制條件循環(huán)控制條件循環(huán)體循環(huán)體結(jié)束結(jié)束循環(huán)控制條件循環(huán)

55、控制條件循環(huán)體循環(huán)體69 程序設(shè)計(jì)過程中常常把多次引用的相同程序段編程序設(shè)計(jì)過程中常常把多次引用的相同程序段編成一個(gè)獨(dú)立的程序段,當(dāng)需要只執(zhí)行這個(gè)程序段時(shí),成一個(gè)獨(dú)立的程序段,當(dāng)需要只執(zhí)行這個(gè)程序段時(shí),可以用調(diào)用指令調(diào)用它。具有這種功能的程序段稱為可以用調(diào)用指令調(diào)用它。具有這種功能的程序段稱為過程過程或或子程序子程序。 適合編成子程序的程序有以下兩大類適合編成子程序的程序有以下兩大類:l程序需要反復(fù)使用,這類程序編成子程序可避免重復(fù)程序需要反復(fù)使用,這類程序編成子程序可避免重復(fù)編寫程序,并節(jié)省大量存儲(chǔ)空間。編寫程序,并節(jié)省大量存儲(chǔ)空間。l 程序具有通用性,這類程序大家都要用到,如鍵盤程序具有通

56、用性,這類程序大家都要用到,如鍵盤管理程序,磁盤讀寫程序,標(biāo)準(zhǔn)函數(shù)程序等。編成子管理程序,磁盤讀寫程序,標(biāo)準(zhǔn)函數(shù)程序等。編成子程序后便于用戶共享。程序后便于用戶共享。4.4.4 子程序子程序701、編寫子程序文件、編寫子程序文件 為了使用戶使用方便,子程序應(yīng)當(dāng)以文件形式編寫。為了使用戶使用方便,子程序應(yīng)當(dāng)以文件形式編寫。一般包含兩部分:一般包含兩部分:(1)子程序說明部分)子程序說明部分(2)子程序程序部分)子程序程序部分子程序用過程定義偽指令子程序用過程定義偽指令(PROC/ENDP)定義,編寫格式如下:定義,編寫格式如下:子程序名子程序名 PROC(NEAR/FAR) RET子程序名子程序

57、名 ENDPNEAR:當(dāng)子程序和調(diào)用:當(dāng)子程序和調(diào)用程序在同一代碼段;程序在同一代碼段;FAR: 當(dāng)子程序和調(diào)用當(dāng)子程序和調(diào)用程序不在同一代碼段。程序不在同一代碼段。71【課本例課本例4-10】編寫子程序,將內(nèi)存為編寫子程序,將內(nèi)存為BUF的緩沖區(qū)清的緩沖區(qū)清0。DATA SEGMENT BUF DB 20H DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASUPROC FARPUSH DSMOV AX,0PUSH AXMOV AX,DATA MOV DS,AX;-;-RETSUENDPCODE ENDS END SU MOV BX,OFFSE

58、T BUF LP: MOV BX,0 INC BX CMP BX,20H JNZ LP72(2)調(diào)用子程序時(shí)寄存器及所用存儲(chǔ)單元內(nèi)容的保護(hù)。調(diào)用子程序時(shí)寄存器及所用存儲(chǔ)單元內(nèi)容的保護(hù)。 如果子程序中要用到某些寄存器或存儲(chǔ)單元時(shí),如果子程序中要用到某些寄存器或存儲(chǔ)單元時(shí),為了不破壞原有的信息,要將寄存器或存儲(chǔ)單元的原為了不破壞原有的信息,要將寄存器或存儲(chǔ)單元的原有內(nèi)容壓棧保護(hù)或存入子程序不用的寄存器或存儲(chǔ)單有內(nèi)容壓棧保護(hù)或存入子程序不用的寄存器或存儲(chǔ)單元中。元中。2、子程序使用中的問題、子程序使用中的問題(1)子程序的調(diào)用和返回子程序的調(diào)用和返回 主程序調(diào)用子程序主程序調(diào)用子程序 是通過是通過C

59、ALL指令來實(shí)現(xiàn),指令來實(shí)現(xiàn),子程序執(zhí)行后,通過子程序執(zhí)行后,通過RET指令返回主程序。指令返回主程序。73 為程序員編寫匯編語言源程序時(shí)提供方便,為程序員編寫匯編語言源程序時(shí)提供方便,MS-DOS系統(tǒng)中設(shè)置了幾十個(gè)內(nèi)部子程序,可供用戶調(diào)用。系統(tǒng)中設(shè)置了幾十個(gè)內(nèi)部子程序,可供用戶調(diào)用。調(diào)用時(shí)需要使用軟中斷指令:調(diào)用時(shí)需要使用軟中斷指令: INT n 為軟中斷調(diào)用的類型號(hào),其中為軟中斷調(diào)用的類型號(hào),其中DOS功能子程序功能子程序的調(diào)用使用中斷指令的調(diào)用使用中斷指令“INT 21H”,它共有它共有80多個(gè)功多個(gè)功能子程序,可完成磁盤讀寫控制,文件管理,存儲(chǔ)管能子程序,可完成磁盤讀寫控制,文件管理,

60、存儲(chǔ)管理,基本輸入理,基本輸入/輸出管理等功能。輸出管理等功能。 調(diào)用調(diào)用21H類型功能子程序時(shí)需要用以下方式:類型功能子程序時(shí)需要用以下方式:l傳送入口參數(shù)到指定寄存器中傳送入口參數(shù)到指定寄存器中l(wèi)調(diào)用的功能號(hào)送入調(diào)用的功能號(hào)送入AH寄存器寄存器lINT 21H4.4.5 5 DOSDOS功能調(diào)用功能調(diào)用74n帶顯示的鍵盤輸入單字符帶顯示的鍵盤輸入單字符(1號(hào)功能號(hào)功能):輸入字符的輸入字符的ASCII碼存碼存入入AL,并在屏幕上顯示該字符。并在屏幕上顯示該字符。格式:格式: MOV AH,01H INT 21H ; n不帶顯示的鍵盤輸入單字符不帶顯示的鍵盤輸入單字符(8號(hào)功能號(hào)功能): 同

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論