匯編語言程序設(shè)計ok.ppt_第1頁
匯編語言程序設(shè)計ok.ppt_第2頁
匯編語言程序設(shè)計ok.ppt_第3頁
匯編語言程序設(shè)計ok.ppt_第4頁
匯編語言程序設(shè)計ok.ppt_第5頁
已閱讀5頁,還剩97頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

微機(jī)原理與接口技術(shù),第4章 匯編語言程序設(shè)計,本章內(nèi)容,匯編語言源程序:用匯編語言編寫的程序,或簡稱為源程序。 匯編程序:將源程序翻譯成機(jī)器語言的程序 目標(biāo)程序:機(jī)器語言代碼程序 連接程序:將庫文件和目標(biāo)文件連接在一起形成可執(zhí)行文件的程序 目前常用的匯編程序有宏匯編MASM 匯編語言程序從建立到匯編、連接形成可執(zhí)行程序的整個過程如圖所示:,4.1 匯編語言程序格式,4.1 匯編語言程序格式,匯編源程序:,4.1 匯編語言程序格式,三、一般匯編語言程序的結(jié)構(gòu)形式 NAME1 SEGMENT ;段的起始 語句1 ; 語句2 ; 語句n ; NAME1 ENDS ;段的結(jié)束 NAME2 SEGMENT ;段的起始 語句1 ; 語句2 ; 語句m ; NAME2 ENDS ;段的結(jié)束 END ;源程序結(jié)束,m條語句序列構(gòu)成的語句體,n條語句序列構(gòu)成的語句體,4.1 匯編語言程序格式,8086 匯編語言語句的分類 指令語句 偽指令語句 宏指令語句,4.2 匯編語言基本語法,4.2.0 匯編語言的格式 4.2.1 常量、變量與標(biāo)號 4.2.2 運算符與表達(dá)式,4.2.0 匯編語言的格式,由匯編語言編寫的源程序是由許多語句(也可稱為匯編指令)組成的。每個語句由14個部分組成,其格式是: 標(biāo)號 指令助記符 操作數(shù) ;注解 標(biāo)識符:給指令或某一存儲單元地址所起的名字。可由下列字符組成: 字母:A z ; 數(shù)字:0 9 ; 特殊字符:?、 、一、$ 。 數(shù)字不能作標(biāo)識符的第一個字符,而圓點僅能用作第一個字符。標(biāo)識符最長為31個字符。當(dāng)標(biāo)識符后跟冒號時,表示是標(biāo)號。它代表該行指令的起始地址;當(dāng)標(biāo)識符后不帶冒號時,表示變量;偽指令前的標(biāo)識符不加冒號。 指令助記符:表示不同操作的指令,可以是8086的指令助記符,也可以是偽指令。 操作數(shù): 指令執(zhí)行的對象。依指令的要求,可能有一個、兩個或者沒有。 注解:該項可有可無,是為源程序所加的注解,用于提高程序的可讀性。,4.2.1 常量、變量與標(biāo)號,1. 常量 數(shù)值常量:如:010111001,56,94H,0ADH等。 字符串常量 :用單引號括起來的字符串,如 A, abcd等。字符串在計算機(jī)中存儲的是其ASCLL碼。例如:A的值是41H,AB的值是4142H等。 符號常量:常量用符號名來代替就是符號常量。例如: COUNT EQU 3 或COUNT=3,COUNT就是一個符號常量,與數(shù)值常量3等價。,4.2.1 常量、變量與標(biāo)號,2. 變量 變量在數(shù)據(jù)段、附加數(shù)據(jù)段或堆棧段中定義,后面不跟冒號。它也可以用LABEL或EQU偽操作來定義。變量經(jīng)常在操作數(shù)字段出現(xiàn),有三種屬性,見下: 段屬性:指變量所在段的段首址。 偏移屬性:變量的偏移地址,指從段的起始地址到定義變量的位置之間的字節(jié)數(shù)。 類型屬性:變量的類型屬性,指該變量定義的字節(jié)數(shù)。BYTE(1)、WORD(2)、DWORD(4)、FWORD(6)、QWORD(8)、TBYTE(10),4.2.1 常量、變量與標(biāo)號,在同一個程序中,同樣的標(biāo)號或變量的定義只允許出現(xiàn)一次,否則匯編程序會指示出錯。 例 DATA Segment ;數(shù)據(jù)段 A DB 55 B DW 36H DATA Ends 說明:A 和B是變量。,4.2.1 常量、變量與標(biāo)號,3. 標(biāo)號 標(biāo)號在代碼段中定義,后面跟著冒號“:”,它可用LABEL或EQU偽操作來定義;還可以作為過程名定義。標(biāo)號經(jīng)常在轉(zhuǎn)移指令或CALL指令的操作數(shù)字段出現(xiàn),用以表示轉(zhuǎn)向地址。標(biāo)號有3種屬性: 段屬性:定義標(biāo)號的段起始地址 偏移屬性:標(biāo)號的偏移地址,是從段起始地址到定義標(biāo)號的位置之間的字節(jié)數(shù)。 類型屬性:用來指出該標(biāo)號是在本段內(nèi)引用還是在其他段中引用的。段內(nèi)引用的類型屬性是Near,段間引用的類型屬性是Far。,4.2.2 運算符與表達(dá)式,1. 算術(shù)運算符 (加)、(減)、*(乘)、/(除)、MOD(取余除) 例如: MOV AL,4*85 ;數(shù)值表達(dá)式 MOV SI,OFFSET BUF12 ;地址表達(dá)式,4.2.2 運算符與表達(dá)式,2. 邏輯運算符 AND(與)、OR(或)、XOR(異或)、NOT(非) 說明: 邏輯運算符只能用于數(shù)值表達(dá)式中,不能用于地址表達(dá)式中。 邏輯運算符和邏輯運算指令是有區(qū)別的。邏輯運算符的功能在匯編階段完成,邏輯運算指令的功能在程序執(zhí)行階段完成。例如,在匯編階段, 指令 AND AL,78H AND 0FH 等價于 指令 AND AL,08H,4.2.2 運算符與表達(dá)式,3. 關(guān)系運算符 EQ(相等) LT(小于) LE(小于等于) GT(大于) GE(大于等于) NE(不等于) 說明: 關(guān)系運算符要有兩個運算對象。兩個運算對象要么都是數(shù)值、要么都是同一個段內(nèi)的地址。運算結(jié)果為真時,表示為0FFFFH (-1),運算結(jié)果為假時,表示為0000H (0)。 例如: 指令MOV BX,32 EQ 45 等價于 MOV BX,0 指令MOV BX,56 GT 30 等價于 MOV BX,0FFFFH,4.2.2 運算符與表達(dá)式,4. 取值運算符 變量和標(biāo)號具有段屬性、偏移屬性和類型屬性等,要從變量和標(biāo)號中取出它們的段地址、偏移地址,變量的類型、元素的個數(shù)和占用內(nèi)存的大小等,就要使用取值運算符(又稱分析運算符)。這些運算符是: SEG:取段地址 OFFSET:取偏移地址 TYPE :返回變量類型 LENGTH:返回變量所包含的數(shù)據(jù)個數(shù) SIZE :返回變量的字節(jié)數(shù),4.2.2 運算符與表達(dá)式,例如:SCORE DW 30 DUP(0) 上述偽指令定義了一個變量SCORE ,取值運算符使用如下: MOV AL, TYPE SCORE MOV AH, LENGTH SCORE MOV BL, SIZE SCORE 則 (AL)=2 ,(AH)=30 ,(BL)=60,4.2.2 運算符與表達(dá)式,5. 合成運算符 也稱為修改屬性運算符,它能修改變量或標(biāo)號的原有的類型屬性并賦予新的類型。這類運算符是PTR和THIS。 PTR的格式: 類型 PTR 表達(dá)式 其中類型可以是BYTE、WORD、DWORD、NEAR、FAR,表達(dá)式是被修改的變量或標(biāo)號。 例如: NUM DB 1,3,5,7 則 MOV AX,NUM 非法的!因為NUM是字節(jié)定義,而AX是字! 而應(yīng)改為: MOV AX, WORD PTR NUM,PTR運算符應(yīng)用例子: 數(shù)據(jù)段定義: VAR1 DB 10H,18H,25H,34H VAR2 DW 1223H,1200H 代碼段定義: MOV AX, WORD PTR VAR1 ;執(zhí)行后:AX=1810H MOV BL, BYTE PTR VAR2 ;執(zhí)行后:BL=23H,4.2.2 運算符與表達(dá)式, THIS的格式: 新符號名 EQU THIS 類型 原符號名 類型 參數(shù), THIS的功能與PTR相同,只是格式不同。THIS語句中建立一個新的符號名并指定它有THIS后的類型,而新符號名指向下一語句的原符號名的內(nèi)存地址。 例如用下面的THIS語句代替。 DNUM EQU THIS WORD NUM DB 1,3,5,7 其中DNUM是字型并指向NUM所指的內(nèi)存單元,DNUM的存取以字為單位,而NUM仍是字節(jié)類型。 MOV AX,DNUM ;合法的,4.3 偽指令,1. 符號定義偽指令 等值偽指令EQU 格式:EQU 例如: CONSTANT EQU 256 ;將數(shù)256賦以符號名 B EQU BP+8 ;變址引用賦以符號名B AB EQU DATA_ONE +2 ; DATA_ONE必須先定義,否則出錯,4.3 偽指令, 等號偽指令 = 例如: EMP=6 或 EMP EQU 6 EQU定義的表達(dá)式名不允許重復(fù)使用。而偽指令則允許重復(fù)使用。,4.3 偽指令, 定義符號名偽指令LABEL LABEL偽指令可以定義變量或標(biāo)號. 格式: LABEL LABEL只指出所定義的變量或標(biāo)號的類型,可以是BYTE、WORD、DWORD、NEAR、FAR。具體的變量或標(biāo)號的段屬性和偏移屬性則由下一條可分配內(nèi)存的變量或標(biāo)號的屬性決定。例如: DATW LABEL WORD DATB DB 20H DUP(0) FLPT LABEL FAR NLPT: MOV AX,BX,4.3 偽指令, 解除定義偽指令PURGE:解除指定符號的定義。 格式:PURGE 解除符號定義后,可用EQU重新定義。 例如: Y1 EQU 7 ;定義Y1的值為7 PURGE Y1 ;解除Y1的定義 Y1 EQU 36 ;重新定義Y1的值為36,4.3 偽指令,(5)DUP按照給定的次數(shù)來復(fù)制某個(或某些)操作數(shù),可以避免多次重復(fù)輸入同一個數(shù)據(jù)。 例1: Data1 DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH Data2 DB 6 DUP(0FFH) 例2:操作數(shù)?可以保留存儲空間,但不存入數(shù)據(jù)。 Array1 DB 2 DUP(0,1,2,?) Array3 DB 100 DUP(?),4.3 偽指令,2. 數(shù)據(jù)定義偽指令 格式: 變量 助記符 操作數(shù),操作數(shù);注釋 該類偽指令用來定義存貯空間及其所存數(shù)據(jù)的長度。 DB:定義字節(jié),即每個數(shù)據(jù)是1個字節(jié)。 DW:定義字,即每個數(shù)據(jù)占1個字(2個字節(jié))。 DD:定義雙字,即每個數(shù)據(jù)占2個字。低字部分在低地址,高字部分在高地址。 DQ:定義4字長,即每個數(shù)據(jù)占4個字。 DT:定義10個字節(jié)長,用于壓縮式十進(jìn)制數(shù)據(jù)。 例如:DATA1 DB 10H,6,78H,100 表示從DATA1單元開始連續(xù)存放10H,6,78H,100,共占4個字節(jié)地址。,4.3 偽指令,定義數(shù)據(jù)偽指令 DATA1 DB 20H DATA2 DW 0240H,1000H DATA3 DB (-1*3),(15/3) DATA4 DD 12345H DATA5 DB 3210 DATA6 DW AB,C,D DATA7 DB ? DATA8 DD ? DATA9 DB 5DUP(00) DATA10 DW 3DUP(?),4.3 偽指令,課后練習(xí) 例1:請圖示下面?zhèn)沃噶疃x的數(shù)據(jù)在內(nèi)存中的存放形式。 (1)BUF1 DB 12,12,12H,2*6,-1 (2)BUF2 DW 12,12H,1234H (3)BUF3 DB 2 DUP(5,4,3DUP(8),4.3 偽指令,例2:下面是一個定義數(shù)據(jù)的程序段,設(shè)DATA值為1200H,請圖示各數(shù)據(jù)在內(nèi)存的存放形式。 Data segment org 100H Buf1 DB 10H,20H,30H Buf2 DW Buf1 Buf3 DD Buf2 Count EQU Buf2-Buf1 Buf4 DW Buf2-Buf1 Data ends,4.3 偽指令,3. 段定義偽指令 SEGMENT和ENDS 段定義偽指令 該指令能對程序分段,其格式為: 段名 SEGMENT 定位類型組合類型類別 段名 ENDS,4.3 偽指令,DATA1 SEGMENT DATA1 ENDS STACK1 SEGMENT STACK STACK1 ENDS CODE1 SEGMENT ASSUME CS:CODE1,DS:DATA1,SS:STACK1 MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX CODE1 ENDS,4.3 偽指令, ASSUME 段寄存器指派偽指令 該偽指令用來通知匯編程序哪一個段寄存器是該段的段寄存器 格式: ASSUME 段寄存器:段名,段寄存器:段名 注意:由于ASSUME偽指令只指明某一個段地址應(yīng)存于哪一個段寄存器中,并沒有包含將段地址送入該寄存器的操作。因此除CS外,DS、ES 和SS中的段地址要在程序中通過MOV指令裝入。,4.3 偽指令,例子: DATA1 SEGMENT DATA1 ENDS STACK1 SEGMENT STACK STACK1 ENDS CODE1 SEGMENT ASSUME CS:CODE1,DS:DATA1,SS:STACK1 MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX CODE1 ENDS,裝入DS數(shù)據(jù)段寄存器,裝入SS堆棧段寄存器,4.3 偽指令, ORG 移動地址指針的偽指令 格式為: ORG 常量表達(dá)式 該指令指定地址指針相對于當(dāng)前指針的偏移位置,常用表達(dá)式給出偏移量。當(dāng)指定新的地址指針以后,其后的程序和數(shù)據(jù)就從此指針指示的起始地址開始存放。例如 ORG 100H 地址計數(shù)器用來保存當(dāng)前正在匯編的指令的地址,這個地址指針用$表示。如ORG $+5 ,則表示地址指針從當(dāng)前地址跳過5個字節(jié)。,4.3 偽指令,4. 過程定義偽指令PROC和ENDP 在程序設(shè)計中,可將具有一定功能的程序段看成為一個過程(相當(dāng)于一個子程序),它可以被別的程序調(diào)用。一個過程由偽指令PROC和ENDP來定義。 過程名 PROC 類型 過程體 RET 過程名 ENDP 其中過程名是為過程所起的名稱,不能省略,過程的類型由FAR(遠(yuǎn)過程,為段間調(diào)用)和NEAR(近過程,在本段內(nèi)調(diào)用)來確定,如果缺省類型,則該過程就默認(rèn)為近過程。ENDP表示過程結(jié)束。過程體內(nèi)至少應(yīng)有一條RET指令,以便返回被調(diào)用處。過程可以嵌套,也可以遞歸使用。,4.3 偽指令,4. 過程定義偽指令PROC和ENDP DELAY PROC MOV BL,10 DELY:MOV CX,2801 WAIT:LOOP WAIT DEC BL JNZ DELY RET DELAY ENDP,4.3 偽指令,5. 程序標(biāo)題偽指令TITLE Title偽指令指定一個標(biāo)題,以便在列表文件每一頁的第一行打印出這個標(biāo)題。一般放置在程序的第一行開始處。 格式:TITLE 文本 其中,文本是用戶給出的字符串,要求長度不超過6個字符。,4.3 偽指令,6、EVEN 偽指令 使下一個變量或指令開始于偶數(shù)字節(jié)地址。,4.3 偽指令,7. 基數(shù)控制偽指令 二進(jìn)制數(shù) 由一串0和1組成其后跟以字母B,如00101100B 十進(jìn)制數(shù) 由09的數(shù)字組成的數(shù)。一般情況下,后面不必加上標(biāo)記,在指定其它基數(shù)的情況下,后面可跟字母D,例如178D。 十六進(jìn)制數(shù) 由09及AF組成的數(shù),后面跟字母H。這個數(shù)的第一個字符必須是09,所以如果第一個字符是AF時,應(yīng)在其前面加上數(shù)字0,如0FFFFH。,4.3 偽指令, 八進(jìn)制數(shù) 由數(shù)字07組成的數(shù),后面可跟字母O或Q,如1777O。 .RADIX RADIX偽指令可以把默認(rèn)的基數(shù)改變?yōu)?16范圍內(nèi)的任何基數(shù)。格式如下: .RADIX EXPRESSION 字符串 字符串可以看成串常量,可以用單引號或雙引號把字符串放在其中,得到的是字符串的ASCII碼值,例如,ABCD。,4.4 宏指令,宏匯編是一種與子程序類似而又獨具特色的簡化程序設(shè)計的工具。宏匯編給用戶提供了自行設(shè)計指令并使用的手段,也就是用一條自定義的指令來代替一段完成某種功能的程序段,這種自定義的指令稱為宏指令。 宏匯編主要包括3個步驟:宏定義,宏調(diào)用和宏展開。,P128,4.4 宏指令,1.宏指令定義 將一段代碼定義成宏指令,相當(dāng)于用戶自定義了一條指令。格式如下: 宏指令名 MACRO 形式參數(shù)1,形式參數(shù)2, 形式參數(shù)N ;宏指令體(宏體) ENDM 例4.1 定義一條從鍵盤輸入一個字符的宏指令I(lǐng)NPUT input macro mov ah 1 int 21h endm,例4.2 定義一條換行宏指令LF LF MACRO MOV DL,10 10 是換行符的ASCII碼 MOV AH,2 INT 21H ENDM 例4.3 定義一條回車宏指令CR CR MACRO MOV DL,13 13 是回車符的ASCII碼 MOV AH,2 INT 21H ENDM,4.4 宏指令,2. 宏調(diào)用 在程序需要的地方插入宏指令,其語法與其他匯編語言指令相同。 宏指令名 實際參數(shù)1,實際參數(shù)2, 實際參數(shù)N 見例4.4 定義一條INOUT宏指令,既可以引用它輸入一串字符,也可以引用它來顯示一串提示字符。exmacro.asm,; 定義一條InOut指令,既可以引用它輸入一串字符,也可引用它顯示一串提示字符 inout macro x, y mov ah,x lea dx,y int 21h endm data segment input db Please input any characters:,$ keybuff db 10,11 dup(?),13,10,$ data ends code segment assume cs:code ,ds:data start: mov ax,data mov ds,ax inout 9,input ;顯示一串提示符的宏指令調(diào)用 lf cr inout 10,keybuff ;輸入一串字符串的宏指令調(diào)用 inout 9,Keybuff+2 ;顯示輸入的一串字符串的宏調(diào)用 mov ah,4ch int 21h code ends end start,4.4 宏指令,3. 宏展開 匯編時,匯編程序并不對宏定義指令進(jìn)行匯編,只有在宏調(diào)用時才對宏指令體進(jìn)行語法檢查和代碼塊的插入。這個過程稱為宏展開(即在匯編源程序是,在宏調(diào)用的位置用宏定義的程序代碼代替宏指令)。 在masm匯編生成的列表文件(.lst)中,可以看到宏展開。用記事本打開可以看到宏展開的地方有1作標(biāo)志。 見EXMACRO.LST,4.5 系統(tǒng)功能調(diào)用,4.5.1 DOS軟中斷指令 8086系統(tǒng)規(guī)定對這些功能的調(diào)用,統(tǒng)一使用軟中斷INT指令,格式如下: INT n 其中,n是中斷類型碼。,4.5 系統(tǒng)功能調(diào)用,4.5.2 DOS系統(tǒng)功能調(diào)用(INT 21H) 帶顯示的單字符鍵盤輸入(1號功能) 格式: MOV AH,1 INT 21H 輸出單字符(2號調(diào)用) 格式: MOV DL,A;A字符的ASCII碼置入DL中 MOV AH,2 INT 21H,4.5 系統(tǒng)功能調(diào)用, 不帶顯示的單字符鍵盤輸入(7號、8號調(diào)用) 字符串輸出(9號調(diào)用) 字符串輸入(0AH號調(diào)用) 返回操作系統(tǒng)(4CH號調(diào)用) 格式: MOV AH,4CH INT 21H,4.6 匯編語言程序設(shè)計舉例,用這三種基本結(jié)構(gòu)作為表示一個良好算法的基本單元。 順序結(jié)構(gòu) 選擇結(jié)構(gòu) 循環(huán)結(jié)構(gòu):它又稱重復(fù)結(jié)構(gòu),即反復(fù)執(zhí)行某一部分的操作。有兩類循環(huán)結(jié)構(gòu):當(dāng)型(WHILE型)循環(huán)結(jié)構(gòu)和直到型(UNTIL型)循環(huán)結(jié)構(gòu)。,圖4.3 順序結(jié)構(gòu)圖,箭頭:程序執(zhí)行的方向 方框:語句 棱形框:條件判斷 學(xué)會畫程序結(jié)構(gòu)流程圖,4.6.1 順序程序結(jié)構(gòu),例4.5 編程序計算:SUM=3*(X+Y)+(Y+Z)/(Y-Z),其中X、Y、Z都是16無符號數(shù)。假設(shè)運算過程中間結(jié)果都不超出16位二進(jìn)制數(shù)的范圍,要求結(jié)果存入SUM單元。程序片段如下:,MOV AX,X ;取X ADD AX,Y ;AXX+Y MOV CX,3 MUL CX ;DX:AX3*X+Y MOV CX,AX ;CX3*X+Y保存 MOV AX,Y ;取Y ADD AX,Z ;AXY+Z XOR DX,DX ;DX0 MOV BX,Y ;取Y SUB BX,Z ;BXY-Z DIV BX ;AXY+Z/Y-Z的商 ADD AX,CX ;AX3*X+Y+Y+Z/Y-Z MOV SUM,AX ;存結(jié)果,4.6.1 順序程序結(jié)構(gòu),開始,結(jié)束,從存儲單元取得兩個數(shù),并相加,將高4位轉(zhuǎn)化為ASCII字符碼輸出,將低4位轉(zhuǎn)化為ASCII字符碼輸出,例4.6程序流程結(jié)構(gòu)圖,4.6.1 順序程序結(jié)構(gòu),例4.6 將兩個字節(jié)數(shù)據(jù)相加,并存放到一個結(jié)果單元中。,DATA SEGMENT AD1 DB 4CH ;定義第1個加數(shù) AD2 DB 25H ;定義第2個加數(shù) SUM DB ? ;定義結(jié)果單元 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AL,AD1 ;取出第1個加數(shù) ADD AL,AD2 ;和第2個加數(shù)相加 MOV SUM,AL ;存放結(jié)果 MOV BL,AL ;顯示16進(jìn)制結(jié)果 MOV CL,4,4.6.1 順序程序結(jié)構(gòu),4.6.1 順序程序結(jié)構(gòu),SHR AL,CL ; 右移4位 AND AL,0FH ;高4位清0 ADD AL,30H ;加30H,變成ASCII碼。 MOV DL,AL ;顯示高4位 MOV AH,2 INT 21H MOV AL,BL AND AL,0FH ADD AL,30H MOV DL,AL ;顯示低4位 MOV AH,2 INT 21H MOV AH,4CH ;返回DOS INT 21H CODE ENDS END START,4.6.1 順序程序結(jié)構(gòu),數(shù)據(jù)處理并顯示過程,ASCII碼,二進(jìn)制數(shù),Ascii碼(串),計算機(jī)直接按二進(jìn)制數(shù)的運算規(guī)則來進(jìn)行算術(shù)運算,4.6.2 分支程序設(shè)計,分支程序結(jié)構(gòu)可以有兩種形式,如下圖所示。它們分別相當(dāng)于高級語言中的IF_THEN_ELSE語句和CASE語句,適用于要求根據(jù)不同條件作不同處理的情況。IF_THEN_ELSE語句可以引出兩個分支。CASE語句則可以引出多個分支。不論哪一種形式,它們的共同特點是:運行方向是向前的,在某一種特定條件下,只能執(zhí)行多個分支中的一個分支。,4.6.2 分支程序設(shè)計,例4.7 編制程序?qū)崿F(xiàn)符號函數(shù)。 1 X0 Y= 0 X=0 (-128X+127) -1 X0 程序部分如下:,圖4.6 例4.7程序流程圖,CMP X,0 JL PNUM ;X0轉(zhuǎn)移到PNUM JZ ZERO ;X=0轉(zhuǎn)移到ZERO MOV Y,1 JMP EXIT ;X0 PNUM: MOV Y,-1 JMP EXIT ;X0 ZERO: MOV Y,0 ;X=0 EXIT: ,4.6.2 分支程序設(shè)計,3.利用地址跳轉(zhuǎn)表實現(xiàn)分支 利用地址跳轉(zhuǎn)表的方法主要用于三路分支(或以上)的情況,類似CASE結(jié)構(gòu)。 例4.8 在調(diào)用DOS文件管理功能時,如出現(xiàn)了錯誤(如使用了非法功能號),DOS則根據(jù)AX中的錯誤碼,將相應(yīng)的錯誤信息顯示出來.(AX)=15各表示一種錯誤,其錯誤信息分別為ER1ER5.AX除15之外的數(shù)碼是無效(代碼見 ch4_8table.doc,本題關(guān)鍵是找到AX與地址跳躍表的字符串地址ER1ER5的對應(yīng)關(guān)系)。,4.6.2 分支程序設(shè)計,title ch4_8.asm data segment outrang db Error code is not in valid range(15),0dh,0ah,$ er1 db Invalid function number,0dh,0ah,$ er2 db File not found,0dh,0ah,$ er3 db Path not found,0dh,0ah,$ er4 db Too many open file,0dh,0ah,$ er5 db Acess violation,0dh,0ah,$ even ertab dw er1,er2,er3,er4,er5 data ends,code segment assume cs:code,ds:data show_err proc far start: mov si,data mov ds,si push ax ;保存正在工作的寄存器 push bx push dx mov ax,2 ;假設(shè)AX=2 cmp ax,5 ;跟5比較 jg outr ;大于5則超出范圍 cmp ax,1 ;小于5,則看是否大于1 jge tab_addr ;若大于1則查找錯誤信息表地址 outr: lea dx,outrang ;超出范圍時的錯誤信息 jmp short disp_msg ;跳轉(zhuǎn)至輸出信息,4.6.2 分支程序設(shè)計,4.6.2 分支程序設(shè)計,tab_addr: mov bx,ax ;(AX)-1)*2=bx dec bx shl bx,1 mov dx,ertabbx ;將錯誤信息首地址送給dx,以便輸出 disp_msg: mov ah,09 ;輸出錯誤信息字符串 int 21h pop dx ;彈出工作寄存器 pop bx pop ax,4.6.2 分支程序設(shè)計,mov ax,4c00h int 21h show_err endp code ends end start,作業(yè),習(xí)題4 第1,2,3題 第5題,編程并畫出程序流程圖,4.6.3 循環(huán)程序設(shè)計,1. 循環(huán)程序結(jié)構(gòu) DO_WHILE結(jié)構(gòu) :DO_WHILE結(jié)構(gòu)把對循環(huán)控制條件的判斷放在循環(huán)的入口,先判斷條件,滿足條件就執(zhí)行循環(huán)體,否則就退出循環(huán)。 DO_UNTIL結(jié)構(gòu):DO_UNTIL結(jié)構(gòu)則先執(zhí)行循環(huán)體,然后再判斷控制條件,不滿足條件則繼續(xù)執(zhí)行循環(huán)操作,一旦滿足條件則退出循環(huán)。,(a) DO WHILE結(jié)構(gòu),(b) DO UNTIL結(jié)構(gòu),4.6.3 循環(huán)程序設(shè)計,循環(huán)程序都可由如下三部分組成: 設(shè)置循環(huán)的初始狀態(tài): 如設(shè)置循環(huán)次數(shù)的計數(shù)值,以及為循環(huán)體正常工作而建立的初始狀態(tài)等。 循環(huán)體:循環(huán)工作的主體,它由循環(huán)的工作部分及修改部分組成。 循環(huán)控制部分,與循環(huán)有關(guān)的指令,LOOP 標(biāo)號 ;基本循環(huán)指令 LOOPZ/LOOPE 標(biāo)號 ;為零/相等時循環(huán) LOOPNZ/LOOPNE 標(biāo)號;不為零/不等時循環(huán) 說明 條件循環(huán)指令除測試CX外還測試ZF,因此要注意將條件循環(huán)指令緊接在形成ZF的指令之后 在多重循環(huán)的程序結(jié)構(gòu)中,注意對循環(huán)計數(shù)器的保存與恢復(fù)。循環(huán)指令不影響條件碼。,4.6.3 循環(huán)程序設(shè)計,2. 循環(huán)控制方法 循環(huán)的結(jié)束判斷是循環(huán)程序的一個重要部分,控制循環(huán)的執(zhí)行并判斷是否結(jié)束循環(huán)的方法主要有三種:計數(shù)控制、條件控制、邏輯尺控制。下邊分別進(jìn)行討論。 計數(shù)控制 這是一種最常用的循環(huán)控制方法,適用于事先已知循環(huán)次數(shù)的情況??捎醚h(huán)指令LOOP實現(xiàn),也可用條件轉(zhuǎn)移指令實現(xiàn)。,4.6.3 循環(huán)程序設(shè)計,例4.9: 在首地址為BUFF的內(nèi)存緩沖區(qū)中,存放著20H個帶符號字?jǐn)?shù)據(jù)。編制程序找出其中的最小值,并將最小值存入MIN單元。程序片段如下:,LEA SI,BUFF ;設(shè)地址指針 MOV CX,20H ;CX循環(huán)次數(shù) MOV AX,SI ;AX第一個數(shù)據(jù) INC SI INC SI ;SI指向第二個數(shù) DEC CX AGAIN:CMP AX,SI JLE NEXT ;小于或等于時轉(zhuǎn)移 MOV AX,SI NEXT: INC SI INC SI ;修改地址指針指向下一個數(shù) LOOP AGAIN MOV MIN,AX,完整程序見ch4-9.asm,4.6.3 循環(huán)程序設(shè)計, 條件控制 適用于事先不知道循環(huán)次數(shù)的場合,但可以用給定的某種條件來判斷是否結(jié)束循環(huán)。 例4.10 編程統(tǒng)計AX寄存器中1的個數(shù),并將結(jié)果存入SUM單元,4.6.3 循環(huán)程序設(shè)計,程序片段如下: MOV BL,0 ;計數(shù)單元BL清0 AGAIN:OR AX,AX ;測試AX=0? JZ EXIT ;若 AX=0,則轉(zhuǎn)移到結(jié)束點。 SHL AX,1 ;將AX最高位移至CF JNC NEXT ;CF=0,轉(zhuǎn)去AGAIN繼續(xù) INC BL ;CF0,BL加1 NEXT:JMP AGAIN EXIT:MOV SUM,BL,4.6.3 循環(huán)程序設(shè)計,3.邏輯尺控制 適用于沒有規(guī)律但必須連續(xù)執(zhí)行的情況。 例4.11 編寫一個顯示程序,要求顯示A和B14次,顯示次序為A顯示3次,B顯示1次,B顯示1次,A顯示4次,B顯示3次。分析: 設(shè)邏輯尺:0001101000011100 0表示顯示A 1表示顯示B 逐位測試邏輯尺,是0則執(zhí)行顯示A的分支,是1則執(zhí)行顯示B的分支代碼見ch4_11logicrule.doc,Title邏輯尺 Data segment A db * B db Logic_rule dw 1A1CH Data ends Code segment assume cs:code,ds:data Start: mov ax,data Mov ds,ax Mov cx,14 Mov bx,logic_rule Next : Shl bx,1 Jc showB,Mov dl,A Jmp Display showB: Mov dl,B Display: Mov ah,02h Int 21h Loop next Mov ax,4c00h Int 21h Code ends end start,4.6.3 循環(huán)程序設(shè)計,4.6.3 循環(huán)程序設(shè)計,3. 雙重循環(huán)程序設(shè)計 例4.12編制程序?qū)崿F(xiàn)延時1ms。延時程序就是讓計算機(jī)執(zhí)行一些空操作或無用操作,來占用CPU的時間,從而達(dá)到延時的目的。通常用循環(huán)程序?qū)崿F(xiàn)。程序片段如下: MOV CX,374 DELAY1:PUSHF ;10T POPF ;8T LOOP DELAY1 ;3.4T,4.6.3 循環(huán)程序設(shè)計,上邊程序段的循環(huán)體和循環(huán)控制部分是由指令PUSHF、POPF和LOOP構(gòu)成。這三條指令執(zhí)行所花費的時鐘周期個數(shù)和為10+8+3.4=21.4。若CPU的主頻為8MHz,那么它的時鐘周期為0.125S。如果要實現(xiàn)延時1ms,則該循環(huán)體重復(fù)連續(xù)執(zhí)行的次數(shù)為: 循環(huán)次數(shù)=1ms/(0.125S21.4)374,4.6.3 循環(huán)程序設(shè)計,如果要延時100 ms,那么只需將這個程序再執(zhí)行100次,從而構(gòu)成一個雙重循環(huán)。其程序片段如下: MOV BL,100 ;4T1 DELAY2:MOV CX,374 ;4T2 DELAY1:PUSHF ;10T POPF ;8T LOOP DELAY1 ;3.4T DEC BL ;2T JNZ DELAY2 ;8T 顯然,該程序的準(zhǔn)確延時時間為:T=4T+100(4T+21.4T374+2T+8T)=100.22ms,4.6.3 循環(huán)程序設(shè)計,延時程序: Mov di,30000 Delay: Mov si,30000 Delay1: dec si Jnz Delay1 dec di jnz Delay,4.6.4 子程序設(shè)計,1. 子程序的調(diào)用和返回 過程具有特定功能的代碼塊 過程名 proc attribute 過程名 endp 其中,過程名為標(biāo)識符,又是子程序入口的符號地址,attribute是類型屬性,可以是Near或Far 調(diào)用程序和過程在同一個代碼段中則使用Near屬性 調(diào)用程序和過程不在同一個代碼段中則使用Far屬性 子程序用CALL指令調(diào)用,返回用ret指令。,調(diào)用子程序的過程:,CALL ProcA,主程序,RET,子程序,下一條指令,ProcA:,斷點(CS:IP) 放入堆棧區(qū),4.6.4 子程序設(shè)計,例4.24 子程序的定義、調(diào)用和返回示意 CODE1 SEGMENT CALL PROC1 AAA: PROC1 PROC RET PROC1 ENDP PROC2 PROC FAR RET PROC2 ENDP CODE1 ENDS CODE2 SEGMENT CALL PROC2 BBB: CODE2 ENDS,例4.24中,CALL PROC1匯編后形成段內(nèi)調(diào)用,CALL PROC2形成段間調(diào)用。AAA和BBB是兩個返回地址。,4.6.4 子程序設(shè)計,子程序最后一條執(zhí)行的指令一定是返回指令RET,RET指令能按照CALL指令的不同格式,由匯編程序匯編形成段內(nèi)返回(過程PROC1中的RET指令)和段間返回(PROC2中的RET指令),并將控制返回到主程序斷點。如在例4.24中,子程序PROC1返回后,從AAA處開始執(zhí)行,子程序PROC2返回后,從BBB處開始執(zhí)行。,4.6.4 子程序設(shè)計,2.編制子程序時的注意事項 子程序設(shè)計要求:通用性強(qiáng),獨立性好,程序目標(biāo)代碼短,占用內(nèi)存少,執(zhí)行速度快,結(jié)構(gòu)清晰,有詳細(xì)的功能、參數(shù)說明。 需要注意如下三點: 參數(shù)傳遞 主程序每次調(diào)用子程序時,必須給它賦予處理的數(shù)據(jù)到約定的地址單元中,這些數(shù)據(jù)被稱為參數(shù)。 主程序和子程序間的數(shù)據(jù)傳遞稱為參數(shù)傳遞。 主程序傳遞給子程序的參數(shù)稱為子程序的入口參數(shù), 子程序返回給主程序的參數(shù)稱為出口參數(shù)。,4.6.4 子程序設(shè)計, 信息保護(hù) 保護(hù)現(xiàn)場:將子程序用到的寄存器壓入堆棧保護(hù)的過程稱為保護(hù)現(xiàn)場。 恢復(fù)現(xiàn)場:將寄存器從堆棧中彈出恢復(fù)的過程。 保護(hù)和恢復(fù)現(xiàn)場的工作可以在調(diào)用程序中進(jìn)行,也可以在子程序中進(jìn)行。 子程序的說明 子程序名、功能、技術(shù)指標(biāo) 子程序入口、出口參數(shù) 子程序使用到的寄存器和存儲單元 是否又調(diào)用其他子程序,4.6.4 子程序設(shè)計,3.主程序與子程序之間的參數(shù)傳遞 (1) 利用寄存器和存儲區(qū)傳送參數(shù) 寄存器傳遞參數(shù):這種方式方便,快速,但只適合參數(shù)較少的情況. 存儲區(qū)傳遞參數(shù):主程序和子程序之間可以利用指定的存儲變量進(jìn)行參數(shù)傳遞,這種方式適合參數(shù)較多的情況。見CH414_1.doc (2) 利用地址表傳送參數(shù) 轉(zhuǎn)子程序前,將參數(shù)地址放入一個表中,將表的首地址作為入口參數(shù)傳遞給子程序,由子程序根據(jù)參數(shù)表中的地址取出對應(yīng)參數(shù)。見ch414_2.doc,4.6.4 子程序設(shè)計,(3)用堆棧傳遞參數(shù) 堆棧適合傳送參數(shù)多,并且子程序有嵌套、遞歸調(diào)用的情況,轉(zhuǎn)子程序前,將子程序用到的參數(shù)壓入堆棧; 進(jìn)入子程序后,由子程序從堆棧中取出所用參數(shù); 對于這種參數(shù)傳遞方法,在子程序中經(jīng)常采用使用帶位移量的返回指令RET n,它可以在恢復(fù)斷點后,將堆棧指針SP加n,從而跳過參數(shù)區(qū),使SP指向參數(shù)壓入堆棧前的那個單元。 見ch414_3.doc,略,4.6.5實用程序舉例排序,一. 排序 例4.17 設(shè)有一個首地址為ARRAY的N字節(jié)數(shù)組,編程序?qū)⑺鼈儼磸拇蟮叫〉捻樞蚺帕?算法設(shè)計:采用冒泡法排序(從大到小) 。,8 16 15 85 32,原始數(shù)據(jù),第1趟,第2趟,第3趟,第4趟,16 15 85 32 8,16 85 32 15 8,85 32 16 158,85 3216158,圖4.13 冒泡排序法程序流程 從大到小排序 有N個數(shù),則排序N-1次 每一次排序過程,兩兩比較,若前一個小于后一個則交換(即小的交換到后面),否則繼續(xù)。 雙重循環(huán)實現(xiàn),外循環(huán)控制比較次數(shù),內(nèi)循環(huán)控制相鄰元素的比較,第i輪比較的內(nèi)循環(huán)次數(shù)是N-i次。 標(biāo)志位的設(shè)立是提高程序效率。,課后思考:若要求從小到大排序,如何實現(xiàn)?,8 16 15 85 32,原始數(shù)據(jù),8 15 16 32 85,第1趟,第2趟,8 15 16 32 85,第3趟,8 15 16 32 85,4.6.5實用程序舉例代碼轉(zhuǎn)換,二. 代碼轉(zhuǎn)換 數(shù)據(jù)輸入輸出過程,ASCII碼,鍵盤輸入,內(nèi)部存儲,二進(jìn)制數(shù),顯示,Ascii碼(串),計算機(jī)直接按二進(jìn)制數(shù)的運算規(guī)則來進(jìn)行算術(shù)運算,字符碼與二進(jìn)制數(shù)的轉(zhuǎn)換,二進(jìn)制十六進(jìn)制,BCD碼十進(jìn)制數(shù),二進(jìn)制十進(jìn)制數(shù),4.6.5實用程序舉例代碼轉(zhuǎn)換,(1) ASCII字符碼轉(zhuǎn)換為二進(jìn)制數(shù) 從鍵盤上獲得的是ASCII碼,需轉(zhuǎn)換成二進(jìn)制數(shù)才能參數(shù)算術(shù)邏輯運算。以輸入數(shù)字78(ASCII碼為3738H)為例,轉(zhuǎn)換的過程如

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論