




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
微機(jī)電子教程第四章匯編程序設(shè)計(jì)第1頁(yè),共78頁(yè),2023年,2月20日,星期六②這樣的程序占用內(nèi)存空間少、執(zhí)行速度快。所以,匯編語(yǔ)言多用來(lái)編寫計(jì)算機(jī)系統(tǒng)程序、實(shí)時(shí)通信程序、實(shí)時(shí)控制程序等,也可被各種高級(jí)語(yǔ)言所嵌用。
2、幾種匯編在IBMPC微機(jī)上流行的匯編程序是微軟公司的小匯編(ASM)和宏匯編(MASM)兩種。(還有TASM、OPTASM)計(jì)算機(jī)中完成匯編任務(wù)的程序被稱為匯編程序(ASSEMBLER)它可以:①將匯編語(yǔ)言源程序翻譯成機(jī)器語(yǔ)言程序②能夠根據(jù)用戶要求自動(dòng)分配存儲(chǔ)區(qū)域(包括程序區(qū)、數(shù)據(jù)區(qū)等);③自動(dòng)地把各種進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù);④把字符轉(zhuǎn)換成ASCII碼;⑤計(jì)算表達(dá)式的值;⑥自動(dòng)對(duì)源程序進(jìn)行檢查,給出錯(cuò)誤信息(如非法格式、未定義的助記符、標(biāo)號(hào)、漏掉操作數(shù)等)等
第2頁(yè),共78頁(yè),2023年,2月20日,星期六上機(jī)環(huán)境硬件系統(tǒng)軟件
應(yīng)用軟件
操作系統(tǒng):DOS系統(tǒng)編輯器:EDIT.exe編程序:MASM.exe連接程序:LINK.exe調(diào)試程序:DEBUG.exe用戶開發(fā)的程序:ABC.exe等CPU、存儲(chǔ)器(ROM、RAM)、I/O接口、輸入、輸出設(shè)備3、匯編語(yǔ)言程序上機(jī)處理過(guò)程第3頁(yè),共78頁(yè),2023年,2月20日,星期六
匯編語(yǔ)言上機(jī)過(guò)程D:>EDITABC.asmD:>MASMABC;有語(yǔ)法錯(cuò),回EDIT下改該程序D:>LINKABC;有錯(cuò),回在EDIT下改程序D:>ABC運(yùn)行結(jié)果錯(cuò),回EDIT下改程序或在DEBUG下調(diào)試,找原因。D:>DEBUGABC.exe編輯源程序
EDITABC.ASM匯編源程序
MASM
ABC.ASM形成目標(biāo)程序ABC.OBJ連接目標(biāo)程序
LINKABC.OBJ有連接錯(cuò)誤信息?形成可執(zhí)行程序
ABC.EXE裝入可執(zhí)行程序到內(nèi)存,并執(zhí)行D:\>sub>ABC下一程序用DEBUG調(diào)試可執(zhí)行程序D:\>sub>DEBUG
ABC.EXE找到原因YNYNNYN有匯編錯(cuò)誤信息?Y運(yùn)行結(jié)果正確?用DEBUG調(diào)試程序查錯(cuò)?第4頁(yè),共78頁(yè),2023年,2月20日,星期六4.2匯編語(yǔ)言的程序結(jié)構(gòu)與語(yǔ)句格式4.2.1匯編語(yǔ)言源程序的框架結(jié)構(gòu)(書P141)一、源程序的結(jié)構(gòu)特點(diǎn)
1、由若干個(gè)邏輯段組成,各邏輯段都有一個(gè)段名,由段定義語(yǔ)句(偽指令語(yǔ)句)來(lái)定義和說(shuō)明。
源程序中一般具有代碼段、堆棧段、數(shù)據(jù)段和附加數(shù)據(jù)段。
代碼段是必不可少的。
數(shù)據(jù)段或附加段用來(lái)在內(nèi)存中建立一個(gè)適當(dāng)容量的工作區(qū)用以存放常數(shù)和變量,并作為算術(shù)運(yùn)算或I/O接口傳送數(shù)據(jù)的工作區(qū)等。
堆棧段則在內(nèi)存中建立一個(gè)堆棧區(qū),以便在中斷和子程序(或過(guò)程)調(diào)用及各模塊間傳遞參數(shù)時(shí)使用。第5頁(yè),共78頁(yè),2023年,2月20日,星期六
8086/8088/80286只允許同時(shí)使用4種類型的段:代碼段(CS)、堆棧段(SS)、數(shù)據(jù)段(DS)和附加段(ES)。80386/80486和Pentium系列允許同時(shí)使用6種段,除以上4種段外,還可有FS和GS兩個(gè)附加數(shù)據(jù)段。在8086/8088和實(shí)地址方式下,每個(gè)段的最大長(zhǎng)度均為64KB;而在保護(hù)方式下,80286允許每個(gè)段的最大長(zhǎng)度為16MB,80386/80486和Pentium系列允許4GB。在一個(gè)源程序中每種類型的段又可存在若干個(gè),如幾個(gè)數(shù)據(jù)段2、在代碼段起始處,用ASSUME說(shuō)明各個(gè)段寄存器與邏輯段的關(guān)系,并在程序開始處設(shè)置段寄存器的初值(代碼段CS除外)。3、每段由若干語(yǔ)句行組成,每行只能寫一條語(yǔ)句,允許續(xù)行。整個(gè)源程序必須以END來(lái)標(biāo)志執(zhí)行的結(jié)束。在END后的標(biāo)號(hào)START表示程序中運(yùn)行第一條指令的起始地址。4、每條語(yǔ)句由4個(gè)字段構(gòu)成。各字段間用空格分開。5、每個(gè)源程序中必須含有返回DOS的指令語(yǔ)句,以便返回DOS繼續(xù)鍵入命令。如:標(biāo)準(zhǔn)序法。第6頁(yè),共78頁(yè),2023年,2月20日,星期六二、源程序與PCDOS的接口匯編語(yǔ)言源程序經(jīng)過(guò)匯編轉(zhuǎn)變?yōu)槟繕?biāo)程序,當(dāng)用鏈接程序?qū)ζ渥鬟M(jìn)行鏈接和定位時(shí),操作系統(tǒng)完成:
1、為每個(gè)用戶程序分配一個(gè)256字節(jié)的程序段前綴區(qū)(PSP),主要存放用戶程序信息。
在PSP的開始處(偏移地址0000H)安排一條INT20H軟中斷指令。該程序的功能是使系統(tǒng)返回到DOS管理狀態(tài)。因此,用戶在組織程序時(shí),必須使程序執(zhí)行完后能夠轉(zhuǎn)去執(zhí)行存放于PSP開始處的INT20H指令。2、定位用戶程序。3、設(shè)置DS和ES的值,使之指向PSP的開始處,即PSP的首地址。4、將CS設(shè)置為用戶程序的段基址,IP為程序執(zhí)行時(shí)的第一個(gè)地址,設(shè)置SS、SP。5、運(yùn)行用戶程序。第7頁(yè),共78頁(yè),2023年,2月20日,星期六保證用戶程序執(zhí)行完后返回DOS:
第一種方法:標(biāo)準(zhǔn)序法:
①將用戶程序中的主程序定義為FAR過(guò)程,其最后一條指令為RET;當(dāng)程序執(zhí)行到RET時(shí),會(huì)將棧頂?shù)膬蓚€(gè)字分別送IP、CS。②在主程序的開始處將PSP所在段的段地址DS(或ES)保存進(jìn)棧,然后再將一個(gè)全0的字(PSP的段內(nèi)偏移地址)壓入堆棧。這就是程序結(jié)構(gòu)中的以下三條指令:PUSH DS ;保護(hù)PSP段地址MOV AX,0 ;保護(hù)偏移0地址PUSH AX當(dāng)用戶程序返回時(shí),會(huì)返回到DOS,執(zhí)行INT21H注:由于DS、ES由DOS已設(shè)置,所以在用戶程序的開始處應(yīng)重新設(shè)置DS、ES。第二種方法:非標(biāo)準(zhǔn)方法:不定義主程序?yàn)镕AR過(guò)程并去掉標(biāo)準(zhǔn)序部分,只在代碼段結(jié)束之前(即CODEENDS之前)增加兩句:MOV AH,4CHINT 21H第8頁(yè),共78頁(yè),2023年,2月20日,星期六4、2、2匯編語(yǔ)言的語(yǔ)句一、語(yǔ)句的種類與格式1、語(yǔ)句的種類⑴指令語(yǔ)句:可執(zhí)行語(yǔ)句,與CPU指令系統(tǒng)的指令相對(duì)應(yīng),匯編程序?yàn)橹a(chǎn)生一一對(duì)應(yīng)的機(jī)器代碼。
例:MOV AH,4CH
例:偽指令語(yǔ)句MESSAGEDB‘THISISASAMPLEPROGRAM.’;定義變量MESSAGE在數(shù)據(jù)段DATA中的存放形式。匯編時(shí),;匯編程序?qū)ESSAGE定義為一個(gè)字節(jié)類型數(shù)據(jù)區(qū)的首地址,;并按字節(jié)存儲(chǔ)字符串信息。⑵偽指令語(yǔ)句:CPU不執(zhí)行的語(yǔ)句,只是匯編時(shí)給匯編程序提供匯編信息,如定義符號(hào)、分配存儲(chǔ)單元、將程序分段等。它本身并不產(chǎn)生目標(biāo)代碼,所以是指示性語(yǔ)句。第9頁(yè),共78頁(yè),2023年,2月20日,星期六⑶宏指令語(yǔ)句:是以某個(gè)宏名字定義的一段指令序列。匯編時(shí),凡有宏指令語(yǔ)句的地方都將用相應(yīng)的指令序列的目標(biāo)代碼插入。宏指令語(yǔ)句是一般性指令語(yǔ)句的擴(kuò)展。2、語(yǔ)句格式指令語(yǔ)句的一般格式為:[標(biāo)號(hào):] [前綴]指令助記符
[操作數(shù)] [;注釋]偽指令語(yǔ)句的格式為:[名字] 偽指令定義符
[操作數(shù)] [;注釋]①標(biāo)號(hào)和名字
標(biāo)號(hào)代表指令所在存儲(chǔ)單元的符號(hào)地址。后跟冒號(hào),在程序中作為轉(zhuǎn)移(JMP)、調(diào)用(CALL)和循環(huán)(LOOP)指令的轉(zhuǎn)移目標(biāo),與具體的指令地址相聯(lián)系。偽指令語(yǔ)句的名字一般用于定義常量名、變量名、過(guò)程名、段名等。
標(biāo)號(hào)和名字必須符合匯編語(yǔ)言對(duì)標(biāo)識(shí)符的規(guī)定:第10頁(yè),共78頁(yè),2023年,2月20日,星期六以字母開頭,由字母(A~Z或a~z,匯編程序不區(qū)分大小寫)、數(shù)字(0~9)及部分特殊字符(?、@、$和下劃線_等)組成的字符串表示,字符串長(zhǎng)度不能超過(guò)31個(gè)。標(biāo)識(shí)符不能是匯編語(yǔ)言中有特定意義的保留字,如:CPU的內(nèi)部寄存器名AH、AL、AX等。②助記符、定義符規(guī)定指令或偽指令的操作功能,是語(yǔ)句中唯一不可缺少的部分。
前綴僅可出現(xiàn)在指令助記符前。③操作數(shù)指令語(yǔ)句中提供指令的操作對(duì)象、存放位置。偽指令語(yǔ)句中操作數(shù)的格式和含義隨偽操作指令不同而不同。操作數(shù)可以是一個(gè)或2個(gè)或0個(gè)(INCBX,PUSHAX;MOVAX,DATA;RET,HLT,NOP,CLD)
④注釋以“;”開始,給以編程說(shuō)明。第11頁(yè),共78頁(yè),2023年,2月20日,星期六二、語(yǔ)句中的操作數(shù)1、常量操作數(shù)
——在運(yùn)行期間不變化的量:立即數(shù)、端口地址。常用有:2﹟(B),10﹟(D),8﹟(Q),16﹟(H)的整型常量,字符串常量。凡數(shù)字在A—F之間且在最高位,必須加前綴0字符串常量是用單引號(hào)括起來(lái)的一個(gè)或多個(gè)字符,其值為字符的ASCII代碼值。例:‘A’=41H‘AB’=4142H2、Reg操作數(shù)操作數(shù)部分是寄存器名,如:AX、SI和DS等3、存貯器操作數(shù)有標(biāo)號(hào)與變量?jī)煞N。⑴標(biāo)號(hào):與指令地址相關(guān)聯(lián),或某個(gè)過(guò)程起點(diǎn)位置
在代碼段內(nèi)相關(guān)聯(lián)。⑵變量:存放在存貯單元中的值,變量常以變量名的形式出現(xiàn)在程序中。第12頁(yè),共78頁(yè),2023年,2月20日,星期六在數(shù)據(jù)段或堆棧段中,是存放數(shù)據(jù)的存放單元的符號(hào)地址,與各種尋址方式有關(guān)(存貯器操作數(shù)尋址方式)標(biāo)號(hào)和變量都與存儲(chǔ)器地址相關(guān)聯(lián),都具有以下三種屬性:·段屬性(SEGMENT)――段基址,即標(biāo)號(hào)或變量所在段的段地址·偏移量屬性(OFFSET)――段內(nèi)偏移地址,即標(biāo)號(hào)或變量所在的地址與所在段的段起始地址之差?!ゎ愋蛯傩?TYPE)――變量的類型是指變量存取單位的字節(jié)數(shù)大小類型有字節(jié)(BYTE)、字(WORD)、雙字(DWORD)、四字、十字節(jié)5種。標(biāo)號(hào)的類型則指標(biāo)號(hào)與使用它的指令之間的距離遠(yuǎn)近。當(dāng)標(biāo)號(hào)作為轉(zhuǎn)移指令或調(diào)用指令的目標(biāo)操作數(shù)時(shí),若是段內(nèi)的轉(zhuǎn)移和調(diào)用,這個(gè)標(biāo)號(hào)的類型屬性為NEAR;若是段間的轉(zhuǎn)移和調(diào)用,標(biāo)號(hào)的類型屬性為FAR。第13頁(yè),共78頁(yè),2023年,2月20日,星期六4、表達(dá)式操作數(shù)
表達(dá)式由各種操作數(shù)、運(yùn)算符和操作符組成。(1)匯編語(yǔ)言中表達(dá)式有兩類數(shù)值表達(dá)式:由數(shù)值常量、字符串常量或符號(hào)常量等與算術(shù)、邏輯或關(guān)系運(yùn)算符連接而成。在匯編時(shí)產(chǎn)生一個(gè)數(shù)值。地址表達(dá)式:由常量、變量、標(biāo)號(hào)、寄存器(如BX、BP、SI、DI)的內(nèi)容以及一些運(yùn)算符組成。其值表示存儲(chǔ)器地址,一般都是段內(nèi)的偏移地址,因此它也具有段屬性、偏移量屬性和類型屬性。如ES:[SI+4](2)運(yùn)算符和操作符MASM宏匯編中有三種運(yùn)算符(算術(shù)、邏輯和關(guān)系運(yùn)算符)和兩種操作符(分析和合成操作符)。如書P146表4-1所示。運(yùn)算符實(shí)現(xiàn)對(duì)操作數(shù)的相關(guān)運(yùn)算,操作符則完成對(duì)操作數(shù)屬性的定義、調(diào)用和修改。第14頁(yè),共78頁(yè),2023年,2月20日,星期六①算術(shù)運(yùn)算符算術(shù)運(yùn)算符有+、-、×、/和MOD等。它們都可用于數(shù)值表達(dá)式,運(yùn)算結(jié)果是一個(gè)數(shù)值。在地址表達(dá)式中,對(duì)標(biāo)號(hào)或變量只可以使用加、減運(yùn)算符。經(jīng)常使用的是“標(biāo)號(hào)或變量±常量”這種形式。且運(yùn)算后仍為標(biāo)號(hào)或變量,其類型及段基址屬性不變,僅修改了偏移量屬性。如,PLACE+2×3是指PLACE字節(jié)單元后的第6個(gè)存儲(chǔ)單元的地址。若PLACE與某存貯單元地址相關(guān),則PLACE+2×3仍與某存貯單元相關(guān)。②邏輯運(yùn)算符——實(shí)現(xiàn)操作數(shù)按位邏輯操作。有AND、OR、XOR和NOT。只適用于數(shù)值表達(dá)式。注:邏輯運(yùn)算符和邏輯運(yùn)算指令助記符在符號(hào)形式上是一樣的,但兩者的含義有本質(zhì)差異。作為運(yùn)算符時(shí),它們是在程序匯編時(shí)由匯編程序計(jì)算的,計(jì)算結(jié)結(jié)果充當(dāng)指令的某一個(gè)操作數(shù)或構(gòu)成操作數(shù)的部分,邏輯運(yùn)算符的操作對(duì)象只能是整型常量。第15頁(yè),共78頁(yè),2023年,2月20日,星期六作為指令助記符時(shí),則是在程序運(yùn)行中執(zhí)行的,操作對(duì)象還可以是寄存器或存儲(chǔ)器操作數(shù)。
例:ANDDX,PORTAND0FEH運(yùn)算符匯編時(shí)產(chǎn)生一立即數(shù)CPU執(zhí)行時(shí)③關(guān)系運(yùn)算符關(guān)系運(yùn)算符有EQ、NE、LT、GT、LE和GE。關(guān)系運(yùn)算符的兩個(gè)操作數(shù)必須同是數(shù)值或同是一個(gè)段內(nèi)的兩個(gè)存儲(chǔ)器地址。比較時(shí)若關(guān)系不成立(為假)則結(jié)果為“0”,若關(guān)系成立(為真)則結(jié)果為全“1”。結(jié)果值在匯編時(shí)獲得。例:MOVBX,PORTLT5匯編為:MOVBX,0FFFFH(條件成立)或MOVBX,0000H(條件不成立)第16頁(yè),共78頁(yè),2023年,2月20日,星期六④分析操作符(數(shù)值返回運(yùn)算符)分析操作符的運(yùn)算對(duì)象是存儲(chǔ)器操作數(shù)。它返回變量或標(biāo)號(hào)的屬性值。⑤合成操作符(修改屬性運(yùn)算符)合成操作符作用于存儲(chǔ)器操作數(shù)時(shí)可以改變它們的屬性。(3)運(yùn)算符和操作符的優(yōu)先權(quán)等級(jí)
優(yōu)先級(jí)運(yùn)算符和操作符高低1LENGTH,SIZE,WIDTH,MASH,(),[],〈〉2PTR,OFFSET,SEG,TYPE,THIS,段寄存名:(加段前綴)3HIGH,LOW,(操作數(shù)高、低字節(jié))4+,-(單目)5*,/,MOD,SHL,SHR6+,-(雙目)7EQ,NE,LT,LE,GT,GE8NOT9AND10OR,XOR11SHORT第17頁(yè),共78頁(yè),2023年,2月20日,星期六
4.3
匯編語(yǔ)言的偽指令語(yǔ)句指示匯編,鏈接程序如何進(jìn)行匯編,鏈接,影響目標(biāo)代碼生成,本身不產(chǎn)生目標(biāo)代碼。
一.符號(hào)定義偽指令語(yǔ)句:——給表達(dá)式賦予一種符號(hào)名,以便在程序中使用1.EQU等值語(yǔ)句格式:符號(hào)名EQU表達(dá)式
例:PORTEQU40H
注:EQU語(yǔ)句不能重新定義,即在同一源程序中,用EQU定義過(guò)的符號(hào)不能賦予不同的值。第18頁(yè),共78頁(yè),2023年,2月20日,星期六
2.符號(hào)語(yǔ)句=格式:符號(hào)名
=
表達(dá)式功能與EQU類似,但可重新定義。
例:EMP=60EMP=EMP+1EMP=123X4二:數(shù)據(jù)定義偽指令用于定義變量,指定變量的類型和名稱,并為變量分配內(nèi)存單元。
1.?dāng)?shù)據(jù)定義語(yǔ)句的格式格式:[變量名]數(shù)據(jù)定義符操作數(shù)[,操作數(shù)]…[,操作數(shù)]操作數(shù)是賦給變量的初值,多個(gè)相同類型的變量可在一條語(yǔ)句中定義。第19頁(yè),共78頁(yè),2023年,2月20日,星期六經(jīng)過(guò)定義的變量有3個(gè)屬性:TYPE,SEGMENT,OFFSET若某個(gè)變量表示的是一個(gè)數(shù)組,則其類型屬性為變量的單個(gè)元素所占用的字節(jié)數(shù)。常用的數(shù)據(jù)定義符DB——定義字節(jié)變量,每個(gè)變量占一個(gè)字節(jié)的存儲(chǔ)單元DW——定義字變量,每個(gè)變量占兩個(gè)字節(jié)的存儲(chǔ)單元,存放時(shí)低對(duì)低,高對(duì)高DD——定義雙字變量,每個(gè)變量占4個(gè)字節(jié)的存儲(chǔ)單元,低對(duì)低,高對(duì)高第20頁(yè),共78頁(yè),2023年,2月20日,星期六
2.具體形式和功能(1)為數(shù)據(jù)項(xiàng)分配存儲(chǔ)單元,用變量名作為該存儲(chǔ)單元的名稱。
例:X DB 25H YDW 4142H ZDD 12345678H 存儲(chǔ)形式如圖:XYZ12H34H56H78H41H42H25H初始值也可以是表達(dá)式如:IN_PORT DB PORT_VALOUT_PORT DB PORT_VAL+1其中,PORT_VAL已由EQU語(yǔ)句賦了值。第21頁(yè),共78頁(yè),2023年,2月20日,星期六(2)預(yù)留內(nèi)存單元,但不賦值,以存放運(yùn)算結(jié)果
例:ADB?BDB?(3)定義一個(gè)表(數(shù)組)
例:W_TABLE DW 1122H,3344HB_TABLEDB1,2,4,9,16
當(dāng)表中的操作數(shù)相同時(shí),可用重復(fù)操作符DUP來(lái)縮寫
例:ALL_ZERO DB 0,0,0,0,0,0ALL_ZERO DB 6DUP(0)(4)定義字符串(DB)
例:MESSAGE DB ‘HELLO’每個(gè)字符之值為它的ASCII碼值,所以用DB來(lái)定義第22頁(yè),共78頁(yè),2023年,2月20日,星期六當(dāng)字符串長(zhǎng)度不超過(guò)兩個(gè)字符時(shí),也可以用DW來(lái)定義
例:
STRING1
DB ‘AB’STRING2
DW ‘AB’STRING3
DW ‘AB’,‘CD’43H44H41H42H41H42H42H41HSTRING1STRING2STRINGABBABADC存放形式如右圖;第23頁(yè),共78頁(yè),2023年,2月20日,星期六(5)當(dāng)操作數(shù)是地址表達(dá)式時(shí),可用DW或DD偽指令將標(biāo)號(hào)或變量操作數(shù)的偏移地址或全地址來(lái)初始化存儲(chǔ)器。
例:XXDWCYCLE
YYDDCYCLE
…CYCLE:MOVBX,AX;BX,AX是程序的一個(gè)NEAR標(biāo)號(hào)例:VAR3DWVAR+1;將VAR+1的的偏移地址存入VAR3開始的兩個(gè)字節(jié)VAR3DWVAR+1;存入的是VAR+1的全地址(6)數(shù)據(jù)定義語(yǔ)句使匯編程序?qū)υL問(wèn)存儲(chǔ)器的指令,產(chǎn)生正確的目標(biāo)代碼。第24頁(yè),共78頁(yè),2023年,2月20日,星期六
例1:OPER1DB?,?OPER2DW?,?
…
MOVOPER1,0;字節(jié)0OPER1MOVOPER2,0;字 OPER2對(duì)例2,可以如下處置:MOVAX,WORDPTROPER1+1;AX=3402HMOVAL,BYTEPTROPER2;AL=34HMOVAL,BYTEPTROPER2+1;AL=12H例2:OPER1DB1,2OPER2DW1234H,5678H…MOVAX,OPER1MOVAL,OPER2這里類型不匹配第25頁(yè),共78頁(yè),2023年,2月20日,星期六3.分析操作符和合成操作符用分析和合成操作符,返回或修改存儲(chǔ)器操作數(shù)的3種屬性
(1)分析操作符
SEGOFFSETTYPESIZELENGTH格式:操作符標(biāo)號(hào)或變量①SEGOFFSET返回標(biāo)號(hào)或變量的段地址和偏移地址例:ARRAYDB100DUP(0)…MOVAX,SEGARRAYMOVDS,AXMOVBX,OFFSETARRAYMOVAL,[BX]第26頁(yè),共78頁(yè),2023年,2月20日,星期六②TYPELENGTHSIZE
TYPE—返回存儲(chǔ)器操作數(shù)類型SIZE——返回TYPE和LENGTH的乘積,表示為變量所分配的字節(jié)存儲(chǔ)單元總數(shù)LENGTH——返回變量用DUP重復(fù)定義的數(shù)據(jù)項(xiàng)總數(shù)-2FAR標(biāo)號(hào)-1NEAR標(biāo)號(hào)4DWORD雙字變量2WORD字變量1BYTE字節(jié)變量類型值類型屬性存儲(chǔ)器操作數(shù)例:BUFFER1DB100DUP(0)BUFFER2DW200DUP(20H)BUFFER3DD100DUP(13)則LENGTHBUFFER1=100LENGTHBUFFER2=200LENGTHBUFFER3=100注:用LENGTH返回的存儲(chǔ)區(qū)必須用DUP來(lái)定義,否則返回1第27頁(yè),共78頁(yè),2023年,2月20日,星期六
(2)合成操作符PTRLABLETHIS1、PTR——臨時(shí)修改或指定存儲(chǔ)器操作數(shù)的類型屬性,而保持原有的段,偏移地址屬性,且原定義的類型屬性不變僅在當(dāng)前所在的指令中有效格式類型PTR標(biāo)號(hào)或變量例:ARRAY1DB0,1,2,3,4ARRAY2DW0,1,2,3,4MOVBX,WORDPTRARRAY1[3]MOVCL,BUTEPTRARRAY2[6]MOVWORDPTR[SI],4配合EQU偽指令,還可以為變量ARRAY1和ARRAY2定義新的變量名,如:WBYTEEQUWORDPTRARRAY1BWORDEQUBYTEPTRARRAT2MOVBX,WBYTE[3]MOVCL,DWORD[6]第28頁(yè),共78頁(yè),2023年,2月20日,星期六PTR用來(lái)指明標(biāo)號(hào)的類型屬性時(shí),可確定是段內(nèi)轉(zhuǎn)移或段間轉(zhuǎn)移
例:INCHES:CMPSUM,100…JMPNEARPTRINCHES;段內(nèi)轉(zhuǎn)移,NEARPTR可省略…JMPFARPTRINCHES2、LABLE為當(dāng)前存儲(chǔ)單元定義一個(gè)指定類型的標(biāo)號(hào)或變量,用于定義一個(gè)數(shù)據(jù)塊或標(biāo)號(hào),使它們具有多重名字和屬性
格式:標(biāo)號(hào)或變量名LABLE類型例:
WBYTELABLEWORD;為變量WBYTE定義一個(gè)字類型的數(shù);據(jù)區(qū)ARRAYDB1,2,3,4MOVAL,ARRAY;01HALMOVAX,WBYTE;0201HAX
WBYTE、ARRAY指向同一個(gè)數(shù)據(jù)區(qū),但有不同的類型屬性第29頁(yè),共78頁(yè),2023年,2月20日,星期六3.THIS與LABLE結(jié)合使用,具有LABLE的同樣作用
格式:標(biāo)號(hào)或變量名EQUTHIS類型例:BWORDEQUTHISBYTE;定義字節(jié)ARRAYDW100DUP(?);定義字將原定義的字緩沖區(qū)按字節(jié)使用三:程序分段偽指令——用于告訴匯編程序和鏈接程序如何按邏輯段來(lái)組織程序和利用存儲(chǔ)器具體來(lái)說(shuō)規(guī)定段的起始和結(jié)束規(guī)定屬性開始地址邊界段類型同名段如何結(jié)合在一起兩種段定義簡(jiǎn)化段定義;對(duì)MASM5.0以上版本完整段定義;對(duì)所有版本故只介紹完整段定義第30頁(yè),共78頁(yè),2023年,2月20日,星期六1.段定義偽指令SEGMENT/ENDS——將程序分成段:代碼段,數(shù)據(jù)段,堆棧段,附加段格式:段名SEGMENT[定位類型][組合屬性][‘類別名’]…段體…段名ENDS段名含段的標(biāo)志符,有段基地址和段內(nèi)偏移量?jī)蓚€(gè)屬性,與某個(gè)存儲(chǔ)單元相聯(lián)系功能:指出段名和段的各種屬性,并表示段的開始和結(jié)束位置(1)定位類型——用于告訴鏈接程序,鏈接時(shí)(多模塊.obj)本段首地址的邊界定位方式,常有四種:PARA、PAGE、WORD、BYTE第31頁(yè),共78頁(yè),2023年,2月20日,星期六①PARA段的起始地址必須是16的倍數(shù)(XXXX0H),這是一種默認(rèn)方式②PAGE段的起始地址必須是256的倍數(shù)(XXX00H),256字節(jié)為一頁(yè),在頁(yè)的起點(diǎn)上③WORD段的起始地址必須是偶數(shù)(XX…0B)④BYTE段的起始地址可以是任何地址(2)組合類型在多模塊(每個(gè)模塊有自己的代碼段,數(shù)據(jù)段,堆棧段)組合時(shí),告訴Link程序本段要與其他模塊中同名段的組合鏈接關(guān)系。常有6種:①NONE:本段與其他同名段無(wú)組合關(guān)系,并有自己的段起始地址,——這是一種默認(rèn)方式第32頁(yè),共78頁(yè),2023年,2月20日,星期六②PUBLIC:在滿足定位類型的前提下,LINK程序?qū)⑵渑c其他模塊中的同名段鄰接在一起,共用一個(gè)段地址。③STACK:同PUBLIC鏈接以后作為堆棧段,并初始化SS,SP,若不說(shuō)明STACK,必須由用戶產(chǎn)生。程序的開始地址由指定完成初始化SS,SP。④COMMON:各模塊中,同名段重疊,覆蓋,有著相同的段地址,段長(zhǎng)由最長(zhǎng)的COMMON段決定。段的內(nèi)容為所鏈接的最后一個(gè)模塊中COMMON段的內(nèi)容以及沒(méi)有覆蓋到的前面COMMON段的內(nèi)容。⑤MEMERY:鏈接在其他所有段的后面(存儲(chǔ)器高地址區(qū)域),若有多個(gè)MEMERY段,則只認(rèn)第一個(gè),其余按COMMON處理。⑥AT表達(dá)式:指定本段存放的段地址(代碼段除外)
例:AT0930H本段從0903H開始存放第33頁(yè),共78頁(yè),2023年,2月20日,星期六例:兩個(gè)模塊模塊1:STACKSEGMENTYSTACKDW20DUP(?)STACKENDSDATASEGMENTCOMMON
……DATAENDSCODESEGMENTPUBLIC
……CODEENDSEND(3)類別名‘類別名’同名,同類別的段在內(nèi)存中依序連續(xù)存放。典型類別名如‘STACK’、‘CODE’和‘DATA’等,也允許用戶使用其它類別名。若缺省‘類別名’,則表明該段類別為空。第34頁(yè),共78頁(yè),2023年,2月20日,星期六模塊2:STACKSEGMENTSTACKDW30DUP(?)STACKENDSDATASEGMENTCOMMON
……DATAENDSCODESEGMENTPUBLIC
……CODEENDSEND匯編連接后,有:.........模塊1DATA模塊2代碼模塊1代碼模塊2DATA設(shè)模塊2DATA為模塊1DATASTACK50個(gè)字第35頁(yè),共78頁(yè),2023年,2月20日,星期六2.段寄存器說(shuō)明偽指令
格式:ASSUME段寄存器:段名[,段寄存器:段名,…]①指明程序中定義的段用哪一個(gè)段寄存器去尋址。②并沒(méi)有真正的將段地址裝入段寄存器,段寄存器的初值必須有用戶在程序的開始處用MOV指令來(lái)設(shè)置(CS除外)說(shuō)明:①段定義時(shí)用了STACK,系統(tǒng)會(huì)自動(dòng)初始化SS,SP,這時(shí)可去掉SS:SP以及代碼段中初始化SS,SP的四條語(yǔ)句.②CS,IP的初始化由偽指令ENDMAIN裝入,標(biāo)號(hào)MAIN標(biāo)志程序開始執(zhí)行的第一條指令地址,只有主程序的結(jié)束語(yǔ)句允許帶標(biāo)號(hào).③程序中MOVBL,XMOVALPHA,BL因?yàn)锳SSUME偽指令的作用,被匯編成:MOVBL,DS:XMOVES:ALPHA,BL第36頁(yè),共78頁(yè),2023年,2月20日,星期六4.指定地址偽指令在匯編程序中,有一個(gè)軟件計(jì)數(shù)器(LC)地址計(jì)數(shù)器,在每個(gè)段定義開始處,它被復(fù)位為0,然后逐行掃描語(yǔ)句,匯編時(shí),用LC保存當(dāng)前指令的地址.格式1:ORG表達(dá)式格式2:ORG$+表達(dá)式功能:強(qiáng)行指定地址計(jì)數(shù)器的當(dāng)前值,以改變?cè)谒院蟮拇a或數(shù)據(jù)存放的起始地址。格式1直接將表達(dá)式的值(范圍在0~65535之間)送入程序計(jì)數(shù)器。格式2將匯編ORG語(yǔ)句前程序計(jì)數(shù)器的現(xiàn)行值$加上表達(dá)式后送入程序計(jì)數(shù)器。依此值為起點(diǎn)來(lái)存放在ORG語(yǔ)句之后的程序或數(shù)據(jù),除非遇到一個(gè)新的ORG語(yǔ)句。
匯編語(yǔ)言中允許用戶直接用$來(lái)引用地址Reg的值.第37頁(yè),共78頁(yè),2023年,2月20日,星期六例1:VECTSEGMENTORG10VECT1DW47A5HORG20VECT2DW0C956HORG$+8(跳過(guò)8個(gè)字節(jié)的存儲(chǔ)區(qū))VECT3DW0123H
01
23
...
C9
56...
47
A5102016H+8=1EH14H15H16H1EH第38頁(yè),共78頁(yè),2023年,2月20日,星期六例2:ARRAYDW1,2,$+4,,3,4,$+4008200040003007C000200
010074H0075H76H 77H78H79H7AH7BH7CH7DH7EHARRAY78H+4($+4)7EH+4($+4)第39頁(yè),共78頁(yè),2023年,2月20日,星期六例3:DATASEGMENTORG30HDB1DB12H,34HORG$+20HSTRING1DB‘ABC…H’COUNTEQU$-STRING1DATAENDS
‘H’...
41H...
34H
12H30H31H20HCOUNT第40頁(yè),共78頁(yè),2023年,2月20日,星期六四.模塊的定義和通信
MASM宏匯編語(yǔ)言提供了模塊化編程偽指令,用以實(shí)現(xiàn)模塊的定義與通信.一個(gè)任務(wù)的源程序由若干模塊組成,每個(gè)模塊有代碼段,數(shù)據(jù)段,對(duì)應(yīng)一個(gè).ASM,是個(gè)獨(dú)立的編譯單位.當(dāng)各個(gè)模塊編譯完畢,可用LINK連接各模塊形成一個(gè)完整的可執(zhí)行程序.1.模塊的定義:NAME模塊名……END[標(biāo)號(hào)]主模塊要跟標(biāo)號(hào),子模塊不跟標(biāo)號(hào)2.模塊間的通信實(shí)現(xiàn)模塊間的數(shù)據(jù)或過(guò)程的互訪和共享。格式:PUBLIC 名字[,名字,…]EXTRN 名字:類型[,名字:類型,…]其中,名字可以是標(biāo)號(hào)、變量名、過(guò)程名或由EQU(或=)偽指令定義的符號(hào)名。第41頁(yè),共78頁(yè),2023年,2月20日,星期六過(guò)程和宏定義偽指令過(guò)程和宏是模塊化程序設(shè)計(jì)的基礎(chǔ).匯編語(yǔ)言中引用定義過(guò)程和宏的方法來(lái)實(shí)現(xiàn)按模塊程序代碼的功能.
1.過(guò)程定義偽指令過(guò)程:一段可以由CALL指令調(diào)用,用RET返回的程序格式:過(guò)程名 PROC [NEAR]/FAR…[RET]… RET過(guò)程名 ENDP類型可以是BYTE、WORD、DWORD、NEAR、FAR和ABS等PUBLIC和EXTERN配對(duì)使用,由PUBLIC說(shuō)明的名字是全局的,可以在其他模塊中使用,EXTERN表明本模塊中使用的名字在別的模塊中定義過(guò),類型一致.第42頁(yè),共78頁(yè),2023年,2月20日,星期六2.宏定義偽指令宏定義:將程序段定義為一條指令。格式:宏指令名 MACRO [形參,形參…] : ;ENDM宏調(diào)用格式: 宏指令名 [實(shí)參,實(shí)參…]功能:定義一個(gè)過(guò)程,并指出過(guò)程名及過(guò)程的屬性①過(guò)程的屬性有NEAR,F(xiàn)ARNEAR過(guò)程只能被定義該過(guò)程的段中的其他過(guò)程調(diào)用(段內(nèi)調(diào)用)FAR過(guò)程可由任何段中的程序調(diào)用(段間調(diào)用)缺省時(shí)為NEAR②根據(jù)過(guò)程的屬性,匯編程序自動(dòng)對(duì)CALL,RET翻譯成段內(nèi)(段間)調(diào)用及段內(nèi)(段間)返回的目標(biāo)代碼。第43頁(yè),共78頁(yè),2023年,2月20日,星期六宏調(diào)用:在源程序中用宏指令代替所定義的程序段。宏擴(kuò)展:匯編時(shí),將相應(yīng)的程序段每條語(yǔ)句前冠以“t”,代替宏指令以產(chǎn)生目標(biāo)代碼。3.過(guò)程與宏的區(qū)別
對(duì)重復(fù)使用的模塊既可定義為過(guò)程,也可定義為宏。過(guò)程匯編成機(jī)器代碼,程序中只對(duì)CALL指令匯編(1)宏:由匯編程序識(shí)別,并將宏譯代碼插入過(guò)程:匯編時(shí)僅產(chǎn)生CALL指令代碼,過(guò)程代碼在程序執(zhí)行時(shí)完成。(2)宏可以直接傳遞參數(shù)。但過(guò)程傳遞參數(shù)的編程困難。(3)宏不減少空間開銷。而過(guò)程可減少空間開銷。(4)時(shí)間上,宏不增加時(shí)間開銷,但過(guò)程增加時(shí)間開銷。(5)宏體可以入庫(kù),可方便地使用其它程序中地宏體。第44頁(yè),共78頁(yè),2023年,2月20日,星期六七條件匯編條件匯編偽指令可使匯編程序根據(jù)某種條件有選擇地對(duì)源程序中的某部分語(yǔ)句進(jìn)行匯編處理。格式:IF×× 條件表達(dá)式… ;[ELSE…] ;ENDIF第45頁(yè),共78頁(yè),2023年,2月20日,星期六4.4匯編語(yǔ)言程序設(shè)計(jì)基礎(chǔ)本節(jié)將介紹匯編語(yǔ)言程序設(shè)計(jì)的常用結(jié)構(gòu)與方法。4.4.1程序設(shè)計(jì)的基本過(guò)程一、程序設(shè)計(jì)的一般步驟匯編語(yǔ)言程序設(shè)計(jì)基本上與高級(jí)語(yǔ)言程序設(shè)計(jì)一樣,一般步驟:1.分析問(wèn)題并抽象出數(shù)學(xué)模型。2.確定解決此數(shù)學(xué)模型的算法。3.畫出程序結(jié)構(gòu)框圖和流程圖。4.分配內(nèi)存工作單元和寄存器。5.編程并調(diào)試。二、評(píng)價(jià)程序質(zhì)量的標(biāo)準(zhǔn)1、合理組織數(shù)據(jù),發(fā)揮存貯器、Reg的作用。2、程序邏輯結(jié)構(gòu)好,便于二次開發(fā)。3、可讀性強(qiáng)。4、高可讀性和可維護(hù)性。5、效率高(代碼少)。第46頁(yè),共78頁(yè),2023年,2月20日,星期六4、4、2程序的基本結(jié)構(gòu)一、順序結(jié)構(gòu)對(duì)應(yīng)簡(jiǎn)單程序,順序執(zhí)行,無(wú)轉(zhuǎn)移、無(wú)循環(huán)。二、分支結(jié)構(gòu)依據(jù)不同條件分支到各程序段,有雙分支和多分支兩種。三、循環(huán)結(jié)構(gòu)實(shí)現(xiàn)那些需要重復(fù)做的工作。三種基本結(jié)構(gòu)奠定了實(shí)現(xiàn)任何復(fù)雜程序的基礎(chǔ)。第47頁(yè),共78頁(yè),2023年,2月20日,星期六分支結(jié)構(gòu)兩個(gè)分支YN
、、、CMPAL,BLJGgreat
JMPexitgreat:
exit:、、、、、、
AL≤BL處理AL>BL處理順序結(jié)構(gòu)第48頁(yè),共78頁(yè),2023年,2月20日,星期六分支結(jié)構(gòu)三個(gè)分支
、、、CMPAL,0
JGgreat
JLless
JMPexitless:
JMPexitgreat:
exit:、、、AL=0處理AL>0處理AL<0處理第49頁(yè),共78頁(yè),2023年,2月20日,星期六循環(huán)結(jié)構(gòu)循環(huán)初始設(shè)置循環(huán)體循環(huán)條件判斷?YN當(dāng)型循環(huán)(當(dāng)條件成立進(jìn)入循環(huán))YN循環(huán)初始設(shè)置循環(huán)體循環(huán)條件判斷?直到型循環(huán)(直到條件成立退出循環(huán))第50頁(yè),共78頁(yè),2023年,2月20日,星期六4、4、3程序設(shè)計(jì)基本方法二、分支結(jié)構(gòu)程序的設(shè)計(jì)設(shè)計(jì)分支程序的關(guān)鍵是①如何判斷分支的條件②如何實(shí)現(xiàn)分支結(jié)構(gòu)1、利用比較和轉(zhuǎn)移指令實(shí)現(xiàn)分支利用比較和轉(zhuǎn)移指令實(shí)現(xiàn)分支程序設(shè)計(jì)的方法,是在需要分支的地方用比較指令CMP、串比較指令CMPS或串搜索指令SCAS等順序進(jìn)行分支條件的比較判斷,然后利用各種條件轉(zhuǎn)移指令實(shí)現(xiàn)分支。
一、順序結(jié)構(gòu)程序設(shè)計(jì)——按事件發(fā)展的先后,選擇合適的指令有序地加以組合。
書P167例1第51頁(yè),共78頁(yè),2023年,2月20日,星期六例:P169例1例:P169例2數(shù)據(jù)塊傳送1、不重疊CLD,直接用MOVS或MOV2、源首址加數(shù)據(jù)塊長(zhǎng)度<目標(biāo)首址,CLD重疊增量傳送源首址加數(shù)據(jù)塊長(zhǎng)度>目標(biāo)首址,STD減量傳送2、利用跳轉(zhuǎn)表實(shí)現(xiàn)分支
——多用于多路分支跳轉(zhuǎn)地址(各子程序入口地址)跳轉(zhuǎn)表的組成跳轉(zhuǎn)指令(轉(zhuǎn)向子程序的轉(zhuǎn)移指令)關(guān)鍵字⑴根據(jù)表內(nèi)地址分支方法是:將需要分支的各子程序入口地址按照一定的順序存放在第52頁(yè),共78頁(yè),2023年,2月20日,星期六內(nèi)存區(qū)域中,若主程序需要轉(zhuǎn)去執(zhí)行某個(gè)子程序,可以根據(jù)一定的算法計(jì)算出該子程序地址在跳轉(zhuǎn)表中的位置,從而得到相應(yīng)子程序的入口地址,然后用JMP指令轉(zhuǎn)去執(zhí)行。若是段內(nèi)分支,每個(gè)地址在表內(nèi)占2個(gè)單元(IP的值),若是段間分支,每個(gè)地址占4個(gè)單元(CS:IP的值)。
例:P170
子程序入口地址的地址=表基地址(BASE)+(產(chǎn)品編號(hào))×2程序見(jiàn)P171⑵、根據(jù)表內(nèi)指令分支該表稱為命令表,命令表存放在代碼段。通常每三個(gè)單元存放一條轉(zhuǎn)移指令(設(shè)JMP是三字節(jié)指令)。只要能尋址到跳轉(zhuǎn)表相應(yīng)的項(xiàng),即可執(zhí)行轉(zhuǎn)至某子程序的JMP指令,實(shí)現(xiàn)程序的轉(zhuǎn)移。例、P172
BX=表基地址+編號(hào)×3
第53頁(yè),共78頁(yè),2023年,2月20日,星期六三、循環(huán)結(jié)構(gòu)程序設(shè)計(jì)1.循環(huán)程序的組成循環(huán)程序是在滿足某些條件時(shí)對(duì)一段程序的重復(fù)執(zhí)行,一般由四部分組成。
參數(shù)初始化工作部分參數(shù)修改YN(a)先執(zhí)行后判斷控制部分循環(huán)結(jié)束?(b)先判斷后執(zhí)行參數(shù)初始化控制部分循環(huán)結(jié)束嗎?工作部分修改部分YN第54頁(yè),共78頁(yè),2023年,2月20日,星期六2、基本結(jié)構(gòu)形式⑴先執(zhí)行后判斷(do—while)至少進(jìn)入一次循環(huán)體。常用于循環(huán)次數(shù)已知時(shí)。例:P173⑵先判斷后執(zhí)行不滿足條件則不執(zhí)行循環(huán)體,這時(shí)循環(huán)體可一次都不執(zhí)行。常用于循環(huán)體次數(shù)未知,根據(jù)具體情況找出控制循環(huán)體結(jié)束的條件時(shí)常用。例:P173例2控制循環(huán)體的條件是:當(dāng)AX內(nèi)容為全0,不必再繼續(xù)統(tǒng)計(jì)。3、循環(huán)控制方法每個(gè)循環(huán)程序必須選擇一個(gè)循環(huán)控制條件來(lái)控制循環(huán)的運(yùn)行和結(jié)束。常用循環(huán)控制條件(方法):(1)計(jì)數(shù)控制――循環(huán)次數(shù)已知,每循環(huán)一次加/減1。例1(2)條件控制――循環(huán)次數(shù)未知,須根據(jù)條件真假控制循環(huán)。例2第55頁(yè),共78頁(yè),2023年,2月20日,星期六(3)狀態(tài)控制――根據(jù)事先設(shè)置或?qū)崟r(shí)檢測(cè)的狀態(tài)來(lái)控制循環(huán)。(4)邏輯尺控制――在多次循環(huán)過(guò)程中需分別做不同的操作時(shí),可通過(guò)建立位串(邏輯尺)控制循環(huán)。P174例3(同學(xué)自看)
4、多重循環(huán)程序設(shè)計(jì)第56頁(yè),共78頁(yè),2023年,2月20日,星期六4.4.4子程序設(shè)計(jì)與調(diào)用技術(shù)子程序(或過(guò)程)是程序的一部分,是完成特定功能的程序段,它能在程序中任何地方被調(diào)用執(zhí)行。使用子程序是程序設(shè)計(jì)的一種重要方法,常在以下情況中使用子程序。(1)多次重復(fù)使用的程序段可定義為子程序。這樣可有效地簡(jiǎn)化程序的編制,縮短程序的長(zhǎng)度,從而節(jié)省磁盤或內(nèi)存空間。(2)具有通用性、便于共享的程序段可定義為子程序。例如代碼轉(zhuǎn)換、鍵盤處理等。(3)中斷處理程序一定是子程序。因?yàn)橹袛嗟陌l(fā)生是隨機(jī)的、不可預(yù)料的,所以對(duì)中斷的處理只能編制成子程序的形式。當(dāng)中斷發(fā)生時(shí),轉(zhuǎn)去它完成相應(yīng)的功能。
第57頁(yè),共78頁(yè),2023年,2月20日,星期六1.與子程序有關(guān)的術(shù)語(yǔ)(1)子程序嵌套:子程序中調(diào)用別的子程序稱為嵌套,只要堆棧空間允許,嵌套層次不限。(2)子程序遞歸調(diào)用:子程序調(diào)用該子程序本身稱為遞歸調(diào)用子程序中斷在中斷程序中又調(diào)用子程序2、子程序文件——由子程序的說(shuō)明文擋和子程序本身構(gòu)成。(4)可重定位子程序:全部采用相對(duì)地址、可重定位在內(nèi)存任意區(qū)域的子程序。
(3)可重入子程序:能夠被中斷并可再次被中斷程序調(diào)用的子程序。第58頁(yè),共78頁(yè),2023年,2月20日,星期六子程序文檔:(1)功能描述。包括子程序的名稱、功能、性能指標(biāo)(如執(zhí)行時(shí)間)等。(2)子程序的入口、出口參數(shù)。(3)所用寄存器和存儲(chǔ)單元。(4)子程序中又調(diào)用的其它子程序。(5)調(diào)用實(shí)例(可有可無(wú))。
例:有一子程序說(shuō)明如下:;子程序DTOB;將兩位10#(BCD碼)轉(zhuǎn)換成2#;入口參數(shù):ALReg中存放10#
;出口參數(shù):CLReg中存放轉(zhuǎn)換完的2#;所用Reg:BX;執(zhí)行時(shí)間:0.06ms
子程序常以過(guò)程形式存放在代碼段,通常以一個(gè)標(biāo)號(hào)開始,以RET指令結(jié)束。第59頁(yè),共78頁(yè),2023年,2月20日,星期六例:DTOBPROC…RETDTOBENDP
子程序標(biāo)準(zhǔn)格式二、子程序設(shè)計(jì)中的問(wèn)題1.主程序與子程序的連接
子程序以過(guò)程的形式存放在代碼段。當(dāng)主程序與子程序在同一代碼段,為段內(nèi)調(diào)用;若主程序與子程序各在不同的代碼段,為段間調(diào)用。CALL:段點(diǎn)保護(hù),轉(zhuǎn)子程序RET:段點(diǎn)恢復(fù)2、現(xiàn)場(chǎng)的保護(hù)與恢復(fù)用成對(duì)的PUSH、POP指令保護(hù)主程序與子程序中都要用到的Reg及mem
第60頁(yè),共78頁(yè),2023年,2月20日,星期六方法一:PUSHBXPUSHCXCALLPROC-1POPCXPOPBX方法二:.PROC-1PROC.PUSHBX.PUSHCX
CALLPROC-1.POPCX.POPBX.RETPROC-1ENDP…常用第二種方法保護(hù)和恢復(fù)現(xiàn)場(chǎng)。對(duì)中斷子程序必須用第二種方法。3、主、子程序之間的參數(shù)傳遞入、出口參數(shù)即傳給子程序的參數(shù)及從子程序出來(lái)的參數(shù)。參數(shù)傳遞通常有3種方法:(1)寄存器傳遞(2)存儲(chǔ)單元(參數(shù)表)傳遞(3)堆棧傳遞第61頁(yè),共78頁(yè),2023年,2月20日,星期六三、子程序應(yīng)用舉例:
例1~例3四、BIOS/DOS功能子程序調(diào)用用戶程序磁盤管理模塊(DOS內(nèi)核)MSDOS.SYS系統(tǒng)功能基本輸入/輸出BIOS模塊IO.SYS設(shè)備驅(qū)動(dòng)ROMBIOS基本I/O系統(tǒng)硬件裝入命令處理模塊COMMAND.COM用戶命令DOS系統(tǒng)層次結(jié)構(gòu)第62頁(yè),共78頁(yè),2023年,2月20日,星期六在匯編語(yǔ)言程序設(shè)計(jì)中,用戶可通過(guò)使用ROMBIOS和及基本DOS系統(tǒng)提供的這些功能模塊子程序,來(lái)編制直接管理和控制計(jì)算機(jī)硬件設(shè)備的底層軟件,主要是完成I/O操作。1.調(diào)用BIOS/DOS功能子程序的基本方法BIOS/DOS的每個(gè)功能子程序都對(duì)應(yīng)著一個(gè)子程序文件。使用這些子程序時(shí),用戶不必過(guò)問(wèn)其內(nèi)部結(jié)構(gòu)和細(xì)節(jié),也不必關(guān)心硬件I/O接口的特性,只要直接用一條軟中斷指令I(lǐng)NTn即可(n稱為中斷類型號(hào)),這稱為中斷調(diào)用。
有的軟中斷命令對(duì)應(yīng)一個(gè)子程序,有的軟中斷命令對(duì)應(yīng)若干個(gè)子程序。前者無(wú)需②,后者必須嚴(yán)格按①②③順序執(zhí)行。常用的有:INT10H;INT16H;INT21H例:P181中斷調(diào)用一般需要經(jīng)過(guò)以下三個(gè)步驟:①子程序入口參數(shù)送規(guī)定寄存器;②子程序編號(hào)(也叫功能調(diào)用號(hào))送AH寄存器;③發(fā)軟中斷命令:INTn。第63頁(yè),共78頁(yè),2023年,2月20日,星期六設(shè)置入口參數(shù)在AH設(shè)置功能號(hào)m執(zhí)行中斷指令I(lǐng)NTN分析、應(yīng)用出口參數(shù)第64頁(yè),共78頁(yè),2023年,2月20日,星期六2、常用的DOS功能子程序調(diào)用DOS功能調(diào)用在更高層次上提供了BIOS類同的功能,它是ROMBIOS的一部分,兩者區(qū)別如下:①調(diào)用BIOS中斷程序比調(diào)用DOS中斷程序要復(fù)雜一些,但運(yùn)行速度快,功能更強(qiáng);②DOS功能調(diào)用只是在DOS的環(huán)境下適用,而BIOS功能調(diào)用不受任何操作系統(tǒng)的約束;③某些功能只有BIOS具有。在所有DOS功能調(diào)用中,將INT2lH軟中斷命令來(lái)實(shí)現(xiàn)的子程序調(diào)用稱為DOS系統(tǒng)功能調(diào)用,它體現(xiàn)了DOS的核心功能,對(duì)應(yīng)100多個(gè)子程序。常用如下:(1)1號(hào)調(diào)用:鍵入一個(gè)字符。(2)6號(hào)功能調(diào)用:直接控制臺(tái)輸入輸出。
入口參數(shù)DL=FF鍵入ZF=0,AL=鍵值ZF=1,AL≠鍵值第65頁(yè),共78頁(yè),2023年,2月20日,星期六DL≠FF輸出,DL中為輸出字符的ASCII碼值1號(hào)與6號(hào)區(qū)別:前者等待用戶鍵入,后者不等待用戶鍵入。(3)顯示或打印輸出單個(gè)字符(02號(hào)和05號(hào)功能調(diào)用)入口參數(shù):DL=待輸出的字符(4)字符串輸入(0A號(hào)功能調(diào)用)鍵盤輸入字符串后存入DS:DX為首址的緩沖區(qū)。①在數(shù)據(jù)段定義一個(gè)緩沖區(qū)DBX;緩沖區(qū)能容納的字符個(gè)數(shù)DB?;存放實(shí)際輸入字符個(gè)數(shù)DBXDUP(?);接受字符串②入口參數(shù):DS:DX指向緩沖區(qū)首址(5)字符串輸出(09號(hào)功能調(diào)用)將以$為結(jié)束符的字符串輸出到顯示器
入口參數(shù):DS:DX指向字符體例:書P182第66頁(yè),共78頁(yè),2023年,2月20日,星期六4.5
模塊化程序設(shè)計(jì)技術(shù)主要注意3個(gè)問(wèn)題:(1)全局符號(hào)的定義和使用一個(gè)模塊中定義的符號(hào)如不另家加說(shuō)明,均為局部符號(hào),局部符號(hào)只能在定義它的模塊內(nèi)使用。(2)模塊間轉(zhuǎn)移形式:JMP,CALL,INT近轉(zhuǎn)移和遠(yuǎn)轉(zhuǎn)移(3)多個(gè)模塊的組合關(guān)系:NONEPUBLICSTACKCOMMONMEMORY第67頁(yè),共78頁(yè),2023年,2月20日,星期六
模塊化程序設(shè)計(jì)舉例:求無(wú)序表中的最大元素及其位置。程序見(jiàn)書
注(1)算法①先確定第一個(gè)值為最大值CX-1②再順序與表后元素比較,取大的值取代當(dāng)前的最大值MOV BX, OFFSETARRAYMOV CX, COUNTMOV AL [BX]DEC CXINC BXAA:CMP AL, [BX]JA NEXT MOV AL,[BX]NEXT:INC BXLOOP AA第68頁(yè),共78頁(yè),2023年,2月20日,星期六
4.6
實(shí)用程序舉例算術(shù)運(yùn)算例1 見(jiàn)書上例一例2多字節(jié)加減(二進(jìn)制數(shù))DATA SEGMENT X1 DW XXXXH,XXXXH X2DW XXXXH,XXXXH X3 DW 0000H,0000HDATA ENDSSTACK SEGMENT PARA STACK DW 20H DUP(?)STACK ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATA,SS:STACKMAIN PROC FAR PUSH DS第69頁(yè),共78頁(yè),2023年,2月20日,星期六
PUSH AX MOV AX,0 MOV AX,DATA MOV DS,AX CLC ;清CF MOV CX,02H LEA SI,X1 LEA DI,X2 LEA BX,X3E20: MOV AX,[SI] ADC AX,[DI] MOV [BX],AX ADD SI,2 ADD BX,2 LOOP E20 RETMAIN ENDPCODE ENDS第70頁(yè),共78頁(yè),2023年,2月20日,星期六若是十進(jìn)制算術(shù)運(yùn)算非壓縮的十進(jìn)制運(yùn)算按字節(jié)運(yùn)算用AAA,AAS調(diào)整壓縮的十進(jìn)制運(yùn)算按字節(jié)運(yùn)算用DAA,DAS調(diào)整十進(jìn)制加減規(guī)律例3多位的非壓縮的十進(jìn)制數(shù)的加法STACK SEGMENT STACK ‘STACK’
……
STACK ENDS DATA SEGMENT FIRST DB 4,7,9,2,0;十進(jìn)制數(shù)02974 SECOND DB6,2,3,7,0;十進(jìn)制數(shù)07326 THIRD DB 5DUP(0) DATA ENDS CODE SEGMENT
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)村蓋房簽合同范本
- 鄉(xiāng)鎮(zhèn)庫(kù)房建造合同范本
- 創(chuàng)業(yè)老板合同范本
- 1997施工合同范本
- 公司購(gòu)買材料合同范本
- 保險(xiǎn)勞務(wù)合同范本
- mpp管采購(gòu)合同范本
- app廣告合同范本
- 加盟痘痘合同范本
- 住房公證合同范本
- 德州環(huán)鋰新能源科技有限公司2萬(wàn)噸年廢舊鋰電池回收項(xiàng)目環(huán)境影響報(bào)告書
- 2025年江蘇省中職《英語(yǔ)》學(xué)業(yè)水平考試核心考點(diǎn)試題庫(kù)500題(重點(diǎn))
- GB/T 1346-2024水泥標(biāo)準(zhǔn)稠度用水量、凝結(jié)時(shí)間與安定性檢驗(yàn)方法
- 易制毒化學(xué)品理論考試試題及答案
- 【MOOC】跨文化交際-蘇州大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 小學(xué)全體教師安全工作培訓(xùn)
- 北師大版數(shù)學(xué)八年級(jí)下冊(cè)全冊(cè)教案及反思
- 2024年五級(jí)咖啡師職業(yè)技能鑒定考試題庫(kù)(含答案)
- 湖南版(湘教版)三年級(jí)美術(shù)下冊(cè)全冊(cè)全套課件(247張)
- 《教育心理學(xué)(第3版)》全套教學(xué)課件
- 九宮數(shù)獨(dú)200題(附答案全)
評(píng)論
0/150
提交評(píng)論