版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第三章匯編語言及編程3.1匯編語言程序結(jié)構(gòu)與匯編語句3.2偽指令語句3.3匯編語言編程環(huán)境3.4DOS/BIOS功能調(diào)用3.5三種基本結(jié)構(gòu)程序的設(shè)計3.6子程序設(shè)計與調(diào)用3-113.1匯編語言程序結(jié)構(gòu)與匯編語句3.1.1匯編語言源程序結(jié)構(gòu)
3.1.2匯編語言的語句3-23.1.1匯編語言源程序結(jié)構(gòu)80X86/Pentium系列MPU匯編語言都是以邏輯段為基礎(chǔ),按段的概念來組織代碼和數(shù)據(jù)的。因此,源程序結(jié)構(gòu)與邏輯段的定義方法密切相關(guān),而宏匯編語言MASM5.0以上的版本中,邏輯段既可用完整段定義,又可用簡化段定義。3-31.標(biāo)準(zhǔn)的單模塊源程序框架[.586]
DATASEGMENT[USE16/USE32] ;定義數(shù)據(jù)段
;數(shù)據(jù)定義偽指令序列
DATAENDS
STACKSEGMENT[USE16/USE32]STACK ;定義堆棧段
;數(shù)據(jù)定義偽指令序列
STACKENDS
CODESEGMENT[USE16/USE32] ;定義代碼段
ASSUMECS:CODE,SS:STACK,DS:DATA,ES:DATA
START:MOVAX,DATA ;取數(shù)據(jù)段基址
MOVDS,AX ;建立DS的可尋址性
MOVES,AX ;建立ES段的可尋址性
;核心程序段
MOVAH,4CH ;返回DOS操作系統(tǒng)
INT21H CODEENDS
ENDSTART⑴一個源程序由若干邏輯段組成。一般一個源程序具有數(shù)據(jù)段、附加數(shù)據(jù)段、堆棧段和代碼段;但只有代碼段是必不可少的。
⑵采用完整段定義時,對程序中定義的邏輯段,要說明邏輯段與段寄存器的尋址關(guān)系。ASSUMECS:CODE,SS:STACK,DS:DATA,ES:DATA⑶對數(shù)據(jù)段(有時還有堆棧段),程序中要包含初始化段寄存器的語句。MOVAX,DATAMOVDS,AXMOVES,AX程序中要包含返回DOS的語句。MOVAH,4CHINT21H⑸源程序(模塊)以END偽指令結(jié)束
ENDSTART3.1.1匯編語言源程序結(jié)構(gòu)3-43.1.1匯編語言源程序結(jié)構(gòu)(1)使用DOS的4CH號功能調(diào)用這種方法是在代碼段結(jié)束前加調(diào)用語句:MOVAH,4CH;功能號4CH→AHINT21H;中斷調(diào)用(2)使用20H號軟功能調(diào)用調(diào)用方式是在代碼段結(jié)束前加調(diào)用語句:INT20H(3)使用DOS的0號功能調(diào)用調(diào)用方式是在代碼段結(jié)束前加調(diào)用語句:
MOVAH,0INT21H2.返回DOS狀態(tài)的方法3-5(4)將主程序定義為遠過程也稱為“標(biāo)準(zhǔn)序”方法。這種方法是在代碼段開始處按下述方式定義主程序:
CODE SEGMENT… ASSUME…主過程名 PROCFAR
PUSHDS SUBAX,AX ;標(biāo)準(zhǔn)序
PUSHAX
RET主過程名ENDP
END主過程名3.1.1匯編語言源程序結(jié)構(gòu)3-6指令語句偽指令語句宏指令語句3.1.2匯編語言的語句
語句是匯編語言程序的基本組成單位,用于規(guī)定匯編語言的一個基本操作。匯編語言包含三種基本語句:是可執(zhí)行語句,由硬件(CPU)完成其功能,匯編時產(chǎn)生目標(biāo)代碼。不可執(zhí)行語句,其功能由相應(yīng)軟件完成,不產(chǎn)生目標(biāo)代碼。用戶定義的新指令,匯編時產(chǎn)生相應(yīng)的目標(biāo)代碼。3-7標(biāo)號和名字——分別是給指令單元和偽指令起的符號名稱,統(tǒng)稱為標(biāo)識符。(注意組成的語法規(guī)則)助記符和定義符——分別用于規(guī)定指令語句的操作性質(zhì)和偽指令語句的偽操作功能,統(tǒng)稱操作符。操作數(shù)——操作數(shù)允許有多個,這時各操作數(shù)之間要用逗號“,”隔開。3.1.2匯編語言的語句指令語句:[標(biāo)號:]助記符[操作數(shù)][;注釋]偽指令語句:[名字]定義符[操作數(shù)][;注釋]1.語句格式3-82.數(shù)據(jù)
匯編語言中使用的數(shù)據(jù)有常數(shù)、變量和標(biāo)號。
(1)常數(shù)常數(shù)是指那些在匯編過程中已有確定數(shù)值的量,分為數(shù)值常數(shù)和字符串常數(shù)兩類。主要用作:指令語句中的立即操作數(shù)基址、變址或基址加變址尋址中的位移量偽指令語句中用于給變量賦初值3.1.2匯編語言的語句3-9標(biāo)號是指令的符號化地址,一定在代碼段,而變量是數(shù)據(jù)的符號化地址,一般在數(shù)據(jù)段,有時也可在代碼段定義。變量與標(biāo)號有三個共同屬性:段基址:所在段的起始地址(SEG)偏移值:相對于段基址的位移量(OFFSET)類型:所占字節(jié)數(shù)(TYPE)(2)變量與標(biāo)號3.1.2匯編語言的語句3-10變量與標(biāo)號區(qū)別標(biāo)號可以用作轉(zhuǎn)移控制類指令的操作數(shù),但變量不能。變量可以用作基址、變址或基址加變址尋址的位移量,但標(biāo)號不能。3.1.2匯編語言的語句3-11例3.1
假設(shè)VAR1和VAR2為字變量,LAB為程序中的一個標(biāo)號,判斷下列指令是否正確,若錯誤請指出錯誤之處:①ADDVAR1,VAR2②SUBAL,VAR1③JNZVAR1④JMPLAB[SI]⑤JMPNEARLAB⑥MOVAX,VAR1[BX]⑦JMPVAR2[BX]錯,不允許存儲器變量間直接傳數(shù)錯,源與目的操作數(shù)類型不一致錯,變量不能用作條件轉(zhuǎn)移指令的操作數(shù)錯,標(biāo)號不能用作變址尋址的位移量錯,缺PTR運算符正確正確3.1.2匯編語言的語句3-123.表達式表達式是匯編語句操作數(shù)的基本形式,由運算符和運算對象組成?!袼阈g(shù)運算符●邏輯運算符●關(guān)系運算符●匯編語言特定的運算符運算符●常數(shù)、變量和標(biāo)號●操作數(shù)●構(gòu)成程序的段和偏移量…運算對象3.1.2匯編語言的語句3-13指在匯編過程中能夠由匯編程序計算出數(shù)值的表達式??勺鳛橹噶钪械牧⒓床僮鲾?shù)和數(shù)據(jù)區(qū)中的初值使用。例如:MOVBX,0FFF0HAND0B234HMOVAL,4CHEQ2MOVAH,4CHGT1MOVAX,SEGLABLE表達式又分為數(shù)值表達式和地址表達式:3.1.2匯編語言的語句數(shù)值表達式3-14其值表示存儲器地址,一般都是段內(nèi)的偏移地址。與變量一樣,地址表達式也具有段值、偏移值和類型屬性。地址表達式主要用來表示指令語句中的操作數(shù),例如:MOVAX,BASE[EAX][EBX]JMPBASE[EAX]
LEABX,BASE+123.1.2匯編語言的語句地址表達式3-153.2.1程序結(jié)構(gòu)偽指令語句3.2.2符號定義偽指令3.2.3數(shù)據(jù)定義偽指令3.2.4過程與宏定義偽指令3.2.5結(jié)構(gòu)定義偽指令
3.2偽指令語句3-163.2.1程序結(jié)構(gòu)偽指令語句方式選擇偽指令完整段定義偽指令指定地址偽指令模塊定義偽指令這類語句是與程序結(jié)構(gòu)緊密相關(guān)的基本偽指令語句,用于說明CPU的類型、邏輯段結(jié)構(gòu)、源程序(或模塊)起止信息和段內(nèi)存的安排等。主要包括:3-171.方式選擇偽指令方式選擇偽指令用于通知匯編程序,當(dāng)前的源程序指令是哪一種CPU指令,經(jīng)過匯編鏈接之后生成的目標(biāo)程序在哪一種CPU機型上運行。不屬于選定CPU的指令均為非法指令。所以,方式選擇偽指令本質(zhì)上也就是指令集選擇偽指令。通常,方式選擇偽指令放在程序的頭部,作為源程序的第一條語句。缺省時默認8086指令集。3.2.1程序結(jié)構(gòu)偽指令語句3-182.完整段定義偽指令采用完整段定義偽指令可具體控制匯編程序(MASM)和鏈接程序(LINK)在內(nèi)存中組織代碼和數(shù)據(jù)的方式。主要包括段定義語句和段寄存器說明語句。
3.2.1程序結(jié)構(gòu)偽指令語句3-193.2.1程序結(jié)構(gòu)偽指令語句⑴段定義語句
格式:段名SEGMENT[定位類型][,組合類型][,字長選擇][,‘類別’]段體 ;由指令、偽指令和宏指令語句組成段名ENDS
說明:
(1)SEGMENT/ENDS是一對段定義語句,一個邏輯段從SEGMENT語句開始,到ENDS語句結(jié)束。(2)段名是用戶定義的段的標(biāo)識符,用于指明段的基址。(3)4個可選參數(shù)用于為源程序的匯編、連接提供必要的信息,特別是模塊化程序,各個模塊如何定位,彼此之間如何連接,將較多地涉及到定位類型和組合類型的選擇。指定段起點的邊界類型:BYTE(字節(jié))WORD(字)DWORD(雙字)PARA(節(jié))PAGE(頁)
定位類型告訴鏈接程序本段與其它模塊中同名段的組合連接關(guān)系:PUBLIC連接到同一個物理段中STACK連接到同一個物理堆棧段中,并給SS:ESP賦值COMMON產(chǎn)生一個覆蓋段。MEMORYAT表達式
組合類型定義段中使用的偏移地址和寄存器的字長USE16──表示該段字長為16位USE32──表示該段字長為32位字長選擇3-20組合連接舉例:模塊2(從模塊):DSEGSEGMENTCOMMONARRAY_BDW200DUP(?)DSEGENDSSSEGSEGMENTSTACKDW50DUP(?)SSEGENDSCSEGSEGMENTPUBLIC
CSEGENDS
END模塊1(主模塊):DSEGSEGMENTCOMMONARRAY_ADW100DUP(?)DSEGENDSSSEGSEGMENTSTACKDW50DUP(?)SSEGENDSCSEGSEGMENTPUBLICASSUMECS:CSEG,DS:DSEG,SS:SSEGSTART:MOVAX,DSEGMOVDS,AX
CSEGENDSENDSTARTCSEGDSEG(共400字節(jié))模塊2代碼模塊2數(shù)據(jù)SSEG(共200字節(jié))模塊1代碼模塊2堆棧模塊1數(shù)據(jù)邏輯段組合示意圖模塊1堆棧3.2.1程序結(jié)構(gòu)偽指令語句3-21⑵段寄存器說明語句
格式:ASSUME段寄存器:段名[,段寄存器:段名,…]功能:說明源程序中定義的段由那個段寄存器去尋址。說明:
⑴CS只能用于包含有程序的段,反之含有程序的段也只能以CS作為段寄存器。SS也一樣,只能與堆棧段對應(yīng)。⑵CS所對應(yīng)的段名必須在該語句之前有定義。⑶該語句是說明性語句。3.2.1程序結(jié)構(gòu)偽指令語句3-223.指定地址偽指令
格式:
ORG偏移地址ORG$+偏移地址功能:該偽指令以其指定的偏移地址或由$給出的當(dāng)前地址加上指定的偏移地址作為當(dāng)前開始分配和使用的偏移地址。3.2.1程序結(jié)構(gòu)偽指令語句3-234.模塊定義偽指令模塊定義偽指令包括模塊開始和模塊結(jié)束語句。
(1)模塊開始語句(NAME)
格式:NAME[模塊名]
功能:指示源程序開始,并指出該源程序的模塊名。(2)模塊結(jié)束語句(END)
格式:END[標(biāo)號/過程名]
功能:模塊結(jié)束語句表示源程序到此結(jié)束。3.2.1程序結(jié)構(gòu)偽指令語句3-243.2.2符號定義偽指令格式:賦值語句:符號名EQU表達式功能:都是用符號名代替表達式的值。但賦值語句定義的符號名不能重新定義,而等號語句允許。1.符號常數(shù)定義偽指令等號語句:符號名=表達式
3-25
例3.2賦值語句與等號語句舉例。賦值語句:
XEQU50 YEQUX+10 COUNTEQU$-ARRY 等號語句:
CON=5 BASE=200H
BASE=BASE+10H ;重新定義BASE3.2.2符號定義偽指令3-262.定義符號名偽指令格式:符號名LABEL類型功能:將緊跟在本偽指令后的標(biāo)號、操作碼、過程或變量建立新的符號名,并刷新其類型,但它并不為新指定的變量或標(biāo)號分配存儲空間。例如:SUB_FARLABELFAR ;遠調(diào)用入口SUB_NEAR:MOVAL,[SI]
;近調(diào)用入口兩個標(biāo)號SUB_FAR和SUB_NEAR均指向同一條指令,前者為遠標(biāo)號,后者為近標(biāo)號。3.2.2符號定義偽指令3-273.2.3數(shù)據(jù)定義偽指令偽指令格式:DBDWDDDFDQDT數(shù)據(jù)項[,數(shù)據(jù)項,…,數(shù)據(jù)項][變量名]功能:是為數(shù)據(jù)項或項表分配存儲空間,給它們賦初值,并用一個符號名(稱為變量)與之相聯(lián)系。8位(字節(jié))16位(字)32位(雙字)48位(長字)64位(四字)80位(十字節(jié))
3-28使用說明:⑴給變量賦初值可以是賦確定的值,也可以是賦不確定的值(用“?”表示),還可以是用DUP運算符建立的多次拷貝。
例3.3
使用80X86匯編語言的偽操作命令定義:
VALDB93DUP(5,2DUP(2DUP(1,2DUP(3)),4))
則在VAL存儲區(qū)內(nèi)前10個字節(jié)單元的數(shù)據(jù)是
?
解:由內(nèi)向外逐層展開,分別相當(dāng)于:①93DUP(5,2DUP(2DUP(1,3,3),4))②93DUP(5,2DUP(1,3,3,1,3,3,4))③93DUP(5,1,3,3,1,3,3,4,1,3,3,1,3,3,4)即表示重復(fù)93個數(shù)據(jù)序列:‘5,1,3,3,1,3,3,4,1,3,3,1,3,3,4’3.2.3數(shù)據(jù)定義偽指令3-29
⑵使用SEG、OFFSET、TYPE、LENGTH和SIZE運算符求變量的各種屬性時,特別要注意:
對LENGTH運算符,如果變量是用重復(fù)數(shù)據(jù)操作符DUP說明的,則返回外層DUP給定的值;如果沒有DUP說明,則返回值總是1。
對SIZE運算符有:SIZE=TYPE×LENGTH使用說明:3.2.3數(shù)據(jù)定義偽指令3-30解:此題有兩層DUP定義,但最外層DUP給定的值為100,所以:(BX)=數(shù)組ARRAY的偏移地址;(CX)=數(shù)組ARRAY的長度=100;(SI)=數(shù)組ARRAY的類型=2。
例3.4若數(shù)組ARRAY在數(shù)據(jù)段中已作如下定義:
ARRAYDW100DUP(123H,3DUP(?)),1234H
試指出下列指令執(zhí)行后,有關(guān)寄存器的內(nèi)容是多少?MOV BX,OFFSETARRAYMOV CX,LENGTHARRAYMOV SI,0ADD SI,TYPEARRAY3.2.3數(shù)據(jù)定義偽指令3-31⑶操作符“$”是取地址計數(shù)器的當(dāng)前值,常用于表達式定義數(shù)組長度。
例3.5
已知:
ORG0100H ARYDW3,$+4,5,6 CNTEQU$-ARY DB7,8,CNT,9下列指令執(zhí)行后,AX、BX寄存器的值為多少?
MOVAX,ARY+2MOVBX,ARY+100100H03H0101H00H0102H06H0103H01H0104H05H0105H00H0106H06H0107H00H0108H07H0109H08H010AH08H010BH09H解:畫出數(shù)組ARY的內(nèi)存分配圖。(AX)=[ARY+2]=[0102H]=0106H(BX)=[ARY+10]=[010AH]=0908H使用說明:3.2.3數(shù)據(jù)定義偽指令3-32
⑷使用DB、DW、DD定義串?dāng)?shù)據(jù)(用‘’定義的字符串)時,允許定義的串長度不同,字符的存放順序也不相同:DB是從左至右順序為每個字符分配一個字節(jié)單元;DW是從左至右順序為每2個字符分配一個字單元,且前面的字符在高字節(jié),串長度不能超過2;DD是從左至右順序為每4個字符分配一個雙字單元,也是按前面的字符在高字節(jié)順序存放,串長度不能超過4。3.2.3數(shù)據(jù)定義偽指令3-33
例3.6今需在變量名為STRING的數(shù)據(jù)區(qū)中順次存放數(shù)據(jù)‘A’、‘B’、‘C’、‘D’、‘E’、‘F’、‘G’、‘H’,請寫出分別用匯編命令DB、DW和DD實現(xiàn)的語句。解:用DB、DW和DD實現(xiàn)的語句分別為:
STRINGDB‘ABCDEFGH’
STRINGDW‘BA’,‘DC’,‘FE’,‘HG’
STRINGDD‘DCBA’,‘HGFE’3.2.3數(shù)據(jù)定義偽指令3-343.2.4過程與宏定義偽指令過程定義偽指令宏定義偽指令宏和過程的比較3-35格式:過程名PROC[屬性]
… ;過程體 [RET] … RET
過程名ENDP
說明:②過程允許嵌套調(diào)用,還可以遞歸調(diào)用。③過程與邏輯段也可以相互嵌套,但決不允許過程與段交叉覆蓋。過程又稱為子程序。它是一段必須通過CALL指令調(diào)用才能執(zhí)行的程序段,執(zhí)行完后通過一條RET指令返回原調(diào)用處。過程需先定義才能調(diào)用。
①過程體中必須至少包含一條RET指令,這是過程的出口。但也允許過程有多條RET指令,即過程有多個出口。1.過程定義偽指令3.2.4過程與宏定義偽指令
3-36宏定義格式:宏名MACRO[形式參數(shù)表]
;宏體 ENDM
說明:宏定義的宏名必須唯一,稱為宏指令。宏指令一經(jīng)定義就可以在源程序的任何地方調(diào)用。相當(dāng)于由用戶給匯編程序提供了一個新的操作碼。
宏調(diào)用格式:宏名[實際參數(shù)表]3.2.4過程與宏定義偽指令
宏的概念與過程很相似,也是用一個宏名字來代替源程序中經(jīng)常要用到的一個程序模塊。2.宏定義偽指令
3-373.2.4過程與宏定義偽指令
使用宏定義和宏調(diào)用時要注意兩個問題:對帶參數(shù)的宏指令,宏調(diào)用時實際參數(shù)與形式參數(shù)的類型要一致,以免產(chǎn)生無效調(diào)用。宏調(diào)用是用宏體中定義的指令序列替換宏指令,所以宏體內(nèi)的標(biāo)號要用LOCAL偽指令說明為局部標(biāo)號,以免多次調(diào)用宏時,發(fā)生標(biāo)號重復(fù)定義錯誤。LOCAL偽指令格式:
LOCAL標(biāo)號1[,標(biāo)號2,…]3-38解:宏定義如下:
MOVEMACROSARY,DARY
LOCALLP MOVSI,0 MOVCX,100LP:MOVAL,SARY[SI] MOVDARY[SI],AL INCSI LOOPLP ENDM例3.7
定義宏MOVE,其功能是將一個有100個字節(jié)元素的數(shù)組搬移到另一個數(shù)據(jù)區(qū)。進行宏調(diào)用:MOVEFIRST,SECOND宏展開如下:
MOVSI,0MOVCX,100??0000:MOVAL,F(xiàn)IRST[SI] MOVSECOND[SI],AL INCSI LOOP??00003.2.4過程與宏定義偽指令
3-393.宏和過程的比較
宏和過程都可簡化源程序的書寫,因而也減少了程序出錯的可能性。但兩者使用上也有區(qū)別:3.2.4過程與宏定義偽指令
(1)宏操作可以直接傳遞和接收參數(shù),而過程不能直接帶參數(shù)。當(dāng)過程之間需要傳遞參數(shù)時,必須通過堆棧、寄存器或存儲器來進行,編程比宏要復(fù)雜。所以,宏匯編適合于代碼較短,傳送參數(shù)較多的子功能段使用,子程序適合于代碼較長,調(diào)用比較頻繁的子功能段使用。(3)引入宏操作并不會在執(zhí)行目標(biāo)代碼時增加額外的時間開銷,但過程調(diào)用由于要保護和恢復(fù)現(xiàn)場及斷點,因此會延長目標(biāo)程序的執(zhí)行時間。(2)子程序不管被調(diào)用多少次它都只被匯編一次,即有唯一的一段目標(biāo)代碼;而宏指令則調(diào)用多少次就匯編多少次,每次調(diào)用都要在程序中展開并保留宏體中的每一行。3-403.2.5結(jié)構(gòu)定義偽指令
在一些應(yīng)用中,常需要將一些不同類型的數(shù)據(jù)組合成一個有機整體。這時就要用到匯編語言的結(jié)構(gòu)化數(shù)據(jù)——結(jié)構(gòu)。
與前述的字節(jié)、字類型數(shù)據(jù)不同,一個結(jié)構(gòu)必須先經(jīng)定義后才可以說明屬于這種結(jié)構(gòu)類型的變量,這是因為結(jié)構(gòu)的組成是千變?nèi)f化的。所以圍繞結(jié)構(gòu)定義,有兩種偽指令語句:2.結(jié)構(gòu)變量說明與賦初值語句
1.結(jié)構(gòu)類型說明語句(STRUC/ENDS)3-413.2.5結(jié)構(gòu)定義偽指令
語句格式:結(jié)構(gòu)名STRUC…;結(jié)構(gòu)體,由數(shù)據(jù)定義語句構(gòu)成結(jié)構(gòu)名ENDSDATESTRUCMONTHDB?DAYDB?YEARDW?DATEENDS結(jié)構(gòu)DATE的存儲形式MONTH(1字節(jié))DAY(1字節(jié))YEAR(2字節(jié))結(jié)構(gòu)的定義明確地描述了該結(jié)構(gòu)的組織形式,它告訴匯編程序?qū)儆谶@種組織形式的變量使用內(nèi)存的模式。例如:
1.結(jié)構(gòu)類型說明語句(STRUC/ENDS)3-42語句格式:
[變量名]結(jié)構(gòu)名〈[域值表]〉例如:VARDATE<4,3,2004H>結(jié)構(gòu)變量VAR的存儲形式MONTH(1字節(jié))DAY(1字節(jié))YEAR(2字節(jié))04H03H04H20HVAR3.結(jié)構(gòu)的引用有兩種方法:結(jié)構(gòu)變量名.域名[基址或變址寄存器].域名MOVAX,VAR.YEARMOVCL,VAR.DAY上述引用也可用如下方法:MOVBX,OFFSETVAR
MOVAX,[BX].YEARMOVCL,[BX].DAY3.2.5結(jié)構(gòu)定義偽指令2.結(jié)構(gòu)變量說明與賦初值語句3-433.3匯編語言編程環(huán)境與其它程序設(shè)計語言一樣,匯編語言程序的開發(fā)過程可歸結(jié)為:就需求分析、模塊劃分和算法確定等工作而言,各種程序設(shè)計語言是類似的,均可按軟件工程的方法進行,但編程和調(diào)試則因程序設(shè)計語言而異。
需求分析根據(jù)需求和規(guī)模等因素劃分模塊確定各功能模塊的求解算法、并定義所需的數(shù)據(jù)結(jié)構(gòu)進行編程和調(diào)試3-44對匯編語言而言,根據(jù)數(shù)據(jù)結(jié)構(gòu)和算法進行編碼到形成可用程序的過程如下:
需求分析、數(shù)據(jù)結(jié)構(gòu)和算法匯編語言源程序文件*.ASM目標(biāo)代碼程序文件*.OBJ可執(zhí)行程序文件*.EXE可用程序連接編輯匯編調(diào)試3.3匯編語言編程環(huán)境3-45應(yīng)用程序外設(shè)硬件接口BIOSDOS
DOS操作系統(tǒng)和ROMBIOS系統(tǒng)各為用戶提供了一組例行子程序,用于完成基本I/O設(shè)備、內(nèi)存、文件和作業(yè)的管理,以及時鐘、日歷的讀出和設(shè)置等功能。3.4DOS/BIOS功能調(diào)用3-46順序結(jié)構(gòu)分支結(jié)構(gòu)循環(huán)結(jié)構(gòu)3.5三種基本結(jié)構(gòu)程序的設(shè)計程序的基本結(jié)構(gòu)形式有三種:理論上,三種基本結(jié)構(gòu)是完備的,即任何功能的程序都可由順序、分支和循環(huán)三種結(jié)構(gòu)實現(xiàn)。3-473.5.1順序結(jié)構(gòu)程序設(shè)計順序程序又稱直線程序。其特點是順序執(zhí)行的,無分支,無循環(huán),也無轉(zhuǎn)移,只作直線運行。在實際應(yīng)用中,純粹用順序結(jié)構(gòu)編寫的完整程序很少見,但是在程序段中它卻是大量的存在。所以掌握它是編寫復(fù)雜應(yīng)用程序的基礎(chǔ)。3-483.5.2分支結(jié)構(gòu)程序設(shè)計
在許多實際問題中,往往需要根據(jù)不同的情況和給定的條件做出不同的處理。要設(shè)計這樣的程序,必須事先把各種可能出現(xiàn)的情況及處理方法都編寫在程序中,以后計算機運行程序時,可自動根據(jù)運行的結(jié)果做出判斷,有條件地選擇執(zhí)行不同的程序段,按這種要求編寫的程序稱為分支程序。3-49分支1條件結(jié)束開始YN分支2(b)完全分支結(jié)構(gòu)分支程序條件結(jié)束開始YN(a)不完全分支結(jié)構(gòu)分支1結(jié)束開始條件ii=1i=n分支2分支n…i=2(c)多分支結(jié)構(gòu)IF條件
THEN分支程序IF條件
THEN分支1
ELSE分支2分支程序的結(jié)構(gòu)有三種形式:
3.5.2分支結(jié)構(gòu)程序設(shè)計3-50根據(jù)X(-128≤X≤127)的值求出Y。例3.9變量X的符號函數(shù)定義如下:Y=1X>00X=0-1X<01.利用比較與條件轉(zhuǎn)移指令實現(xiàn)分支
這種方法適合于不完全分支和完全分支這兩種結(jié)構(gòu),對分支較少的多分支結(jié)構(gòu)也可用。3.5.2分支結(jié)構(gòu)程序設(shè)計3-51例3.9程序:DATA SEGMENT XDB0F8H YDB?DATA ENDS
CODE SEGMENT ASSUMECS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV AL,X ;取變量X的值
CMP AL,0 ;X與0比較
JG BIGR
JE FINISH ;X=0,Y=0 MOV AL,0FFH ;X<0,Y=-1
JMP FINISHBIGR:MOV AL,1 ;X>0,Y=1FINISH:MOV Y,AL ;保存函數(shù)值Y MOV AH,4CH INT 21HCODE ENDS END START3.5.2分支結(jié)構(gòu)程序設(shè)計3-52這種方法適應(yīng)于多分支結(jié)構(gòu)。有三種跳轉(zhuǎn)表:BASE
關(guān)鍵字0ADR0M
(c)根據(jù)關(guān)鍵字分支關(guān)鍵字nADRn關(guān)鍵字1ADR1+3+3nBASEJMP
JMPM
(b)根據(jù)表內(nèi)指令分支JMP+3n+3BASEADR0
M
(b)根據(jù)表內(nèi)地址分支ADRnADR1+2n+23.5.2分支結(jié)構(gòu)程序設(shè)計2.利用跳轉(zhuǎn)表實現(xiàn)分支
3-53使用跳轉(zhuǎn)表實現(xiàn)分支時,要特別注意表內(nèi)地址分支和表內(nèi)指令分支兩種結(jié)構(gòu)跳轉(zhuǎn)表的定義方法和正確的尋址方式。表內(nèi)地址分支在數(shù)據(jù)段定義跳轉(zhuǎn)表,用存儲器間接尋址;表內(nèi)指令分支在代碼段定義跳轉(zhuǎn)表,用寄存器間接尋址。3.5.2分支結(jié)構(gòu)程序設(shè)計3-54
設(shè)某控制程序可完成8種產(chǎn)品的加工,每種加工程序?qū)?yīng)一個數(shù)字(1~8)?,F(xiàn)要求根據(jù)輸入的值去加工相應(yīng)產(chǎn)品。假設(shè)8種加工程序段與主程序在同一代碼段中。3.5.2分支結(jié)構(gòu)程序設(shè)計例3.10方法一:用表內(nèi)地址分支實現(xiàn)此時,跳轉(zhuǎn)表在數(shù)據(jù)段定義,轉(zhuǎn)移要用存儲器間接尋址的跳轉(zhuǎn)指令。3-55例3.10表內(nèi)地址分支程序
.486DATASEGMENTUSE16‘DATA’DISPDB‘Errorrepeatinput’DB0AH,0DH,‘$’
BASEDDSBR1,SBR2,SBR3,SBR4
DDSBR5,SBR6,SBR7,SBR8DATAENDSCODESEGMENTUSE16‘CODE’ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXINPUT:MOVAH,1;輸入數(shù)字序號INT21HCMPAL,‘1’
JBERR
CMPAL,‘8’
JAERR
SUBAL,‘1’ANDEAX,0000000FH
JMPBASE[EAX*4]SBR1:…
SBR2:…
SBR8:…
ERR:CMPAL,‘E’JZEXIT
MOVDX,OFFSETDISPMOVAH,09H
INT21HJMPINPUTEXIT:MOVAH,4CHINT21HCODEENDSENDSTART3.5.2分支結(jié)構(gòu)程序設(shè)計
此題也可用表內(nèi)指令分支實現(xiàn)。這時,跳轉(zhuǎn)表要在代碼段定義,轉(zhuǎn)移則要用寄存器間接尋址的跳轉(zhuǎn)指令。3-56
.486DATASEGMENTUSE16‘DATA’DISPDB‘Errorrepeatinput’DB0AH,0DH,‘$’DATAENDSCODESEGMENTUSE16‘CODE’ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXINPUT:MOVAH,1;輸入數(shù)字序號INT21HCMPAL,‘1’
JBERR
CMPAL,‘8’
JAERR
SUBAL,‘1’
ANDAX,000FHMOVBX,AXSHLBX,1ADDAX,BX
MOVBX,OFFSETBASEADDBX,AXJMPBXBASE:JMPSUB1;跳轉(zhuǎn)表
JMPSUB2JMPSUB8SUB1:…SUB2:…
SUB8:…ERR:CMPAL,‘E’JZEXIT;按E鍵結(jié)束
MOVDX,OFFSETDISPMOVAH,09H;顯示提示信息
INT21HJMPINPUT;轉(zhuǎn)重輸入字符EXIT:MOVAH,4CHINT21HCODEENDSENDSTART3.5.2分支結(jié)構(gòu)程序設(shè)計方法二:用表內(nèi)指令分支3-57初始化部分循環(huán)體循環(huán)修改循環(huán)控制3.5.3循環(huán)結(jié)構(gòu)程序設(shè)計凡要重復(fù)執(zhí)行的程序段都可按循環(huán)結(jié)構(gòu)設(shè)計。采用循環(huán)結(jié)構(gòu),可簡化程序書寫形式,縮短程序長度,減少占用的內(nèi)存空間。循環(huán)結(jié)構(gòu)程序的組成
循環(huán)結(jié)構(gòu)的程序一般包括下面幾個部分:
3-58循環(huán)結(jié)構(gòu)的組織方式有兩種組織循環(huán)結(jié)構(gòu)的方式:(a)DO―WHILE結(jié)構(gòu)循環(huán)修改條件結(jié)束開始YN循環(huán)初始化循環(huán)體(b)DO―UNTIL結(jié)構(gòu)循環(huán)修改條件結(jié)束開始YN循環(huán)初始化循環(huán)體3.5.3循環(huán)結(jié)構(gòu)程序設(shè)計3-59循環(huán)結(jié)束的控制方式計數(shù)控制條件控制狀態(tài)控制邏輯尺控制3.5.3循環(huán)結(jié)構(gòu)程序設(shè)計常用的循環(huán)結(jié)束控制方式有以下四種:
3-601.計數(shù)控制循環(huán)程序設(shè)計循環(huán)次數(shù)已知時用計數(shù)控制循環(huán),這時常用CX作循環(huán)計數(shù)器,用循環(huán)指令LOOP控制循環(huán)。也可用其他通用寄存器作循環(huán)計數(shù)器,用DEC和JNZ指令控制循環(huán)。3.5.3循環(huán)結(jié)構(gòu)程序設(shè)計
例3.11
編寫程序,將ASCII碼表示的5位十進制數(shù)(≤65535)轉(zhuǎn)換成16位二進制數(shù),并存儲起來。
解:設(shè)X=Xn-1…X1X0為十進制數(shù),則X轉(zhuǎn)換為二進制數(shù)的一般方法為:
X=Xn-110n-1+…+X110+X03-61例3.11程序3.5.3循環(huán)結(jié)構(gòu)程序設(shè)計DSEGSEGMENTASCDECDB‘23333’BINAYDW0MULTIPLEDW1DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVCX,10
;SI指向ASCII碼數(shù)首址LEASI,ASCDEC DECSI
;BX指向ASCII碼數(shù)個位MOVBX,5NEXT:MOVAL,[BX+SI]ANDAX,0FH
;計算當(dāng)前十進制位對應(yīng)的二進制數(shù)
MULMULTIPLE
ADDBINAY,AX;累加求和MOVAX,MULTIPLE
;計算下一十進制位對應(yīng)的權(quán)值
MULCX MOVMULTIPLE,AXDECBXJNZNEXT;未完繼續(xù)MOVAH,4CHINT21HCSEGENDSENDSTART3-62當(dāng)循環(huán)次數(shù)未知時,就要用條件或狀態(tài)信號來控制循環(huán)。用條件控制時,常用比較指令CMP與條件轉(zhuǎn)移指令Jcc結(jié)合控制循環(huán)結(jié)束.用狀態(tài)控制時,狀態(tài)信號既可由外設(shè)提供,也可由其他任務(wù)或過程提供,這時常用測試指令TEST與條件轉(zhuǎn)移指令Jcc結(jié)合控制循環(huán)結(jié)束。3.5.3循環(huán)結(jié)構(gòu)程序設(shè)計2.條件/狀態(tài)控制循環(huán)程序設(shè)計3-63例3.12
將16位二進制數(shù),轉(zhuǎn)換成等值的十進制數(shù)從顯示器輸出。3.5.3循環(huán)結(jié)構(gòu)程序設(shè)計解:設(shè)X為任意無符號十進制數(shù),則X可表示為:用10除X,得:即可用連續(xù)“除10取余”的方法,依次求得十進制數(shù)的個、十、百、千位、…,直到an-1。3-64例3.12程序DATASEGMENTWORD
INTEGERDW12345
;定義存放ASCII碼十進制數(shù)變量區(qū)ASCVALDB5DUP(‘’)DB0AH,0DH,‘$’DATAENDSCODESEGMENTWORDASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX LEASI,ASCVAL+4
MOVAX,INTEGER
MOVCX,10 ;CX為除數(shù)AGAIN:CMPAX,10;商小于10?
JBDONE;小于10結(jié)束
XORDX,DX;擴展被除數(shù)
DIVCX;(DX:AX)/(CX)
;轉(zhuǎn)換成ASCII碼數(shù)ORDL,30H
MOV[SI],DL;保存十進制數(shù)位 DECSI
JMPAGAINDONE: ORAL,30HMOV[SI],AL
MOVDX,OFFSETASCVALMOVAH,09H ;顯示十進制數(shù)INT21H
MOVAX,4C00HINT21HCODEENDSENDSTART 3.5.3循環(huán)結(jié)構(gòu)程序設(shè)計3-65——循環(huán)不規(guī)則時使用的一種循環(huán)控制方法3.5.3循環(huán)結(jié)構(gòu)程序設(shè)計3.邏輯尺循環(huán)程序設(shè)計
例3.13
設(shè)有數(shù)組:定義一個二進制位序列——稱為邏輯尺
1100010011每個數(shù)組元素zi對應(yīng)一位,該位為1,表示計算zi時對應(yīng)數(shù)組元素相加,否則相減。3-66例3.13程序START:MOVAX,DATA MOVDS,AX MOVBX,SOCBEH;取邏輯尺
MOVCX,10;置循環(huán)次數(shù)
MOVSI,0AGAIN:MOVAX,X[SI] ;取xi
SHLBX,1
JNCL1 ADDAX,Y[SI] ;求和
JMPL2L1: SUBAX,Y[SI] ;相減
L2:MOVZ[SI],AX ;保存zi ADDSI,2
LOOPAGAINEXIT:MOVAH,4CH INT21HCODEENDS ENDSTARTDATA SEGMENTXDW x1,x2,x3,x4,x5DWx6,x7,x8,x9,x10YDW y1,y2,y3,y4,y5DWy6,y7,y8,y9,y10ZDW 10DUP(?)
SOCBEHDW1100010011000000BDATA ENDS
STACK SEGMENTSTACKSTNDB100DUP(?)STACK ENDSCODESEGMENTASSUMECS:CODE,SS:STACK,DS:DATA3.5.3循環(huán)結(jié)構(gòu)程序設(shè)計3-673.6子程序設(shè)計與調(diào)用3.6.0子程序設(shè)計概述3.6.1主程序與子程序的接口3.6.2主程序與子程序間的參數(shù)傳遞3-683.6.0子程序設(shè)計概述
同一個程序中,往往有許多地方都需要執(zhí)行同樣的一項任務(wù)(一段程序),而該任務(wù)又并非規(guī)則情況,不能用循環(huán)程序來實現(xiàn),這時可以對這項任務(wù)獨立地進行編寫,形成一個子程序或過程。3-69CALLRET子程序語句序列2結(jié)束開始語句序列1子程序調(diào)用恢復(fù)現(xiàn)場返回開始保護現(xiàn)場語句序列3.6.0子程序設(shè)計概述從子程序返回主程序則簡稱為“返主”通常將主程序向子程序轉(zhuǎn)移叫子程序調(diào)用或過程調(diào)用,簡稱“轉(zhuǎn)子”子程序結(jié)構(gòu)如圖所示:3-70正確使用CALL/RET指令轉(zhuǎn)子和返主過程中的現(xiàn)場保護和恢復(fù)
⑴主程序與子程序所使用的存儲單元和寄存器盡量分開,互不干擾?,F(xiàn)場保護和恢復(fù)又有兩種方法:3.6.1主程序與子程序的接口主程序與子程序的接口主要解決兩大問題:3-71SUBRPROCPUSHAXPUSHBX… ;子程序體POPBXPOPAX
RETSUBRENDP子程序這時,既可在子程序中保存和恢復(fù),又可在主程序中保存和恢復(fù)。例如:…PUSHAXPUSHBXCALLSUBRPOPBXPOPAX…
主程序3.6.1主程序與子程序的接口⑵將“現(xiàn)場”通過堆棧保存和恢復(fù)3-72主程序在調(diào)用子程序時,往往要向子程序傳遞一些參數(shù);同樣,子程序運行后也經(jīng)常要把一些結(jié)果傳回給主程序。主程序與子程序之間的這種信息傳遞稱為參數(shù)傳遞。一般將子程序需要從主程序獲取的參數(shù)稱為入口參數(shù),而將子程序返回給主程序的參數(shù)稱為出口參數(shù)。入口參數(shù)使子程序可以對不同數(shù)據(jù)進行相同功能的處理,出口參數(shù)使子程序可送出不同的結(jié)果至主程序。3.6.2主程序與子程序的參數(shù)傳遞
3-73常用的參數(shù)傳遞方法有:寄存器傳遞法存儲器傳遞法堆棧傳遞法具體采用何種方法要根據(jù)情況事先約定好,有時可能同時采用多種方法。
3.6.2主程序與子程序的參數(shù)傳遞調(diào)用前,主程序?qū)?shù)保存在某些通用寄存器中,子程序則直接引用寄存器中的參數(shù)。出口參數(shù)也可通過寄存器返回給主程序。調(diào)用前,主程序?qū)?shù)存放到內(nèi)存的某一區(qū)域或內(nèi)存變量中,子程序到此約定的參數(shù)區(qū)或內(nèi)存變量中獲取參數(shù),結(jié)果也可通過約定的存儲變量返回給主程序。主程序與子程序?qū)⒁獋鬟f的信息放在堆棧中,使用時再從堆棧中取出。3-74子程序設(shè)計舉例
例3.14從內(nèi)存ARY開始的數(shù)據(jù)區(qū)中存放著由N個無符號字數(shù)據(jù)組成的一維數(shù)組,編寫程序?qū)@N個元素的數(shù)組求和。3.6.2主程序與子程序的參數(shù)傳遞方法一、用寄存器傳遞參數(shù)
主程序通過寄存器BX、CX分別將數(shù)組的起始地址和長度信息傳遞給子程序;子程序計算的結(jié)果則通過DX:AX寄存器對返回主程序。3-75例3.14用寄存器傳遞參數(shù)的程序如下:3.6.2主程序與子程序的參數(shù)傳遞.486DSEGSEGMENTUSE16ARYDW123,234,…,1234COUNTEQU($-ARY)/2;定義數(shù)組長度
SUMDW2DUP(?);定義結(jié)果單元DSEGENDSCODESEGMENTUSE16ASSUMECS:CODE,DS:DSEGSTART:MOVAX,DSEGMOVDS,AX
LEABX,ARY;取數(shù)組地址MOVCX,COUNT;取數(shù)組長度CALLPROADD;調(diào)子程序求和
MOVSUM,AX;保存結(jié)果MOVSUM[2],DXMOVAX,4C00HINT21HPROADDPROCNEARXORAX,AX;累加器清0MOVDX,AXNEXT:ADDAX,[BX];求和
ADCDX,0ADDBX,2;調(diào)整指針
LOOPNEXTRETPROADDENDPCODEENDSENDSTART3-76方法二、用地址表傳遞參數(shù)這是存儲器傳遞與寄存器傳遞的結(jié)合。主程序在內(nèi)存中先建立該數(shù)組和結(jié)果變量,然后將數(shù)組的起始地址、長度和結(jié)果返回地址組成參數(shù)表傳遞給子程序,子程序通過參數(shù)表訪問主程序規(guī)定的數(shù)組。3.6.2主程序與子程序的參數(shù)傳遞3-77例3.14用地址表傳遞參數(shù)的程序如下:
溫馨提示
- 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版實習(xí)指導(dǎo)教師專業(yè)素養(yǎng)提升項目勞動合同規(guī)范3篇
- 2025版公益宣傳活動宣傳品制作及推廣合同2篇
- 2025版住宅小區(qū)地下車庫車位租賃及維護服務(wù)合同范本2篇
- 2025版木工班組智能化設(shè)備引進與應(yīng)用合同4篇
- 企業(yè)對人才需求談職業(yè)
- 2025年度個人房產(chǎn)維修勞務(wù)合同范本4篇
- 二零二五年度股權(quán)并購與國際化布局合同3篇
- 2025版國際貿(mào)易采購合同(原材料)3篇
- 民政局2025年度自愿離婚協(xié)議書財產(chǎn)分割與子女撫養(yǎng)協(xié)議范本4篇
- 基于2025年度需求的冷卻塔設(shè)計、安裝與調(diào)試服務(wù)合同2篇
- 四川省成都市武侯區(qū)2023-2024學(xué)年九年級上學(xué)期期末考試化學(xué)試題
- 教育部《中小學(xué)校園食品安全和膳食經(jīng)費管理工作指引》知識培訓(xùn)
- 初一到初三英語單詞表2182個帶音標(biāo)打印版
- 2024年秋季人教版七年級上冊生物全冊教學(xué)課件(2024年秋季新版教材)
- 2024年共青團入團積極分子考試題庫(含答案)
- 碎屑巖油藏注水水質(zhì)指標(biāo)及分析方法
- 【S洲際酒店婚禮策劃方案設(shè)計6800字(論文)】
- 鐵路項目征地拆遷工作體會課件
- 醫(yī)院死亡報告年終分析報告
- 中國教育史(第四版)全套教學(xué)課件
- 2023年11月英語二級筆譯真題及答案(筆譯實務(wù))
評論
0/150
提交評論