微機原理課件第四章-匯編語言程序設計_第1頁
微機原理課件第四章-匯編語言程序設計_第2頁
微機原理課件第四章-匯編語言程序設計_第3頁
微機原理課件第四章-匯編語言程序設計_第4頁
微機原理課件第四章-匯編語言程序設計_第5頁
已閱讀5頁,還剩117頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、微型計算機原理及其應用第四章:匯編語言程序設計1第四章 匯編語言程序設計匯編語言程序格式偽指令語句DOS系統(tǒng)功能調(diào)用和BIOS中斷調(diào)用程序設計方法2匯編語言是利用指令的助記符、符號地址、標號來編寫的語言。用匯編語言編寫的程序稱為匯編語言源程序;把匯編語言源程序翻譯成由機器代碼組成的目標程序的過程稱為匯編;用來把匯編語言源程序自動翻譯成目標程序的軟件叫匯編程序。 3計算機語言可分為機器語言、匯編語言、高級語言三類。機器語言是計算機唯一能識別的語言(二進制語言)匯編語言是面向機器的語言,不同的CPU有不同的匯編語言(PC機匯編、單片機匯編) 優(yōu)點:直接針對硬件操作,效率高,節(jié)省內(nèi)存,運行速度快,實

2、時性能好。高級語言是面向過程的語言:如Basic、c、Pascal目前流行的面向?qū)ο蟮恼Z言:VB、VC、C#8086系統(tǒng)中常用的匯編程序: 宏匯編程序MASM4【例】顯示輸出“This is a sample program.”DATA SEGMENT ;數(shù)據(jù)段DA1 DB This is a sample program. DB 0DH,0AH, ;回車符和換行符的ASCII碼DATA ENDS STACK SEGMENT STACK STACK;堆棧段 ST1 DB 100 DUP(?) ;定義100個空的字節(jié)單元STACK ENDSCODE SEGMENT ;代碼段 ASSUME CS:

3、CODE,DS:DATA,SS:STACK ;段分配MAIN PROC FAR ;主過程開始START: MOV AX,STACK ;初始化SS MOV SS,AX5 PUSH DS ;為返回DOS設置堆棧 MOV AX,0 PUSH AX MOV AX,DATA ;初始化DS MOV DS,AX MOV AH,9 ;9號調(diào)用,顯示字符串,以結束 MOV DX,OFFSET DA1 INT 21H RET ;返回DOSMAIN ENDP ;主過程結束CODE ENDS ;代碼段結束 END START ;源程序結束6【例】顯示輸出“Hello!”DATA SEGMENT ;數(shù)據(jù)段STRING

4、DB Hello!, DATA ENDS CODE SEGMENT ;代碼段 ASSUME CS:CODE,DS:DATA ;段分配START: MOV AX,DATA ;初始化DS MOV DS,AX MOV AH,9 ;9號調(diào)用,顯示字符串,以結束 MOV DX,OFFSET STRING INT 21H MOV AH,4CH ;返回DOS INT 21HCODE ENDS ;代碼段結束 END START ;源程序結束7由例程看出:(1)8086匯編源程序具有分段結構 段名 SEGMENT 段名 ENDS 在源程序中各段的順序可以任意,段的數(shù)目可根據(jù)需要確定(至少有一個代碼段),原則上不

5、受限制。而每個段又是由若干語句組成,語句是匯編語言源程序的基礎。(2)CS不能人為設置,其它段寄存器的初始化需兩條指令完成(MOV AX,DATA MOV DS,AX)。8(3)兩種返回DOS的方法:MAIN PROC FAR ;將主程序建立為過程 PUSH DS ;將DOS段值和偏移量(0)入棧 MOV AX,0 PUSH AX RET ;返回DOS(將0和DOS段值IP、CS) MAIN ENDP ;主過程結束使用4CH號的DOS系統(tǒng)功能調(diào)用 MOV AX,4C00H(或MOV AH ,4CH) INT 21H(4)全部源程序用END偽指令結束。9MASM中可使用的語句分成兩類:指令性語句

6、和偽指令語句。一、指令性語句特點:與機器指令相對應,匯編時產(chǎn)生目標代碼。標號:指令助記符 操作數(shù),操作數(shù) ;注釋標號:表示本指令語句的符號地址,后跟冒號“:”,用作轉(zhuǎn)移的目標地址;指令助記符:指出指令的操作類型,由英文字母縮寫而成;操作數(shù):指明參加指令運算的數(shù)據(jù),有無操作數(shù)、單操作數(shù)和雙操作數(shù)之分,其中雙操作數(shù)之間用逗號“,”分隔,操作數(shù)與指令助記符之間用空格隔開;注釋:用來說明一條指令或一段程序的功能,前面以分號“;”為標記,匯編程序?qū)ψ⑨尣贿M行匯編,增加可讀性其中指令助記符是關鍵字,不可省略,其余部分均可省略。4-1 匯編語言程序格式10二、偽指令語句特點:沒有對應的機器指令(本身不產(chǎn)生目

7、標代碼),只為匯編程序提供匯編信息。格式: 名字 偽指令指示符 操作數(shù),操作數(shù) ;注釋名字:給偽指令取的名稱,用符號地址表示,名字后不帶冒號“:”,只用空格符與偽指令指示符相分隔;偽指令指示符:是MASM規(guī)定的符號,明確不同的操作;操作數(shù):規(guī)定同指令性語句,區(qū)別在于操作數(shù)可能多于2個;注釋:規(guī)定同指令性語句其中不可省略的部分是偽指令指示符,其余均可缺省。三、數(shù)據(jù)項操作數(shù)的三種基本數(shù)據(jù)項:常數(shù)、變量、標號11常量:固定值,不能改變 a.數(shù)字常數(shù):字母后綴B、Q(或O)、D可省略、H b.字符串常數(shù):ABCASCII碼字節(jié)序列41H、42H、43H c.符號常數(shù):COUNT EQU 100變量:某

8、操作數(shù)據(jù)所存放單元的符號地址,在CS以外的其它段由DB、DW等定義標號:某條指令所存放單元的符號地址,在CS中定義變量和標號均具有三種屬性:a.段值(SEGMENT):可用分析運算SEG取出b.段內(nèi)偏移地址(OFFSET):可用分析運算OFFSET取出c.類型(TYPE):可用分析運算TYPE取出 變量:每個元素所包含的字節(jié)數(shù),有BYTE、WORD和DWORD三種類型。 標號:可轉(zhuǎn)移的距離(或距離屬性),有NEAR和FAR兩種。12四、MASM中的表達式表達式由運算對象和運算符組成,在匯編過程中完成表達式運算。其中運算對象可以是常數(shù)、變量、標號、寄存器等。1.算術運算符(運算對象和運算結果均為

9、整數(shù))包括:+、- 等,常用于地址運算。注:兩符號地址相減表示某符號地址占用的內(nèi)存字節(jié)數(shù)。【例】ARRAY DB 1,2,3,4,5,6,7,8 TRY DB 20 MOV CX,TRY-ARRAY 匯編后: MOV CX,8 132.邏輯運算符(按位運算)包括:AND、OR、NOT、XOR例:AND AL, 8FH AND 73H 運算符,匯編過程中完成 指令助記符,程序執(zhí)行時完成。3.關系運算符包括:EQ、NE(不等)、LT(小于)、GT(大于)、LE()、GE() a.結果為真,輸出全1(字節(jié)運算為OFFH或字運算為OFFFFH) b.結果為假,輸出全0【例】 MOV AX,10H GE

10、 16匯編后:MOV AX,0FFFFH144.數(shù)值返回運算符(或分析運算符) 功能:返回運算對象的某個參數(shù)值。包括:SEG、OFFSET、TYPE、LENGTH、SIZESEG 變量或標號 ;取段基址 常用法:MOV AX,SEG M1(或用段名) MOV DS, AXOFFSET 變量/標號 ;取偏移地址值 常用法:MOV BX,OFFSET DA1 ;設地址指針 LEA BX,DA1TYPE 變量/標號 ;取類型屬性 變量返回1(DB)、2(DW)、4(DD)等 標號返回-1(NEAR)、-2(FAR) (0FFH) (0FEH)15DATASEGMENT;定義數(shù)據(jù)段VAR1 DB 10

11、H,18H,25H,34H;定義字節(jié)數(shù)據(jù)VAR2 DW 2300H,1200H ;定義字數(shù)據(jù)VAR3 DD 11002200H,33004400H ;定義雙字數(shù)據(jù)DATAENDS;數(shù)據(jù)段結束設DATA段起始于物理地址30000H處,則MOV BX,SEG VAR1 匯編成: MOV BX,3000HMOV CX,SEG VAR2 匯編成: MOV CX,3000HMOV DX,SEG VAR3 匯編成: MOV DX,3000HMOV BX,OFFSET VAR1 匯編成: MOV BX,0000HMOV CX,OFFSET VAR2 匯編成: MOV CX,0004HMOV DX,OFFSE

12、T VAR3 匯編成: MOV DX,0008H16【例】A1 DB 20H,30H A2 DW 0438H A3 DD ? L1: MOV AH,TYPE A1 MOV BH,TYPE A2 MOV AL,TYPE A3 MOV BL,TYPE L1匯編后:MOV AH,1 MOV BH,2 MOV AL,4 MOV BL,0FFH17LENGTH 變量 ;返回重復操作符DUP之前的重復次數(shù),若不是由DUP定義,則都返回1。SIZE 變量 ;返回該變量包含的總字節(jié)數(shù)。 SIZE=LENGTH*TYPE注:SEG、OFFSET、TYPE可用于變量和標號前,返回三種屬性值;而LENGTH和SIZ

13、E只對變量才有效?!纠縈1 DW 100 DUP (?) M2 DW 1,2,3 M3 DB A B C D MOV CX,LENGTH M1 MOV BL,LENGTH M2 MOV AL,LENGTH M318匯編后: MOV CX,100 MOV BL,1 MOV AL,1 若指令改為: MOV CX,SIZE M1 MOV BL,SIZE M2 MOV AL,SIZE M3 則匯編后: MOV CX,200 MOV BL,2 MOV AL,1195.修改屬性運算符(綜合運算符)功能:修改變量/標號的三種屬性段操作符:修改段基址與偏移地址來源的默認關系,格式如下:段前綴:變量或地址表達

14、式例:MOV AX ,ES:BXPTR:對變量/標號賦予新的屬性,以保證操作數(shù)類型的匹配,常與BYTE、WORD、NEAR、FAR等連用。格式:新類型 PTR 變量/標號例:MOV BX,10H ;匯編時提示錯誤 MOV BYTE PTRBX,10H ;BX10H MOV WORD PTRBX,10H ;BX,BX+10010H20例:N1 DB 15H,36H N2 DW 1122H,3344H MOV AX, WORD PTR N1 執(zhí)行后:AX=3615H MOV BL, BYTE PTR N2 執(zhí)行后:BL=22H MOV AX, WORD PTR N1+1 執(zhí)行后:AX=2236H注

15、:若符號地址出現(xiàn)在操作數(shù)中,其類型為DB、DW所定義的類型(如直接尋址、寄存器相對尋址、相對基址變址尋址),如類型不匹配匯編時提示W(wǎng)arning Error:Operand types must match 或 Illegal size for operand;若存儲器操作數(shù)中不包含符號地址(如寄存器間接尋址等),則該操作數(shù)的類型不確定,指令中的另一操作數(shù)必須明確類型,否則匯編時提示Severe Error:Operand must have size.例:LEA BX,N1之后CMP BX,10H 或 INC BX均出錯。21THIS:對變量/標號賦予新的屬性,且該變量或標號的段地址和偏移地

16、址與下一個存儲單元的地址相同。格式:變量/標號 EQU THIS 類型 例:FIRST EQU THIS BYTE TABLE DW 200 DUP(?) TABLE為字類型,FIRST為字節(jié)類型,兩者地址相同。(該數(shù)據(jù)區(qū)具有雙重類型屬性) MOV AL , FIRST MOV AX , TABLE 均正確。SHORT:說明轉(zhuǎn)向地址為短轉(zhuǎn)移(8位位移量) 格式:SHORT 標號例:JMP SHORT LP MOV -128+127之間LP: MOV226.其它運算符 方括號 a.表示地址表達式例:M1 DB 10H,20H,30H,40H M2 DW 1234H,5678H,9ABCH MOV

17、 BX,OFFSET M1 MOV CL,BX ;10HCL MOV BX,OFFSET M2 MOV DX,BX+2 ; M2的第二個單元5678HDX b.表示多重變量的下標值(下標從0開始算)例:MOV CX,M20 ;1234HCX MOV M21,CX ;CXM2的第二個單元,覆蓋5678H234-2 偽指令語句特點:無對應的機器代碼,在匯編期間進行處理 (不是由CPU執(zhí)行) (為匯編程序提供匯編信息)一、數(shù)據(jù)定義語句功能:為一個數(shù)據(jù)項分配存儲單元,用一個符號名與這個存儲單元相聯(lián)系,且為此存儲單元提供任意初始值。例:ARRAY DB 1,2,4 則ARRAY記為第一個字節(jié)的偏移地址該

18、偽指令助記符有:DB 定義字節(jié) DW 定義字 DD 定義雙字241、操作數(shù)是常數(shù)或表達式,可以為數(shù)據(jù)或地址 DA DW 1122H,34H,5*20H2、操作數(shù)為字符串,字符串必須用單引號括起來 STR1 DB OK STR2 DW OK注:字符串一般用DB定義,有時2個字符可用DW定義3、可用?保留空單元(分配內(nèi)存單元但不初始化) M1 DB ? M2 DW 1234H,?4、用重復操作符DUP初始化重復數(shù)據(jù)格式:DB(或DW) 重復次數(shù) DUP(重復內(nèi)容)注:DUP可嵌套 ARR DW 3 DUP(1,2 DUP(0),2) ;變量共占 ?個字節(jié)單元2425二、表達式賦值語句(不占用內(nèi)存)

19、1、賦值語句 EQU格式:符號名 EQU 表達式(表達式應有確定值) COUNT EQU 100EQU左邊的名字等價于右邊的表達式2、等號語句 = COUNT = 100與EQU語句具有相同功能。區(qū)別:EQU中的符號名不允許重復定義,應先用PURGE語句解除,而“=”偽指令可以。例:C1 EQU 100 PURGE C1 ;C1不再代表100 C1 EQU 20026三、段定義語句1、段定義語句 SEGMENTENDSSEGMENT和ENDS必須成對使用,將源程序分段。段名 SEGMENT 定位類型 組合類型 分類名 段名 ENDS在SEGMENT和ENDS之間,對于數(shù)據(jù)段、附加段和堆棧段中,

20、一般是一些偽指令;而對于代碼段,主要是指令序列和偽指令。27(1)定位類型:對段起始地址定位此參數(shù)一般缺省,缺省值為PARA,表示段起始地址必須在節(jié)的整數(shù)邊界(存儲空間從0開始,每16個存儲單元叫一節(jié))。(2)組合類型:提出各個邏輯之間的組合方式此參數(shù)在堆棧段中不可缺省,用STACK指定該段為堆棧段。而在其它段中一般缺省,缺省值為NONE,表示該段與其它同名段不進行連接,各段獨立存在于存儲器中。(3)分類名此參數(shù)一般缺省,主要作用是匯編程序連續(xù)時將所有分類名相同的邏輯段組成一個段組。282、段分配語句(ASSUME)ASSUME CS:CODE ,DS:DATA ,SS:STACK ,ES:E

21、XTRA該語句不可省略,一般放在代碼段的開始。用來建立4個段寄存器(CS、DS、ES、SS)與程序中所取段名(位于SEGMENT和ENDS之前)之間的對應關系。但ASSUME語句只指定某個段分配給哪個段寄存器,它并不能把段基址裝入段寄存器中,故DS、ES、SS的具體值還必須分別通過兩條MOV指令得到(如初始化SS,還應加上SP的初始化),但CS的賦值是在程序初始化時自動完成的。29總結:分段程序的兩種完整段定義格式(1)DATA SEGMENT ;數(shù)據(jù)段 DATA ENDS STACK SEGMENT STACK ;堆棧段 STT DW 100 DUP(?) TOP EQU SIZE STT

22、STACK ENDS CODE SEGMENT ;代碼段 ASSUME CS:CODE,DS:DATA,SS:STACK ;段分配 MAIN PROC FAR ;主過程 START: MOV AX , STACK ;初始化SS和SP MOV SS , AX MOV SP , TOP DW 100 DUP (?)TOP EQU $30 PUSH DS ;為返回DOS設置堆棧 MOV AX ,0 ;(XOR AX,AX),(AND AX,0) ;(SUB AX,AX) PUSH AX MOV AX ,DATA ;初始化DS MOV DS ,AX RET ;返回DOSMAIN ENDPCODE EN

23、DS END START31(2)前面兩個段相同 CODE SEGMENT ASSUME START: 段寄存器及SP初始化 MOV AH ,4CH ;利用4CH號DOS系統(tǒng) INT 21H ;功能調(diào)用返回DOS CODE ENDS END START32例:兩個16位無符號二進制數(shù)相乘。DATA SEGMENTD1 DW 1234HD2 DW 5678HP1 DD ?P2 DD ?DATA ENDSSTACK SEGMENT STACKSTT DB 100 DUP (?)TOP EQU SIZE STT STACK ENDSCODE SEGMENT ASSUME CS:CODE,SS:STA

24、CK,DS:DATA33START:MOV AX,STACK MOV SS,AX MOV SP,TOP MOV AX,DATA MOV DS,AXL1: MOV AX,D1 MUL D2 MOV BX,OFFSET P1 MOV BX,AX MOV BX+2,DX MOV AH,4CH INT 21HCODE ENDS END START34四、過程定義語句(子程序定義語句)格式:過程名 PROC NEAR或FAR RET 過程名 ENDPa.每定義一個過程,PROC和ENDP要成對出現(xiàn),兩者前面的過程名應一致。b.主、子程序在同一代碼段中,則定義為NEAR型(或缺省) 主、子程序不在同一代碼

25、段中,則定義為FAR型; 一般可將主程序定義為FAR屬性(主過程作為DOS調(diào)用的一個遠端子過程)c.要調(diào)用一個過程,在主調(diào)函數(shù)中用CALL 過程名,而過程返回必須通過RET語句。35例:用過程調(diào)用的方法,將內(nèi)存中4個BCD碼相加。DATA SEGMENTONE DB 22H,33H,44H,55HTWO DB 55H,66H,77H,88HSUM DB 20 DUP (?)DATA ENDSSTACK SEGMENT STACKSTT DB 100 DUP (?)TOP EQU SIZE STTSTACK ENDSCODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:

26、DATA,ES:DATASTART:MOV AX,STACK MOV SS,AX MOV SP,TOP36 MOV AX,DATA MOV DS,AX MOV ES,AX MOV SI,OFFSET ONE ;設置地址指針 MOV BX,OFFSET TWO MOV DI,OFFSET SUM CLD ;清方向標志 CLC ;清進位標志 MOV CX,4 ;循環(huán)次數(shù)LL: CALL ABC LOOP LL MOV AH,4CH INT 21H37ABC PROC NEAR ;完成單字節(jié)數(shù)據(jù)加法運算 LODSB ;DS:SIAL,SI+1SIL1: ADC AL,BX ;帶進位相加 DAA ;十

27、進制調(diào)整 STOSB ;ALES:DI,DI+1DI INC BX ;修改指針 RETABC ENDPCODE ENDS END START38五、程序開始和結束語句1.NAME:為源程序目標模塊賦名字格式:NAME 程序名一般放在程序開始,列表文件將打印此程序名,如缺省NAME語句,匯編程序?qū)⒃次募髂繕四K的名字。2.ORG:定位偽指令格式:ORG 表達式(值為065535)功能:表示下面存儲單元的偏移地址從表達式的值開始排。即程序和數(shù)據(jù)要從某一個特定的地址開始存放。注:一般,段內(nèi)的EA是從段名SEGMENT以下,以0作為開始,以后每分配一個字節(jié),EA加1。若要給某變量或標號設置特定的起

28、始偏移地址,可用ORG語句。 39例:DATA SEGMENT ORG 100H A1 DB 10H,20H,30H ORG 200H A2 DB 40H,50H,60H DATA ENDS3.END:源程序結束語句格式:END 標號:標號為程序中第一條指令的起始地址,可以缺省。放在源程序最后一行,告訴匯編程序,源程序到此結束,此后的內(nèi)容將被認為不屬于本程序的范疇。 40匯編語言中經(jīng)常地址計數(shù)器的值。(P150)注:地址計數(shù)器用來保存當前指令或數(shù)據(jù)的偏移地址。其值可用“”來引用,“”的值是動態(tài)變化的。常用于堆棧段的長度定義,以便于設置堆棧指針。例: ORG 1000H ABC DW 1,2,+

29、4,ODH,OAH,+3設定ABC的偏移地址為1000H,則第一個“”代表1004H,而第二個“”代表100AH。 上述語句等價于 ABC DW 1,2,1008H,ODH,OAH,100DH例:STACK SEGMENT DW 100 DUP(?) TOP EQU STACK ENDS MOV SP,TOP ;代碼段中初始化堆棧指針SP41六、高檔微機增加的偽指令1、常用偽指令(1) .386 選擇80386指令系統(tǒng)(2) .EXIT 返回DOS(3) .MODEL 選擇編程模型(4) .STARTUP 指示程序的開始(包括段寄存器初始化)2、匯編語言的兩種編程格式完整的段定義模型常用模型S

30、MALL,包含兩個段:64KB的代碼段和64KB的數(shù)據(jù)段。42例:將存儲塊LIST1中100個字節(jié)的內(nèi)容復制到存儲塊LIST2中。.MODEL SMALL ;小模型.386 ;選擇80386指令系統(tǒng).STACK 100H ;定義堆棧段.DATA ;定義數(shù)據(jù)段LIST1 DB 100 DUP (?)LIST2 DB 100 DUP (?).CODE ;定義代碼段.STARTUP ;說明程序的起點,初始化DS、SSCLDMOV SI,OFFSET LIST1MOV DI,OFFSET LIST2MOV CX,100REP MOVSB.EXIT 0 ;返回DOS(返回0,表示無錯誤)END43操作系

31、統(tǒng)(OS)包括DOS、WINDOWS、UNIX等。操作系統(tǒng)是用戶和PC機之間的接口,用戶依靠操作系統(tǒng)來使用PC機。DOS系統(tǒng)設置了兩層內(nèi)部子程序(供用戶使用)基本輸入輸出系統(tǒng)BIOS(OS的核心)主要功能:驅(qū)動系統(tǒng)所配置的外部設備采用BIOS功能調(diào)用(INT 10HINT 1AH)DOS層的功能模塊(DOS系統(tǒng)功能調(diào)用)主要功能:文件管理、存儲管理、作業(yè)管理、設備管理等原理:通過BIOS使用外部設備,但功能較BIOS弱。(INT 21H)一、DOS系統(tǒng)功能調(diào)用簡述按功能分為六組:1.字符I/O管理 2.傳統(tǒng)的文件管理(磁盤)3.擴充的文件管理(目錄、文件) 4.內(nèi)存管理(內(nèi)存)5.作業(yè)管理(終

32、止、裝入等) 6.其它資源管理(日期、時間等)4-3 DOS系統(tǒng)功能調(diào)用和BIOS中斷調(diào)用44二、DOS系統(tǒng)功能調(diào)用(88種功能,系統(tǒng)功能號00H57H)調(diào)用格式分四步:系統(tǒng)功能號AH置入口參數(shù)執(zhí)行中斷指令INT 21H分析出口參數(shù)。三、常用的DOS系統(tǒng)功能調(diào)用1. 01H號調(diào)用:讀取鍵盤單字符并回顯調(diào)用方式:MOV AH ,1 INT 21H注:無入口參數(shù) 出口參數(shù):所按鍵字符對應的ASC碼AL45【例】交互式程序中用戶按下1,2,3,程序轉(zhuǎn)入相應的服務子程序,若按下其它鍵就繼續(xù)等待。KEY: MOV AH,1 ;讀入鍵值AL INT 21H CMP AL,1 ;按下數(shù)字鍵1? JE ONE

33、 CMP AL,2 ;按下數(shù)字鍵2? JE TWO CMP AL,3 ;按下數(shù)字鍵3? JE THREE JMP KEY ;等待鍵入正確數(shù)字ONE: TWO: THREE: 462. 02H調(diào)用:顯示單字符調(diào)用方式: MOV DL ,待顯示字符的ASC碼 MOV AH ,2 INT 21H 注:出口參數(shù)是把字符顯示在屏幕上。3. 09H號調(diào)用(字符串輸出顯示)調(diào)用方式:DS:DX待顯示字符串的首地址 MOV AH ,9 INT 21H注:待顯示字符串必須以“”字符結束,且“”不顯示,只作為結束標志。47【例】在屏幕上顯示HOW ARE YOU!,且光標換行。 CR EQU 0DH ;回車符AS

34、CII碼 LF EQU 0AH ;換行符ASCII碼 MES DB HOW ARE YOU!,CR,LF,$ MOV DX,OFFSET MES MOV AH,9 INT 21H4. OAH號調(diào)用(字符串輸入)調(diào)用方式:DS:DX接收字符的輸入緩沖區(qū)首地址 MOV AH ,OAH INT 21H注:a.直到回車符結束48b.緩沖區(qū)第一個字節(jié)為此區(qū)能接收字符的個數(shù);第二個字節(jié)保留(用“?”初始化),用作填寫實際字符個數(shù);從第三個字節(jié)開始順序存放鍵盤輸入的字符。c.如實際輸入字符數(shù)定義的字節(jié)數(shù),緩沖區(qū)其余字節(jié)補零?!纠块_辟一個緩沖區(qū)接收從鍵盤輸入的字符串,將輸入的字符數(shù)存入CL寄存器,并將指針指

35、向第一個字符。 BUFF DB 100 ;緩沖區(qū)大小 DB ? ;實際輸入字符數(shù) DB 100 DUP(?) ;順序存放輸入字符 MOV DX,OFFSET BUFF MOV AH,0AH INT 21H MOV BX,DX MOV CL,BX+1 ;取字符數(shù) ADD BX,2 ;指針指向第一個字符5. 4CH號調(diào)用:返回操作系統(tǒng)調(diào)用方式:MOV AH ,4CH INT 21H注:無入口參數(shù)494-4 程序設計方法匯編語言設計基本要求:結構化、簡明、易讀、易調(diào)試執(zhí)行速度快占用的存儲空間少 在結構化程序設計中,提倡采用的基本結構形式是:順序結構、分支結構、循環(huán)結構、子程序結構。一、順序結構一般為

36、簡單程序,由上而下順序執(zhí)行每條指令無分支,無循環(huán),無轉(zhuǎn)移,又稱為直線程序順序程序結構是各種其它程序結構中的局部程序段50【例】內(nèi)存中TABLE開始存放09的平方值,通過人機對話,當任意輸入09,查表得出平方值,放在AL中。.MODEL SMALL.386.STACK 100H.DATATABLE DB 0,1,4,9,16,25,36,49,64,81BUF DB Input one number(09),ODH,0AH,$.CODE.STARTUPLEA DX,BUF ;顯示提示字符串MOV AH,9INT 21H51MOV AH,1 ;等待鍵入INT 21HAND AL,0FH ;屏蔽AL

37、高4位,低4位不變MOV BX,OFFSET TABLEMOV AH,0ADD BX,AXMOV AL,BX.EXIT 0ENDXLAT TABLE52二、分支結構分支結構有兩種形式: 雙分支結構和多分支結構條件?分支程序段1分支程序段2YN條件?程序段1程序段n程序段2條件1條件2條件n圖a:雙分支圖b:多分支531、雙分支結構雙分支結構一般由四個部分組成:產(chǎn)生條件:用于比較、判斷的指令CMP、SUB、TEST、AND、CMPSB/W 、SCASB/W、移位指令(如判AX中有多少個“1”)等只要能影響PSW中的一個或多個標志。測試:條件轉(zhuǎn)移指令JC、JA、JG等定向:根據(jù)條件,決定程序的不同

38、走向(條件滿足或不滿足,程序轉(zhuǎn)移或不轉(zhuǎn)移即順序執(zhí)行)標號:用來指定分支后的轉(zhuǎn)移地址。應注意統(tǒng)一出口:某個分支結束后用JMP指令跳過另一分支。2、多分支結構一次判斷可引出兩個分支,故N個分支,需N-1次判斷。按條件的先后,依次分解成一串雙分支結構,然后使用雙分支的方法進行程序設計。實質(zhì)是用一連串的條件轉(zhuǎn)移指令來實現(xiàn)。54【例】存儲器中有一串字符串首址為BUF,字符串長度N小于256,要求分別計算出其中數(shù)字、大寫字母和其它字符的個數(shù),存放在字符串的下面三個單元中。解:本題根據(jù)字符的ASCII碼值范圍進行判斷,大寫字母 41H5AH,數(shù)字30H39H。.MODEL SMALL.386.STACK 1

39、00H.DATA BUF DB 7 DB 01H,38H,47H,90H,33H,09H,76H NUM DB 3 DUP (?).CODE.STARTUP55 MOV CH,BUF ;數(shù)組個數(shù)CH MOV BX,1 MOV DX,0 ;DH計數(shù)字個數(shù),DL計字母個數(shù)LP: MOV AH,BUFBX ;第一次取01HAH CMP AH,30H JL NEXT ;小于0轉(zhuǎn)(用JB最佳) CMP AH,39H JG ABC ;大于9轉(zhuǎn)(用JA最佳) INC DH ;數(shù)字個數(shù)+1 JMP NEXTABC: CMP AH,41H JL NEXT ;小于A 轉(zhuǎn) CMP AH,5AH JG NEXT ;大

40、于Z轉(zhuǎn) INC DL ;字母個數(shù)+156NEXT: INC BX ;數(shù)組地址+1 DEC CH ;計數(shù)-1 JNZ LP ;不為0跳轉(zhuǎn)繼續(xù) MOV NUM,DH ;數(shù)字個數(shù)送入內(nèi)存單元 MOV NUM+1,DL ;字母個數(shù)送入內(nèi)存單元 MOV AH,BUF SUB AH,DH ;計算其它字符個數(shù) SUB AH,DL MOV NUM+2,AH ;其它字符個數(shù)送入內(nèi)存單元.EXIT 0END57【例】設有首地址為BUFFER的數(shù)據(jù),已按升序排好,字組的長度N(=10),在該數(shù)組中查找數(shù)M(=80),若找到它則從數(shù)組中刪掉,若找不到將它插入正確的排列位置,DX中記錄數(shù)組最后的長度。DATA SEGM

41、ENTBUFFER DW 5,10,32,47,53,77,89,106,115,124N DW 10M EQU 80DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATAMAIN PROC FARSTART: PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV ES,AX58 MOV AX,M ;待查數(shù)AX MOV CX,N ;計數(shù)CX MOV DX,N ;數(shù)組長度 MOV DI,OFFSET BUFFER CLDREPNE SCASW ;串掃描查找 JE DEL ;找到ZF=1 DEC

42、 DX ;未查到,此數(shù)插入正確位置 MOV SI,DX ;定位到BUFFER最后一個數(shù) ADD SI,DXL1: CMP AX,BUFFERSI ;關鍵字從后向前比較 JL L2 ;關鍵字比數(shù)組中某個字小 MOV BUFFERSI+2,AX ;否則插在后面 JMP L3 59L2: MOV BX,BUFFERSI ;數(shù)組后移一個數(shù) MOV BUFFERSI+2,BX SUB SI,2 ;指針前移一個數(shù) JMP L1L3: ADD DX,2 ;修改長度 JMP NEXT1DEL: JCXZ NEXT ;找到,且為最后一個數(shù),刪此元素DEL1: MOV BX,DI ;其后元素依次前移 MOV DI

43、-2,BX ADD DI,2 LOOP DEL1NEXT: DEC DX ;改變數(shù)組長度NEXT1:RETMAIN ENDPCODE ENDS END START60三、循環(huán)結構1. 循環(huán)結構有兩種結構形式a. “先執(zhí)行,后判斷”結構(直到型) : 至少執(zhí)行一次循環(huán)體(不允許零次循環(huán)); 適合于循環(huán)次數(shù)固定的程序b. “先判斷,后執(zhí)行”結構(當型) : 循環(huán)體可能一次也不執(zhí)行(允許零次循環(huán)) ; 適合于循環(huán)次數(shù)不固定的程序61入口入口初始化部分初始化部分循環(huán)體修改參數(shù)循環(huán)控制出口循環(huán)控制循環(huán)體修改參數(shù)”先執(zhí)行,后判斷“結構”先判斷,后執(zhí)行“結構62循環(huán)結構包括四部分:(1)初始化:為循環(huán)做準備

44、,建立指針,設置循環(huán)計數(shù)器,設置其它變量的初值(2)循環(huán)體:循環(huán)部分的核心,完成循環(huán)的基本操作(3)修改參數(shù):修改地址指針,為下次循環(huán)作準備(4)循環(huán)控制:修改計數(shù)器值,判斷循環(huán)控制條件,決定是否繼續(xù)循環(huán)632. 循環(huán)程序的控制方法 核心問題:循環(huán)的控制(1)計數(shù)控制法(已知循環(huán)次數(shù))正計數(shù)法:計數(shù)器初值為0,遞增,與終值比較倒計數(shù)法:計數(shù)器初值設為循環(huán)次數(shù),遞減,直到減為0為止,一般用LOOP完成,或用DEC和JNZ聯(lián)用實現(xiàn)。(2)條件控制法(循環(huán)次數(shù)未知)每執(zhí)行一次循環(huán)體后判斷一次循環(huán)條件,滿足循環(huán)條件,繼續(xù)循環(huán);不滿足則結束循環(huán)。一般在數(shù)據(jù)或表格處理中常在末尾添加一個特殊的結束標志。64

45、【例】將BX中的16進制數(shù)轉(zhuǎn)換為ASCII碼,存放到BUF開始的內(nèi)存單元中去,并在屏幕顯示出數(shù)值。 MOV SI,OFFSET BUF ;設置地址指針 MOV CH,4 ;計數(shù)初值=4NEXT: MOV CL,4 ;最高位移到右邊 ROL BX,CL MOV AL,BL ;轉(zhuǎn)換成ASCII碼 AND AL,0FH ADD AL,30H CMP AL,3AH ;字符為AF嗎? JL STORE65 ADD AL,7STORE:MOV SI,AL ;字符存入內(nèi)存 MOV AH,2 ;顯示單字符 MOV DL,AL INT 21H INC SI DEC CH ;修改計數(shù)并判斷 JNZ NEXT HL

46、T ;循環(huán)結束此題采用“先執(zhí)行,后判斷”的結構。66【例】AX寄存器中有一個16位二進制數(shù),編程統(tǒng)計其中1的個數(shù),結果放到CL寄存器。 MOV CL,0 ;初始化L1: AND AX,AX ;循環(huán)控制 JZ STOP SAL AX,1 ;循環(huán)體 JNC L2 INC CLL2: JMP L1STOP:HLT 此方法采用“先判斷,后執(zhí)行”的結構。67 MOV BX,16 ;初始化 MOV CL,0L1: SAL AX,1 ;控制循環(huán) JNC L2 INC CLL2: DEC BX JNZ L1STOP:HLT 此方法采用“先執(zhí)行,后判斷”的結構。683. 循環(huán)程序的兩種基本模式(1)單重循環(huán):循

47、環(huán)體為順序和分支結構(2)多重循環(huán):循環(huán)體為一個新的循環(huán)結構多重循環(huán)是由單重循環(huán)嵌套而成。最常用:雙重循環(huán)(分為內(nèi)循環(huán)和外循環(huán))設計方法同單重循環(huán),但應注意:雙重循環(huán)的初始控制條件及程序?qū)崿F(xiàn);各層循環(huán)之間不能交叉,可以從內(nèi)循環(huán)跳到外循環(huán),不可以從外循環(huán)跳進內(nèi)層循環(huán);防止出現(xiàn)死循環(huán)。69【例】存儲器數(shù)據(jù)段從BUF開始存放著一個無符號字數(shù)組,數(shù)組的第一個字中存放著該數(shù)組的長度,編制一個程序使此數(shù)組中的數(shù)據(jù)按照從小到大的順序排列。分析一:采用冒泡排序算法,即從第一個數(shù)據(jù)開始,相鄰的數(shù)進行比較,若次序不對,兩數(shù)交換位置。第一遍比較(N-1)次后,最大的數(shù)已到了數(shù)組尾,第二遍僅需比較(N-2)次就夠了,

48、共比較(N-1)遍就完成了排序,共有兩重循環(huán)。DATA SEGMENTBUF DW 7,15,37,8600,A768H,3412H,1256H,76HDATA ENDSSTACK SEGMENT STACK SA DB 100 DUP(?)TOP EQU $STACK ENDS70CODE SEGMENT ASSUME CS:CODE,DS,DATA,SS:STACKMAIN PROC FARSTART:MOV AX,STACK MOV SS,AX MOV SP,TOP PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV BX,0 MOV

49、CX,BUFBX ;CX作為內(nèi)循環(huán)計數(shù)器 DEC CX71L1:MOV DX,CX ;DX作為外循環(huán)計數(shù)器L2:ADD BX,2 ;修改地址指針 MOV AX,BUFBX ;取一數(shù) CMP AX,BUFBX+2 ;與下一數(shù)比較 JBE CONTI ;若符合前小后大,轉(zhuǎn)移 XCHG AX,BUFBX+2 ;否則兩數(shù)交換 MOV BUFBX,AXCONTI:LOOP L2 ;內(nèi)循環(huán)控制 MOV CX,DX ;外循環(huán)次數(shù)CX MOV BX,0 ;地址指針返回 LOOP L1 ;外循環(huán)控制 RETMAIN ENDPCODE ENDS END START72分析二:采用改進的冒泡排序法,即用設置標志的方

50、法。設立一個FLAG位作標記,進入外循環(huán)時標志為0,在內(nèi)循環(huán)中每進行一次交換,標志置1。內(nèi)循環(huán)結束測試標志,若為1,再一次進入外循環(huán);若為0,表示內(nèi)循環(huán)沒有進行數(shù)據(jù)交換,可以提前結束外循環(huán),不必循環(huán)N-1遍,節(jié)省了操作時間。73START:MOV DI,OFFSET BUF ;設置地址指針 MOV CX,DI ;設內(nèi)循環(huán)計數(shù)器CX DEC CX ;N-1,內(nèi)循環(huán)次數(shù)L1: MOV DX,CX ;設外循環(huán)計數(shù)器DX MOV BH,0 ;BH為FLAGL2: ADD DI,2 MOV AX,DI CMP AX,DI+2 JBE CONTI XCHG AX,DI+2 ;若前大后小,交換,F(xiàn)LAG=1

51、 MOV DI,AX MOV BH,1CONTI:LOOP L2 CMP BH,0 ;FLAG=0,提前結束,跳出外循環(huán) JE STOP74 MOV CX,DX MOV DI,OFFSET BUF LOOP L1STOP: RET思考:如何改為降序?75總結:雙重循環(huán)需要內(nèi)、外兩個循環(huán)計數(shù)器方法(1):CX內(nèi)循環(huán)計數(shù)器 DX(或其它)外循環(huán)計數(shù)器 格式: MOV DX,外循環(huán)次數(shù) LP1: MOV CX,內(nèi)循環(huán)次數(shù) LP0: LOOP LP0 DEC DX JNZ LP1 76方法(2):內(nèi)、外循環(huán)計數(shù)器均用CX,此時應采用堆棧保護外循環(huán)計數(shù)器格式: MOV CX,外循環(huán)次數(shù) LP1: PUS

52、H CX ;保護外循環(huán)計數(shù)值 MOV CX,內(nèi)循環(huán)次數(shù) LP0: ;內(nèi)循環(huán)體 LOOP LP0 POP CX ;恢復外循環(huán)計數(shù)值 LOOP LP177四、子程序結構1. 概念子程序:可以多次反復調(diào)用的,能完成指定操作功能的特殊程序段。主程序:調(diào)用子程序的程序(相對而言)調(diào)用子程序(或轉(zhuǎn)子):主程序調(diào)用子程序的過程返回主程序(或返主):子程序結束返回主程序接著執(zhí)行過程調(diào)用的指令為CALL,過程返回的指令為RET。CALL指令自動保存返回地址,RET指令自動恢復返回地址,均需通過堆棧完成。782. 子程序的結構形式完整的子程序結構必須包括:(1)子程序說明文件(以注釋形式出現(xiàn)) ;子程序名 ;子程

53、序的功能 ;子程序中用到的寄存器和存儲單元 ;子程序的入口參數(shù)和出口參數(shù) ;子程序中調(diào)用其它子程序的名稱 ;子程序舉例(2)子程序的現(xiàn)場保護和現(xiàn)場恢復在子程序設計時,一般在子程序一開始就保護子程序?qū)⒁加玫募拇嫫鞯膬?nèi)容(用一組PUSH指令),子程序執(zhí)行RET之前再恢復被保護寄存器的內(nèi)容(用一組POP指令) 。79保護現(xiàn)場和恢復現(xiàn)場的工作既可在主程序中完成,也可在子程序中完成。注意:保護和恢復現(xiàn)場需遵循堆棧操作先進后出的特點。(3)子程序的調(diào)用與返回由設在主程序的CALL指令和設在子程序結尾的RET指令聯(lián)合實現(xiàn)。3. 子程序的設計方法(1)子程序的定義 過程名 PROC NEAR或FAR RET

54、 過程名 ENDP80注: 主、子程序在同一代碼段中,則定義為NEAR型(或缺省)主、子程序不在同一代碼段中,則定義為FAR型;一般可將主程序定義為FAR屬性(主過程作為DOS調(diào)用的一個遠端子過程)(2)子程序的參數(shù)傳遞方法主、子程序間的參數(shù)傳遞:主程序傳遞輸入?yún)?shù)及子程序傳遞輸出參數(shù)的過程。三種方法:用寄存器傳遞參數(shù):適合于參數(shù)較少的情況,傳遞速度較快;用存儲器傳遞參數(shù):適合于參數(shù)較多的情況,需要事先在存儲器中建立一個存儲區(qū),主、子程序均能訪問,通常采用寄存器存放該存儲區(qū)首地址的方法;用堆棧傳遞參數(shù):適合于參數(shù)較多的情況,注意堆棧中返回地址的保存與恢復。81【例】有一個子程序說明如下: ;名

55、稱:BCD2BIN ;功能:將一個字節(jié)的BCD碼轉(zhuǎn)換成二進制數(shù) ;所用寄存器:CX ;入口參數(shù):AL存放兩位BCD碼 ;出口參數(shù):AL存放二進制數(shù) ;調(diào)用其它子程序:無 ;子程序舉例:執(zhí)行前AL=36H,執(zhí)行后AL=24H子程序編制如下:82BCD2BIN PROC NEAR(或FAR) PUSH CX ;保護現(xiàn)場 MOV CH,AL AND CH,0FH ;存低4位 MOV CL,4 SHR AL,CL ;高4位右移4位 MOV CL,10 ;然后乘10 MUL CL ADD AL,CH ;高4位乘10+低4位 POP CX ;恢復現(xiàn)場 RETBCD2BIN ENDP注:本例是通過寄存器來傳

56、遞參數(shù)的。83【例】數(shù)據(jù)段定義兩個數(shù)組,編程實現(xiàn)對兩個數(shù)組分別求和(不計溢出)。DATA SEGMENTARY1 DW 100 DUP(?) ;定義數(shù)組1SUM1 DW ?ARY2 DW 100 DUP(?) ;定義數(shù)組2SUM2 DW ?DATA ENDSSTACK SEGMENT STACK SA DW 50 DUP(?) TOP EQU SIZE SASTACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK84MAIN PROC FARSTART: MOV AX,STACK MOV SS,AX MOV SP,TOP MOV AX,DAT

57、A MOV DS,AX LEA SI,ARY1 ;數(shù)組1首地址,入口參數(shù) MOV CX,LENGTH ARY1 ;數(shù)組1長度,入口參數(shù) CALL SUM ;調(diào)用求和子程序 LEA SI,ARY2 ;數(shù)組2首地址,入口參數(shù) MOV CX,LENGTH ARY2 ;數(shù)組2長度,入口參數(shù) CALL SUM ;調(diào)用求和子程序 MOV AH,4CH ;返回DOS INT 21HMAIN ENDP85SUM PROC NEAR ;子程序 XOR AX,AX ;AX清0L1: ADD AX,WORD PTRSI ;加數(shù)組元素 INC SI INC SI LOOP L1 MOV WORD PTRSI,AX ;

58、數(shù)組和送入SUM RET ;子程序返回SUM ENDPCODE ENDS END START注:本例是通過存儲器來傳遞參數(shù)的。86【例】通過堆棧傳遞參數(shù),實現(xiàn)十進制數(shù)數(shù)組求和,要求主程序和過程不在同一個代碼段中,要進行段間調(diào)用。MDATA SEGMENTARY1 DB 20 DUP(?) ;定義數(shù)組1SUM1 DW ?ARY2 DB 100 DUP(?) ;定義數(shù)組2SUM2 DW ?MDATA ENDSMSTACK SEGMENT STACK DW 100 DUP(?) TOP EQU $MSTACK ENDSMCODE SEGMENT ;主代碼段 ASSUME CS:MCODE,DS:MD

59、ATA,SS:MSTACK87MAIN PROC FARSTART:MOV AX,MSTACK ;初始化SS,SP MOV SS,AX MOV SP,TOP PUSH DS ;設置返回堆棧 MOV AX,0 PUSH AX MOV AX,MDATA ;初始化DS MOV DS,AX MOV AX,OFFSET ARY1 ;PADD過程入口參數(shù)進棧 PUSH AX MOV AX,SIZE ARY1 PUSH AX CALL FAR PTR PADD 88 MOV AX,OFFSET ARY2 PUSH AX MOV AX,SIZE ARY2 PUSH AX CALL FAR PTR PADD R

60、ETMAIN ENDPMCODE ENDSPCODE SEGMENT ;過程代碼段 ASSUME CS:PCODE,DS:MDATA,SS:MSTACKPADD PROC FAR PUSH BX ;寄存器保護 PUSH CX PUSH BP MOV BP,SP89 PUSHF MOV CX,BP+10 ;數(shù)組長度CX MOV BX,BP+12 ;數(shù)組首地址BX MOV AX,0NEXT: ADD AL,BX ;加數(shù)組中一元素 DAA MOV DL,AL MOV AL,0 ADC AL,AH DAA MOV AH,AL MOV AL,DL INC BX LOOP NEXT MOV BX,AX ;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論