微型計算機(jī)原理及應(yīng)用:第4章 匯編語言程序設(shè)計_第1頁
微型計算機(jī)原理及應(yīng)用:第4章 匯編語言程序設(shè)計_第2頁
微型計算機(jī)原理及應(yīng)用:第4章 匯編語言程序設(shè)計_第3頁
微型計算機(jī)原理及應(yīng)用:第4章 匯編語言程序設(shè)計_第4頁
微型計算機(jī)原理及應(yīng)用:第4章 匯編語言程序設(shè)計_第5頁
已閱讀5頁,還剩84頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第四章 匯編語言程序設(shè)計4.1 概述4.2 匯編語言的程序結(jié)構(gòu)與語句格式4.3 匯編語言的偽指令語句4.4 匯編語言程序設(shè)計基礎(chǔ)4.5 模塊化程序設(shè)計技術(shù)4.6 實用程序設(shè)計舉例4.1 概述機(jī)器語言:指令和數(shù)據(jù)都是二進(jìn)制代碼,速度快,但編寫,閱讀,交流困難,通用性差。匯編語言:簡單,面向機(jī)器,書寫方便,易于閱讀和檢查??蓪τ布苯硬僮鳎瑑?nèi)存占用少,執(zhí)行速度快。高級語言:獨立于機(jī)器的語言,于問題本身有很好的對應(yīng)關(guān)系。通用性好,占內(nèi)存空間大,執(zhí)行時間長。匯編語言程序的上機(jī)處理過程主要的匯編程序:MASM、TASM例:打印輸出字符串“THIS IS A SAMPLE PROGRAM” ;SAMPLE

2、 PROGRAM DISPLAY MESSAGE ;注釋行 STACK SEGMENT PARA STACK STACK ;定義堆棧段 DB 1024 DUP (0) ;在存儲器的某個區(qū)域建立一個堆棧區(qū) STACK ENDS DATA SEGMENT ;定義數(shù)據(jù)段 MESSAGE DB THIS IS A SAMPLE PROGRAM. ;在存儲器中存放供顯示的數(shù)據(jù) DB 0DH,0AH, $ ;回車換行,并將$作為結(jié)束符 DATA ENDS ;數(shù)據(jù)段結(jié)束 CODE SEGMENT ;定義代碼段 ASSUME CS:CODE,DS:DATA,SS:STACK ;告訴匯編程序段范圍 START:

3、 PROC FAR ;將程序定義為遠(yuǎn)過程 PUSH DS MOV AX,0 ;可用XOR AX,AX PUSH AX ;標(biāo)準(zhǔn)序,以便返回DOS操作系統(tǒng) 4.2匯編語言源程序結(jié)構(gòu)與語句格式例:打印輸出字符串“THIS IS A SAMPLE PROGRAM” MOV AX,DATA MOV DS,AX ;初始化DS LEA BX, MESSAGE ;MESSAGE 地址偏移量給BXLOOP1: CMP BYTE PRT BX,$ JE LOOP2 MOV AH,5 MOV DL,BX INT 21H ;調(diào)用 DOS 5號中斷功能進(jìn)行字符打印輸出 INC BX JMP LOOP1LOOP2: RE

4、T ;返回DOS 操作系統(tǒng)START ENDP ;過程結(jié)束CODE ENDS ;代碼段結(jié)束 END START ;整個程序匯編結(jié)束 4.2匯編語言源程序結(jié)構(gòu)與語句格式匯編語言源程序的結(jié)構(gòu)(化簡)DATA SEGMENT .DATA ENDSSTACK SEGMENT STACK .STACK ENDSCODE SEGMENT ASSUME DS:DATA, SS:STACK, CS:CODESTART: CODE ENDS END START對于具有多個過程的匯編程序框架STACK_SEGSEGMENT PARA STACK STACK ;定義堆棧段 ;定義堆棧深度與堆棧段變量STACK_SE

5、GENDSDATA_SEGSEGMENT PARA PUBLIC DATA;定義數(shù)據(jù)段 ;定義變量DATA_SEGENDSCODE_SEGSEGMENT PARA PUBLIC CODE ;定義代碼段MAINPROC FARASSUME CS:CODE_SEG, DS:DATA_SEGASSUME SS:STACK_SEGSTART:PUSH DS MOV AX,0 PUSH AX MOV AX,DATA_SEG MOV DS,AX ;主過程內(nèi)容 RETMAINENDPPROC_APROC NEAR ;子過程A內(nèi)容,A為主過程調(diào)用PROC_AENDP ;其他過程內(nèi)容CODE_SEGENDS E

6、ND START ;整個程序匯編結(jié)束源程序的結(jié)構(gòu)特點:源程序由若干個段組成(堆棧段,數(shù)據(jù)段,附加段,代碼段。代碼段是必不可少的,數(shù)據(jù)段一般放在代碼段之前進(jìn)行定義,先定義后使用,堆棧段一般要設(shè)置,位置放在前后均可。)代碼段的起始處,用ASSUME來說明各個段寄存器與邏輯段的關(guān)系。并由用戶自己設(shè)置各段寄存器(CS除外)的初值,以建立這些邏輯段的可尋址性。每段以SEGMENT開始,ENDS結(jié)束。整個源程序必須以END語句來結(jié)束,通知匯編程序停止匯編。每個源程序在代碼段中都必須含有返回到DOS操作系統(tǒng)的指令語句,保證程序執(zhí)行完畢后能自動回到DOS狀態(tài)。返回DOS的兩種辦法:(1)將主過程定義為FAR,

7、最后一條指令為RET ;并用標(biāo)準(zhǔn)序返回。 PUSH DS MOV AX,0 PUSH AX(2)不定義主過程為FAR,并無標(biāo)準(zhǔn)序,只在代碼段結(jié)束之前增加兩句。 MOV AH,4CH INT 21HDOS下內(nèi)存的分配示意圖4.2.2匯編語言的語句1.語句的類型:指令語句(執(zhí)行語句)對每個語句,匯編將產(chǎn)生一個一一對應(yīng)的機(jī)器目標(biāo)代碼偽指令語句(指示性語句)不產(chǎn)生目標(biāo)代碼,只是知道匯編程序如何匯編。宏指令語句 用戶自定義指令,比一般的指令強(qiáng),有宏功能。2.指令語句格式:指令語句格式:標(biāo)號: 前綴 指令助記符 操作數(shù) ;注釋偽指令格式名字 偽指令定義符 操作數(shù) ;注釋a.標(biāo)號和名字: (1) 冒號: 標(biāo)

8、號有,名字沒有。 (2)標(biāo)號代表的是指令所在存儲單元的符號地址,作為轉(zhuǎn)移,循環(huán)等的轉(zhuǎn)移目標(biāo), 與具體的指令地址相聯(lián)系。 名字用于定義常量名,變量名,過程名,段名。 (3)標(biāo)號和名字的限制:不超過31個字符串;字母開頭;不能是匯編語言有特定意義的保留字。4.2.2匯編語言的語句b.助記符和定義符 不可缺少,表示操作的類型。系統(tǒng)中共有130個助記符,90多種基本操作。c. 操作數(shù) 指令語句中的操作對象和存放位置及尋址方式。 偽指令中根據(jù)偽操作命令的不同而不同。d.注釋;開始,用來說明語句的功能,便于進(jìn)行閱讀。不匯編也不執(zhí)行。語句中的操作數(shù)1.常量操作數(shù)二進(jìn)制xxxxxxxxB01000101B八進(jìn)

9、制xxxO或xxxQ721O或721Q十進(jìn)制xxxx或xxxxD1991或1991D十六進(jìn)制xxxxH0F1D4H字符串xxx或“xxx”AB 整型數(shù)值常量、字符串常量 和以賦值的常數(shù)標(biāo)識符(符號常量) 數(shù)值常量、符號常量(用EQU或=定義)注意: (1)十六進(jìn)制的第一個數(shù)字必須是09。 AB應(yīng)寫為 0AB (2) 字符常量用單引號括起來。語句中的操作數(shù)2.寄存器操作數(shù) 操作數(shù)是寄存器名3.存儲器操作數(shù) 標(biāo)號:某條指令所存放單元的符號地址或過程起點位置,在代碼段內(nèi)。 變量:存放在存儲單元的值。變量名可認(rèn)為是存放數(shù)據(jù)的存儲單元的符號地址, 一般在數(shù)據(jù)段或堆棧段。 存儲器操作數(shù)的三種屬性: 段屬性

10、: 段基址 偏移量: 相對于段基址的段內(nèi)偏移量。 類型: BYTE ,WORD, DWORD, 四字和十字節(jié), NEAR, FAR4.表達(dá)式操作數(shù) (由操作數(shù)、運算符和操作符組成)(P127,128) 數(shù)值表達(dá)式 地址表達(dá)式操作數(shù)可以是寄存器、常量(數(shù)值常量、符號常量)、存儲器操作數(shù)(標(biāo)號、變量)運算符包括:算術(shù)運算符、邏輯運算符、關(guān)系運算符、數(shù)值返回運算符和屬性運算語句中的操作數(shù)算術(shù)運算符 + - * / MOD (變量地址+/-) 邏輯運算符 (位)AND/OR/XOR/NOT關(guān)系運算符 關(guān)系運算符有:EQ(等于),NE(不等),LT(小于),GT(大于),LE(小于或等于),GE(大于或

11、等于)等。 參與關(guān)系運算的必須是兩個數(shù)值,或同一段中的兩個存儲單元地址,但運算結(jié) 果只可能是兩個特定的數(shù)值之一:當(dāng)關(guān)系不成立(假)時,結(jié)果為0;當(dāng)關(guān)系成立(真)時,結(jié)果為0FFFFH。例如,MOV AX,4 EQ 3;關(guān)系不成立,故(AX)0 MOV AX,4 NE 3;關(guān)系成立,故(AX)0FFFFH語句中的操作數(shù)分析運算符 用以分析提取一個存儲器操作數(shù)的屬性,如段、偏移量或類型等。 OFFSET、SEG、TYPE、SIZE、LENGTH;合成運算符 可規(guī)定存儲器操作數(shù)的某個屬性,例如類型。 PTR、THIS、SHORT (類似類型強(qiáng)制轉(zhuǎn)換) INC WORD PTR BX ADD BYTE

12、 PTR 1000H, 38H4.3匯編語言的偽指令語句指示性語句又稱為偽指令,偽指令語句沒有對應(yīng)的機(jī)器指令,不由CPU執(zhí)行,而是在匯編程序匯編時識別,用于說明CPU的類型,段結(jié)構(gòu),源程序起止信息和段內(nèi)存安排等.4.3.1基本偽指令一、符號定義偽指令符號名 EQU 表達(dá)式(全局,唯一,同一源程序只能定義一次,匯編替換) COUNT EQU 2000 (P137)符號名 = 表達(dá)式 COUNT=2000 (功能與EQU類似,但可多次定義)二、數(shù)據(jù)定義偽指令1.數(shù)據(jù)定義的格式: 變量名 數(shù)據(jù)定義符 操作數(shù) ,操作數(shù) . ,操作數(shù) 數(shù)據(jù)定義符:DB, DW,DD, DQ, DT2.數(shù)據(jù)定義語句的具體

13、形式和功能(p135) (1)為數(shù)據(jù)項分配存儲單元,用變量名表示存儲單元的名稱 (2)預(yù)留若干字節(jié) ? (3)引入若干個用逗號分隔的操作數(shù)用來定義一個表(數(shù)組) DUP 重復(fù)數(shù)據(jù)定義操作符, 可重迭和嵌套使用。 (4)用DB偽指令在內(nèi)存中定義一個字符串4.3匯編語言的偽指令語句(5)當(dāng)操作數(shù)式標(biāo)號或變量時,用DW 或DD將標(biāo)號或變量的偏移地址或全地址來初始化存儲器(6)數(shù)據(jù)定義語句定義的變量的類型,在訪問由此變量生成的新的操作數(shù)時產(chǎn)生正確的目標(biāo)代碼。訪問變量時操作數(shù)的類型與定義時的要一致。3. 分析和合成操作符。分析運算符 用以分析提取一個存儲器操作數(shù)的屬性,如段、偏移量或類型等。 OFFSE

14、T、SEG、TYPE、SIZE、LENGTH;OFFSET 可以得到一個標(biāo)號或變量的偏移地址(定位后已知) MOV SI,OFFSET DATA1 LEA SI, DATAl LEA SI, DATA1BX+100 SEG 可以得到一個標(biāo)號或變量的段值 MOV AX,SEG ARRAY MOV DS,AX4.3匯編語言的偽指令語句TYPE 結(jié)果=類型數(shù)值(與存儲器操作數(shù)類型屬性的對應(yīng)) B-1;W-2/DD-4/NEAR-(-1)/FAR(-2) n DUP(?)=?VAR DW ?;變量VAR的類型為字 2ARRAY DD 10 DUP(?); 變量ARRAY的類型為雙字:type ARRA

15、Y= 4STR DB This is a test;變量STR的類型為字節(jié) 1 : MOV AX, TYPE VAR;(AX)2MOV BX, TYPE ARRAY;(BX)4MOV CX,TYPE STR; (CX) 14.3匯編語言的偽指令語句LENGTH 一個變量DUP定義的變量總數(shù) 非DUP則=1 (LENGTH ARRAY=10)SIZE 一個變量第一個DUP定義的字節(jié)總數(shù) (變量TYPE*LENGTH) 非DUP則=TYPE 例 V1 DB 20 DUP(?),20,100H DUP(A) V2 DD 4000H SIZE V120 SIZE V2=4K1 DB 4 DUP(0)K

16、2 DW 10 DUP(?)K3 DD 1,2,3BB:MOV AL,LENGTH K1 MOV BL,LENGTH K2 MOV CL,LENGTH K3 BB:MOV AL, 4 MOV BL,10 MOV CL,14.3匯編語言的偽指令語句合成運算符 可規(guī)定存儲器操作數(shù)的某個屬性,例如類型。 PTR、THIS、SHORT (類似類型強(qiáng)制轉(zhuǎn)換) INC WORD PTR BX ADD BYTE PTR 1000H, 38HPTR (強(qiáng)制)指定MEM操作數(shù)類型,不明或強(qiáng)制 MOV AX,BXINC BYTE/WORD PTR BXTHIS(同C中UNION聯(lián)合體) 同一變量區(qū),可按不同類型訪

17、問(BYTE/WORD/DWORD) V1WEQU THIS WORDV1BDB 10 DUP(?)MOV AX,(WORD PTR) V1B ;強(qiáng)制轉(zhuǎn)換(否則Warning或Error)SHORT 127/+128 短標(biāo)號 JMP SHORT SLABLE4.3匯編語言的偽指令語句三。程序分段偽指令 SEGMENT / ENDS 邏輯段存儲定位關(guān)系 SEGMENT 定位類型,組合類型,類別. PARA (節(jié)ParagraphXXXX0H) BYTE (任意) WORD (偶數(shù)地址) PAGE (頁256XXX00)四種定位類型:確定段的邊界定位(浮動預(yù)設(shè)為常量,相對關(guān)系LINK)SEGMEN

18、T / ENDS SNAME SEGMENT 定位類型,組合類型,類別. NONE 不組合(本段與其它段無聯(lián)系,無說明時默認(rèn)組合類型) PUBLIC 多個模塊相同段名鄰接在一起,共用一個段地址 STACK 鏈接后為堆棧段,同Public( 相同段名裝配合一) 鏈接時自動初始化SS和SP EXE文件裝入時SP初值=末指針+1(棧底) COMMON 公用 不同程序遇到同名時同一地址裝入,覆蓋重疊臨時變量,以最長為界 MEMORY 將本段放在被鏈接在一起的其他段后置于地址最高處,多個時取第一個,其余作為COMMONAT 表達(dá)式 定位在指定段基位置,為標(biāo)號或變量賦予絕對地址,不能用來指定代碼段。 AT

19、 2000H 起始物理地址20000H; 類別(名稱 )決定裝入順序,順序裝入,相同類別連續(xù)裝入成一塊(段)常用的類別有STACK,CODE,DATA等。 ENDS -段結(jié)束段寄存器說明偽指令A(yù)SSUME : ASSUME 段寄存器名:段名,段寄存器名:段名,例如, ASSUME CS:CSEG,DS:DSEG告訴匯編程序:從現(xiàn)在開始,CS寄存器對應(yīng)CSEG段,DS寄存器對應(yīng)DSEG段。注意:段使用設(shè)定語句是偽指令語句,它不能設(shè)置段寄存器的值,即段寄存器還沒有指向?qū)?yīng)的段。所以在程序中還需要通過指令語句來給數(shù)據(jù)段寄存器和附加段寄存器賦值。P140 例題3.組定義偽指令GROUP 將若干不同名的

20、段集合成一個組,共用一個組名,使其裝在同一個物理段中。 組名 GROUP 段名,段名組名是識別組的標(biāo)志,表示組的起始地址。4.地址指定偽指令ORG 作用:用來指定某條語句或某個變量 偏移地址。格式為:ORG 表達(dá)式 ORG $+表達(dá)式 則此數(shù)值表達(dá)式的值將作為下一條指令語句或變量的偏移地址。例:DATA SEGMENTORG 2 VAR1DB2,3,4 ORG$+3 ;此時 $=05H VAR2 DW1234H DATAENDS0203043412VAR1028VAR2程序計數(shù)器$作用:字符$的值為程序下一個所分配的存儲單元的偏移地址。例: DATASEGMENT B1 DB 16 DUP(?

21、) A1DB 10H,20H,30H CEQU $-A1 DATAENDS 則 $-A1=13H-10H=03H四。模塊定義偽指令與通信偽指令四。模塊定義偽指令與通信偽指令1。模塊定義偽指令NAME/END 格式為: NAME 模塊名 ;取名字 END 標(biāo)號 ;結(jié)束 格式為: TITLE 模塊名 ;指定所打印模塊的標(biāo)題 END 標(biāo)號 ;結(jié)束 整個模塊的結(jié)束使用 END 標(biāo)出,當(dāng)匯編器讀到 END 時,它認(rèn)為模塊到此就結(jié)束了。(通常使用END后跟模塊開始處的標(biāo)號。)注: NAME 、TITLE 操作不是必須的。若省略,則將源文件名作為目標(biāo)模塊的名字。 END 則必不可少。2。模塊通信偽指令 各模

22、塊之間數(shù)據(jù)或過程的互訪和共享。全局符號定義即引用偽指令PUBLIC/EXTRN,PUBLIC 名字 ,名字 ;名字可以是標(biāo)號,變量名,過程名/EXTRN 名字:類型 ,名字:類型 ;類型為 DB DW DD NEAR FAR 等一起配對使用五、 過程和宏定義偽指令 1。過程定義PROC/ENDP 和其它程序設(shè)計一樣,8086/8088匯編程序設(shè)計有過程或子程序的設(shè)計方法。8086/8066匯編程序的過程從運行位置上分為近過程(NEAR)和遠(yuǎn)過程(FAR),其定義如下: 過程名 PROC NEAR/FAR RET 過程名 ENDP其中:過程名由編程者任?。?如果在過程定義中沒有寫明是NEAR過程

23、或FAR過程,則匯編器將這個過程默認(rèn)為NEAR過程。用CALL 調(diào)用, RET 返回。 2.宏指令的定義(為了在源程序中不重復(fù)書寫多次要用到的程序,因此用宏指令來代替,匯編時產(chǎn)生所需的代碼) 由標(biāo)號、宏指令和注釋構(gòu)成。由編程者根據(jù)宏指令定義規(guī)則,將一組指令或偽指令集中定義為一條“宏大”的指令,即可以用一條已定義的宏指令代替多條語句。宏指令定義格式:宏指令名 MACRO , , ;宏體 ENDM其中:宏指令名由編程者任??; 形式參數(shù)在調(diào)用宏指令時用實在參數(shù)來替代,也可以不設(shè)參數(shù)。最多不超過132個.例:將對某一寄存器的移位操作定義為一個宏指令。(1)SHIFT MACRO MOV CL,4 SH

24、L AX,CL ENDM宏指令 SHIFT 將AX左移4 次。(2)SHIFT MACRO CN MOV CL,CN SHL AX,CL ENDM則 SHIFT 4 ;將AX左移4 位。 SHIFT 5 ;將AX左移5 位。不設(shè)參數(shù)設(shè)一個參數(shù)(3)SHIFT MACRO CN,R MOV CL,CN SHL R,CL ENDM則 SHIFT 4 ,AX ;將AX左移4 位。 SHIFT 2, BX ;將BX左移2 位。(4)SHIFT MACRO CN,R,SD MOV CL,CN S & SD R,CL ;用&將參數(shù)標(biāo)注出來,以便替換 ENDM則 SHIFT 4 ,AX ,HL ;將AX左移

25、4 位。 SHIFT 2,BX ,HR ;將BX右移2 位。設(shè)二個參數(shù)設(shè)三個參數(shù)二.宏指令的使用 使用宏指令時需要將形式參數(shù)用一一對應(yīng)的實在參數(shù)替代。當(dāng)實在參數(shù)個數(shù)多于形式參數(shù),忽略多余的形式參數(shù)。當(dāng)實在參數(shù)個數(shù)少于形式參數(shù),多余的形式參數(shù)設(shè)為空白。 宏指令中的參數(shù)可以為:常數(shù)、寄存器、存儲單元名、地址表達(dá)式以及指令的助記符或助記符的一部分。例:SHIFT MACRO R,CN MOV CL,CNSHL R,CLENDMDATA SEGMENTX DB 08HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA MAIN PROC FARPUSH DSMOV

26、AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV BX,OFFSET XMOV AL,BXSHIFT AL,4RET MAINENDP CODE ENDSEND MAIN3.取消宏指令 偽指令PURGE 宏指令一經(jīng)定義,在整個程序中有效,若宏指令名與指令或偽指令助記符相同,則宏指令優(yōu)先級更高。 若出現(xiàn)了這種情況,應(yīng)在一定時取消宏指令,使失效的指令或偽指令恢復(fù)功能。格式如下: PURGE , ,宏與過程的區(qū)別(重復(fù)執(zhí)行的程序不長,重復(fù)次數(shù)較多,用宏. 程序長,重復(fù)次數(shù)少,用子程序)(1)宏在編譯時完成擴(kuò)展,過程調(diào)用是在程序執(zhí)行時完成的。(2)宏可以直接傳遞參數(shù)和接收參數(shù),不需

27、要通過堆棧等媒介來進(jìn)行。因此編程比較容易。而過程不能直接帶參數(shù),當(dāng)過程之間需要傳遞參數(shù)時,必須通過堆棧,寄存器或存儲器進(jìn)行。(3)宏只能簡化源程序的書寫,而沒有縮短目標(biāo)代碼的長度。而過程調(diào)用能夠縮短源程序目標(biāo)代碼的長度,節(jié)約內(nèi)存。(4)宏操作不會在執(zhí)行目標(biāo)代碼時增加額外的時間開銷。而過程調(diào)用涉及現(xiàn)場和斷點的保護(hù)和恢復(fù),因而有額外的時間開銷。延長目標(biāo)程序的執(zhí)行時間。列表偽指令和條件匯編偽指令列表文件(.LST)原程序與目標(biāo)程序?qū)φ招问浇o出匯編結(jié)果交叉列表文件(.CRE)按字母順序列出源程序中所用的符號清單及其使用情況,并給出他們在程序中的使用行號。TITLE 給源程序指定一個標(biāo)題 格式: TIT

28、LE 標(biāo)題行 若標(biāo)題行省略, 則標(biāo)題為空。 SUBTTL 給源程序指定一個副標(biāo)題 格式: SUBTTL 副標(biāo)題行 若副標(biāo)題行省略,則副標(biāo)題為空。 PAGE 用于形成或定義列表文件每頁的行列數(shù)。 格式: PAGE 行數(shù)列數(shù) 若參數(shù)缺省,則從新的一頁開始,并顯示新頁的標(biāo)題、子標(biāo)題及文件的其余部分。條件偽指令條件偽操作格式: IF 表達(dá)式 程序塊1 ELSE 程序塊2 ENDIF當(dāng)IF指令中的表達(dá)式為真時,被匯編的代碼段是程序塊1;當(dāng)IF指令中的表達(dá)式為假時,被匯編的代碼段是程序塊2。 在一個條件結(jié)構(gòu)中,僅有一個代碼段被匯編,其它的則被忽略。 4.4 匯編語言程序設(shè)計基礎(chǔ) 匯編語言程序設(shè)計與其它語言

29、的程序設(shè)計一樣,都要有良好的數(shù)據(jù)結(jié)構(gòu)和算法,對每個要解決的問題要經(jīng)過如下步驟: 根據(jù)問題提出相應(yīng)的算法或邏輯過程;(建立數(shù)學(xué)模型并確定算法) 根據(jù)已確定的算法或邏輯過程畫出程序流程圖,把解題的思路和邏輯 順序以圖示的方法表示出來。(畫出流程圖)分配工作單元和寄存器。編寫程序代碼,調(diào)試。程序的效率是程序設(shè)計好壞的重要指標(biāo),匯編語言程序運行效率的衡量標(biāo)準(zhǔn):程序的執(zhí)行時間。程序所占有的字節(jié)數(shù)。有一些計算機(jī)系統(tǒng),可能應(yīng)用于工業(yè)控制或工業(yè)過程檢測,不需要過多的硬件資源,比如存儲單元,所以就要求的程序有盡可能少的字節(jié)數(shù),以滿足縮減硬件資源的要求。 程序的語句行數(shù)。注:1、突出匯編的特色:合理組織數(shù)據(jù),充分

30、發(fā)揮內(nèi)部寄存器的作用,突出匯編語言在執(zhí)行速度快、占用存儲空間少和易于實現(xiàn)對硬件控制等優(yōu)點。 2、采用結(jié)構(gòu)化和模塊化的設(shè)計方法,使每個模塊都由基本結(jié)構(gòu)程序順序組成。 寫好注釋和程序文檔,便于閱讀,測試,維護(hù)和交流,移植及連接和共享。例1:將一個字節(jié)乘以128我們可以通過: MOV AL, DATA MOV BL, 128 MUL BL也可以通過 MOV AL,DATA MOV CL,7 SHL AL,CL來完成。 從運行時間上,后一個要快于前一個程序。 例2:數(shù)AL中的“1”的個數(shù):程序1: MOV AH, 0 MOV CX, 8 AGAIN: SHL AL, 1 JC ADD1 JMP NEX

31、T ADD1: INC AH NEXT: LOOP AGAIN HLT程序2: MOV AH, 0 CLC ;CF置0 AGAIN: SHL AL, 1 ADC AH, 0 OR AL, AL JNZ AGAIN HLT顯然,程序2在運行效率和程序行數(shù)上都優(yōu)于程序1。4.4.2 程序的基本結(jié)構(gòu)任何程序都可以由以下三種基本結(jié)構(gòu)程序構(gòu)成結(jié)構(gòu)化程序:順序結(jié)構(gòu)、條件結(jié)構(gòu)(分支結(jié)構(gòu))和循環(huán)結(jié)構(gòu)。一、 直線程序(順序結(jié)構(gòu)) 直線程序設(shè)計是程序設(shè)計中最簡單的設(shè)計方法,它是將確定好的算法或邏輯關(guān)系以正確的語句和正確的邏輯關(guān)系有序地編寫出來,形成程序。語句1語句2語句3語句n例1:表達(dá)式程序編程計算Z=(x*x

32、-3y)/2。設(shè)X、Y為單字節(jié)正整數(shù),結(jié)果Z用二個字節(jié)來存放。DATASEGMENTXDB25YDB32ZDW?DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATAEXPREPROCFARSTART:PUSH DSSUB AX,AXPUSH AX MOV AX,DATA MOV DS,AX MOV AL,X MUL AL ; x*xAXMOV BL,YADD BL,BL ; 2yBLADD BL,YSUB AX,BX ;x*x-3yAXSHR AX,1 ; /2MOV Z,AXRETEXPRE ENDPCODE ENDSEND START2.查表程序(可參看書中P

33、165例4.55) 利用查表法求Y=X*X*X。設(shè)X為0-6之間的數(shù),存放在XVAL單元,結(jié)果Y存入YVAL單元,立方表從TABLE單元開始存放。DATASEGMENTTABLEDB 0,1,8,27,64,125,216XVALDB 6YVAL DB ?DATA ENDSSTACK SEGMENT PARA STACK STACKDB 50 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART: PROC FAR PUSH DS MOV AX,0 PUSH AX ;標(biāo)準(zhǔn)序 MOV AX,DATA MOV DS,AX

34、;初始化DS MOV BX,OFFSET TABLE MOV AH,0 MOV AL,XVAL ADD BX,AX ;XLAT代替左邊兩句 MOV AL,BX MOV YVAL,AL RETSTART ENDPCODE ENDS END START例3 將ASCII碼58表示的十進(jìn)制數(shù)轉(zhuǎn)換為機(jī)內(nèi)二進(jìn)制。設(shè)緩沖區(qū)起始地址為BUF,轉(zhuǎn)換后的數(shù)存放在XX單元中 。 DOSSEG .MODEL SMALL .STACK 256 .DATABUF DW 58XX DB ? .CODESTART: MOV AX,DGROUP MOV DS,AX MOV CL, 10 MOV BX, BUF ;BX=353

35、8 AND BH, 0FH ;BH=05H MOV AL,BH MUL CL ;AX=50 AND BL,OFH ;BL=8 ADD AL,BL ;AL=(58)B MOV XX,AL MOV AX,4C00H INT 21H END START分支結(jié)構(gòu) TEST AX, 1 JZ LYLN: .LY: . . 程序段N 后繼程序段 Y條件NYIF THEN分支結(jié)構(gòu) TEST AX, 1 JZ LYLN: . JMP L0LY: .L0: .程序段 Y程序段N 條 件后繼程序 YNIF THEN ELSE1.利用比較和轉(zhuǎn)移指令實現(xiàn)2.利用跳轉(zhuǎn)表實現(xiàn)DATA SEGMENTX DB 3Y DB

36、?DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART: MOV AX, DATA MOV DS, AX MOV AL,X CMP AL,0 JGE BIGER MOV AL, 0FFH ; 小于時賦-1 MOV Y,AL JMP NEXTBIGER: JE EQUL MOV AL,1 ; 大于時賦1 MOV Y,AL JMP NEXTEQUL: MOV Y,AL ;等于時直接輸出NEXT: MOV AH, 4CH INT 21HCODE ENDS END START例1 :有一數(shù)學(xué)函數(shù)如下: 1 x0 y=f(x)= 0 x=0 -1 x0 X

37、取值范圍:-128+127 要求寫出程序完成上述計算。三、 循環(huán)結(jié)構(gòu)(P169) 對于程序中多次、有規(guī)律執(zhí)行的部分,通常使用循環(huán)結(jié)構(gòu)重復(fù)運行這些部分,使程序有較高的運行效率和可讀性。循環(huán)結(jié)構(gòu)主要由三部分組成,它們是: 1. 循環(huán)體:重復(fù)運行的部分,包含了工作部分和循環(huán)控制部分。工作部分進(jìn)行相應(yīng)的操作,而循環(huán)控制部分則保證在不滿足循環(huán)條件時,跳出循環(huán)。 2. 循環(huán)結(jié)束條件:在循環(huán)體中包括了循環(huán)結(jié)束條件運算部分。每循環(huán)一次除了工作部分進(jìn)行相應(yīng)的操作外,循環(huán)條件部分還要通過運算,得出當(dāng)前循環(huán)的狀態(tài),以便在適當(dāng)?shù)臈l件下結(jié)束循環(huán)。 3. 循環(huán)初值:用于設(shè)置開始循環(huán)時,循環(huán)體所處的初始狀態(tài),如循環(huán)變量初值

38、,循環(huán)體中用到的數(shù)據(jù)和地址指針等。循環(huán)結(jié)構(gòu)DO-UNTILWHILE-DO例:計算1+2+3+100 MOV AX, 0 MOV BX, 0 MOV CX, 64HSUM:INC BX ADD AX, BX LOOP SUM循環(huán)控制的方法:(1)計數(shù)控制: 循環(huán)次數(shù)已知,每循環(huán)一次加/減1;(2)條件控制:循環(huán)次數(shù)未知,須根據(jù)條件真假控制循環(huán);(3)狀態(tài)控制:根據(jù)事先設(shè)置或?qū)崟r檢測到的狀態(tài)來控制循環(huán);(4)邏輯尺控制:在多次循環(huán)過程中需分別做不同的操作時,可通過建立位串(邏輯尺來控制循環(huán))。具體采用那種控制方法需進(jìn)行比較,選擇效率高的方案來實現(xiàn)。DATA SEGMENTSUM DW ?DATA

39、 ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART PROC FARBEGIN: PUSH DS XOR AX, AX PUSH AX ;標(biāo)準(zhǔn)序 MOV AX, DATA MOV DS ,AX MOV CX, 10 該程序是一個以計數(shù)器為循環(huán)條件的循環(huán)結(jié)構(gòu),是循環(huán)中常見的結(jié)構(gòu)之一。例1:求1-10的累加和。 MOV AX, 0 MOV BX, 0AGAIN: INC BX ADD AX, BX LOOP AGAIN MOV SUM, AX RETSTART ENDPCODE ENDS END BEGINDATA SEGMENTSTR DB PLEASE

40、 INPUT YOUR NAME$LEN DW ?DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART PROC FARBEGIN: PUSH DS MOV AX, 0 PUSH AX MOV AX, DATA MOV DS, AX MOV CX, 0 LEA BX, STR上述程序是一個以控制條件為循環(huán)條件的循環(huán)結(jié)構(gòu)。(循環(huán)次數(shù)未知)AGAIN: MOV AL, BX CMP AL, $ JZ HALT INC CX INC BX JMP AGAINHALT: MOV LEN, CX RET START ENDPCODE ENDS END BE

41、GIN例2:有一以“$”結(jié)束的字串,請求出它的長度。例3:求10個雙字節(jié)數(shù)之和S,S=X0+X1+X9,將和存入SUM單元,設(shè)和S32767。DATA SEGMENTBLOCK DW 0028H,0139H,1005H,2133H,00A5H DW 3010H,123CH,2AC5H,3300H,1122H COUNT EQU ($-BLOCK)/2SUM DW ?DATA ENDSSTACK SEGMNET PARA STACK STACK DW 50 DUP (?)STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKMAIN PRO

42、C FARSTART:PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV AX,0 MOV BX,OFFSET BLOCK MOV CX,COUNT AGAIN:ADD AX,BX INC BX INC BX DEC CX JNZ AGAIN MOV SUM,AX RET MAIN ENDP CODE ENDS END START ;用計數(shù)器來進(jìn)行循環(huán)條件判斷例4:設(shè)有數(shù)組 X x1, x2, x3 , x10 ,數(shù)組 Y y1, y2, y3 , y10 ,試編程計算 z1= x1-y1 z2 = x2+y2 z3 = x3-y3 z4 =

43、 x4+y4 z5 = x5-y5 z6 = x6-y6 z7 = x7+y7 z8 = x8-y8 z9 = x9-y9 z10=x10-y10開始初始化:設(shè)邏輯尺,地址指針,循環(huán)次數(shù)i=0測試邏輯尺第 i 位的值 = 0 ?Xi-yiXi+yiZi 結(jié)果 i i+1循環(huán)結(jié)束 ?結(jié)束nyyn設(shè)邏輯尺:0 0 0 0 0 0 1 1 1 0 1 1 0 1 0 1Data segmentX dw 11,22,33,44,45,66,77,88,99,100Y dw 1,2,3,4,5,6,7,8,9,10Z dw 10 dup( ?)Logrule dw 0000001110110101bDa

44、ta endsCode segment assume cs:code, ds: dataStart proc farBegin: push ds xor ax, ax push ax Subtract: sub ax, ybx result: mov zbx, ax inc bx inc bx loop again retStart endp Code ends end Begin mov ax, data mov ds, ax mov bx, 0 mov cx, 10 mov dx, logrule again: mov ax, xbx shr dx, 1 jc subtract add a

45、x, ybx jmp result上述程序為用邏輯尺控制循環(huán)的循環(huán)結(jié)構(gòu)。 DELAY: PUSH AX PUSH DX MOV DX, 3FFH TIME1: MOV AX, 0FFFFH TIME2: DEC AX NOP JNE TIME2 DEC DX JNE TIME1 POP DX POP AX RET 在循環(huán)中,多重循環(huán)也是程序設(shè)計中常用的結(jié)構(gòu)之一,多重循環(huán)通常有多個循環(huán)變量。在多重循環(huán)中,各自的循環(huán)變量要明確,否則將導(dǎo)致循環(huán)體的混亂。以兩重循環(huán)為例,外層循環(huán)的循環(huán)次數(shù)為N,內(nèi)層循環(huán)次數(shù)為M,則內(nèi)層體被運行了NM次。下面是一個用于延時的子程序。多重循環(huán)的程序設(shè)計多重循環(huán)(P172)

46、例5: 延時子程序例:找出無序列中的最大值和最小值。 方法1: 逐個查找 方法2: 排序后,第一個及最后一個即是。 (二)排序 例:一種簡單的排序方法冒泡排序法。冒泡排序法算法舉例 每遍比較次數(shù) 比較遍數(shù) 1 2 3 4 結(jié)果 8 8 16 32 84 5 16 32 84 3216 32 84 16 1632 84 8 8 8 84 5 5 5 5 segmentBuffer dw 8, 5, 16, 32, 84Count equ $-bufferData endsCode segment assume cs:code ,ds:dataMain proc farBegin: push ds

47、 mov ax,0 push ax mov ax,data mov ds, ax mov cx, count shr cx, 1 dec cx mov dx, cxLoop1: mov bx, 0Loop2: mov ax, bufferbx cmp ax, bufferbx+2 jge continue xchg ax, bufferbx+2 mov bufferbx, axContinue: add bx, 2 dec cx jnz loop2 dec dx mov cx,dx jnz loop1 ret main endp code ends end begin 冒泡排序法算法舉例 每遍

48、比較次數(shù) 比較遍數(shù) 1 2 結(jié)果 8 8 84 5 84 3284 32 1632 16 816 5 5例:冒泡排序法的改進(jìn)程序 當(dāng)比較遍數(shù)小于額定值時。Data segmentBuffer dw 8, 5, 84, 32, 16Count equ $-bufferData endsCode segment assume cs:code ,ds:dataMain proc farBegin: push ds mov ax,0 push ax mov ax,data mov ds, ax mov cx, count shr cx, 1 dec cx mov dx, cxLoop1: mov di

49、, 0 ; 設(shè)置標(biāo)志 mov bx, 0Loop2: mov ax, bufferbx cmp ax, bufferbx+2 jge cotinue xchg ax, bufferbx+2 mov bufferbx, ax mov di, -1 ; 若產(chǎn)生交換置-1 Cotinue: add bx, 2 dec cx jnz loop2 dec dx mov cx,dx cmp di, 0 ; 整遍比較都沒有產(chǎn)生交換 jnz loop1 retmain endpcode ends end begin DATA SEGMENTARRAY DB 28,75,3,46,5,61,30COUNT EQ

50、U $-ARRAYDATA ENDSSTACK SEGMENT PARA STACK STACK DB 50 DUP(?)STACK ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACKMAIN PROC FARSTART: PUSH DS MOV AX, 0 PUSH AX MOV AX, DATA MOV DS, AX MOV ES, AX MOV BL, 0FFH ;標(biāo)志,為0時表示本輪無交換操作。AGAIN0: CMP BL, 0 JE DONE XOR BL, BL ;BL=0 MOV CX, COUNT DEC CX

51、 XOR SI, SIAGAIN1: MOV AL, ARRAYSI CMP AL, ARRAYSI+1 JBE UNCHEXCH: XCHG ARRAYSI+1, AL MOV ARRAYSI, AL MOV BL, 0FFHUNCH: INC SI LOOP AGAIN1 JMP AGAIN0DONE: RETMAIN ENDPCODE ENDS END START 例:冒泡排序法大循環(huán),掃描次數(shù)賦初值(N-1).MOV BL, 0FFHMOV DX, 0 AGAIN0: CMP BL, 0 JE DONE XOR BL, BL INC DX MOV CX, COUNT SUB CX,DX

52、 XOR SI, SIAGAIN1: MOV AL, ARRAYSI CMP AL, ARRAAYSI+1 JBE UNCHEXCH: XCHG ARRAYSI+1, AL MOV ARRAYSI, AL MOV BL, 0FFHUNCH: INC SI LOOP AGAIN1 JMP AGAIN0DONE: RETMAIN ENDPCODE ENDSEND START 例。冒泡排序法修改 修改代碼處(三)有序列例:在有序列中搜查是否有關(guān)鍵字key。 方法1:首先確定該數(shù)在此序列中(大于等于序列中第一個數(shù)而小于等于最后一個數(shù)。然后,從序列的第一個元素起,逐個比較查找。 方法2:對分搜索。 si

53、dibx=(si+di)/2(al)=keyAl 比 bx: al =bx, 則找到關(guān)鍵字 albx; 則關(guān)鍵字落入下半?yún)^(qū)間sidibx=(si+di)/2disidibx=(si+di)/2siData segmentBuffer dw -80, -60,40,79, 100,130Count equ $-bufferChar dw 79Ptrn dw ?Data endsStack segment para stack stack db 100 dup(?)Stack endsCode segment assume cs:code ,ds:dataMain proc farBegin: p

54、ush ds mov ax,0 push ax mov ax,data mov ds, ax lea si, buffer mov cx, count shr cx, 1 mov di, si add di, cx mov ax, char conti: mov bx, si add bx, di shr bx, 1 ;取搜索區(qū)間的中間地址 cmp ax, bx ;將中間值與關(guān)鍵字比較 je found ;相等,則找到關(guān)鍵字 pushf cmp bx, si ;所取中間地址是否與搜索區(qū)間上限相等 je nofod ;相等,則證明區(qū)間已壓至最小,找不到 關(guān)鍵字 popf jl Less ; 關(guān)鍵

55、字小于中間值,下次搜索區(qū)間轉(zhuǎn)至上半個區(qū)間 mov si, bx ; 關(guān)鍵字大于中間值,下次搜索區(qū)間轉(zhuǎn)至下半個區(qū)間 jmp nextLess: mov di, bx next: jmp conti nofod: mov bx, -1 ;找不到,則存入-1Found: mov ptrn, bx ;找到,則存入關(guān)鍵字的地址。 ret Main endp Code ends end start sidibxsisidibxdi例6:在一個有序列中插入一項。 abcefghijklnopqrs要求插入d abcdefghijklnopqrs 找到應(yīng)插在何處對分搜索; 所有關(guān)鍵值后面的元素的地址均移高一個

56、項單元 1000 1001 1002 1003 1004 1005 1006 a b c e f g h 1000 1001 1002 1003 1004 1005 1006 1007 a b c e f g h ; 插入 例:設(shè)一有序數(shù)組ARY,其中存放無符號十六位數(shù)。數(shù)組首地址為ARY_HEAD,末地址為ARY_END,編程將正數(shù)N插入該數(shù)組。DAREASEGMENTXDW ?ARY_HEAD DW 2,6,8,13,21,30,47,53,66,90ARY_ENDDW 125NDW 18DAREAENDSCODESEGMENTMAINPROC FARASSUME CS:CODE,DS:D

57、AREASTART:PUSH DSXOR AX,AXPUSH AXMOV AX,DAREAMOV DS,AXMOV AX,NMOV ARY_HEAD -2,0FFFFHMOV SI,0COMPARE: CMP ARY_END SI,AXJLE INSERTMOV BX,ARY_END SIMOV ARY_END SI+2,BXSUB SI,2JMP SHORT COMPAREINSERT:MOV ARY_END SI+2,AXRETMAIN ENDPCODE ENDSEND START在子程序設(shè)計中需注意的問題:1.主程序和子程序的連接通過CALL(主) 和RET(子)來實現(xiàn)。分段內(nèi)和段間(入

58、CS,IP。出IP,CS)2. 現(xiàn)場的保護(hù)。將相應(yīng)的寄存器的值推入堆棧,子程序結(jié)束時彈出。在子程序中應(yīng)合理地保存主程序和子程序都用到的寄存器和存儲單元,以使主程序能正確地運行。(保護(hù)現(xiàn)場)3. 要明確地定義子程序的入口參數(shù)和出口參數(shù),使調(diào)用者能方便地使用子程序。 (從主程序中獲取的參數(shù)為入口參數(shù),返回給主程序的參數(shù)為出口參數(shù)) 參數(shù)傳送主要有三種方式: 利用寄存器傳送參數(shù)(快,但適合參數(shù)較少的情況) 利用堆棧傳送參數(shù)(適用參數(shù)多,且有嵌套,遞歸) 公用數(shù)據(jù)區(qū)(存儲單元)傳送(參數(shù)多,但要建立參數(shù)表)4.4.4、 子程序設(shè)計與調(diào)用(p174)子程序是提高程序設(shè)計效率的良好手段,也為模塊化設(shè)計提供

59、了很好的基礎(chǔ)。對于多次重復(fù)使用的程序、具有通用性的程序便于共享(代碼轉(zhuǎn)換)、中斷處理等采用子程序的方式。(子程序應(yīng)包括程序體和說明文檔).MODEL SMALL.STACK .DATA MESSAGE DB The Sum is SUMRST DB ?, $ .CODE.STARTUP MOV AL, 1MOV BL, 2CALL SUMMOV AH, 9MOV DX, OFFSET MESSAGEINT 21H.EXITSUMPROCADD AL, BLOR AL, 30HMOV SUMRST, ALRETSUM ENDPEND通過寄存器在調(diào)用過程前將參數(shù)置入寄存器通過內(nèi)存.DATA MES

60、SAGE DB The Sum is SUMRST DB ?, $D1DB ?D2DB ? .CODE.STARTUP MOV D1, 1MOV D2, 2CALL SUMMOV AH, 9MOV DX, OFFSET MESSAGEINT 21H.EXITSUMPROCMOV AL, D1ADD AL, D2OR AL, 30HMOV SUMRST, ALRETSUM ENDPEND 通過堆棧功能最強(qiáng)/最靈活/最復(fù)雜MOV AL, 1MOV BL, 2MOV AH,0MOV BH,0PUSH AXPUSH BXCALL SUMPOP BXPOP AXSUMPROCPUSH BPMOV BP,

溫馨提示

  • 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

提交評論