




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第五章匯編語言程序設(shè)計(jì)匯編語言源程序的結(jié)構(gòu)偽操作命令
DOS和BIOS調(diào)用程序設(shè)計(jì)舉例匯編語言的特點(diǎn)1.面向CPU指令系統(tǒng)的程序設(shè)計(jì)語言,與機(jī)器的種類和型號(hào)密切相關(guān)。2.采用助記符表達(dá)指令操作碼,采用標(biāo)識(shí)符號(hào)表示指令操作數(shù)。3.用匯編語言編寫程序可以直接、有效地控制計(jì)算機(jī)硬件,占用內(nèi)存空間少,執(zhí)行速度快。4.在有些應(yīng)用領(lǐng)域,匯編語言的作用是不容置疑和無可替代的。匯編語言程序的開發(fā)過程編輯文本編輯器,如EDIT.COM源程序:文件名.asm匯編匯編程序,如MASM.EXE目標(biāo)模塊:文件名.obj連接連接程序,如LINK.EXE可執(zhí)行文件:文件名.exe調(diào)試調(diào)試程序,如DEBUG.EXE應(yīng)用程序開發(fā)過程1:源程序的編輯源程序文件要以ASM為擴(kuò)展名源程序文件的形成(編輯)可以通過任何一個(gè)文本編輯器實(shí)現(xiàn):DOS中的全屏幕文本編輯器EDIT其他程序開發(fā)工具中的編輯環(huán)境Windows中的記事本Notepadmyb501.asm開發(fā)過程2:源程序的匯編(如MASM)匯編是將源程序翻譯成由機(jī)器代碼組成的目標(biāo)模塊文件的過程。MASM5.x提供的匯編程序是MASM.EXE。MASMmyb501.asmMASM6.x提供的匯編程序是ML.EXE。MLmyb501.asm如果源程序中沒有語法錯(cuò)誤,MASM將自動(dòng)生成一個(gè)目標(biāo)模塊文件(myb501.obj);否則MASM將給出相應(yīng)的錯(cuò)誤信息。這時(shí)應(yīng)根據(jù)錯(cuò)誤信息,重新編輯修改源程序后,再進(jìn)行匯編。開發(fā)過程3:目標(biāo)模塊的連接連接程序?qū)⑸梢粋€(gè)可執(zhí)行文件(myb501.exe),若提示一定的錯(cuò)誤信息,這時(shí)需要根據(jù)錯(cuò)誤信息重新修改源程序文件后再匯編、鏈接,直到生成可執(zhí)行文件。
LINKmyb501.objML.EXE匯編程序(MASM6.x)可自動(dòng)調(diào)用LINK連接程序,實(shí)現(xiàn)匯編和連接的依次進(jìn)行。MLmyb501.asm開發(fā)過程4:可執(zhí)行程序的調(diào)試經(jīng)匯編、連接生成的可執(zhí)行程序在操作系統(tǒng)下只要輸入文件名就可以運(yùn)行:
Myb501操作系統(tǒng)裝載該文件進(jìn)入主存,并開始運(yùn)行。如果出現(xiàn)運(yùn)行錯(cuò)誤,可以從源程序開始排錯(cuò),也可以利用調(diào)試程序幫助發(fā)現(xiàn)錯(cuò)誤。采用DEBUG.EXE調(diào)試程序:DEBUGmyb501.exe5.1匯編語言源程序的結(jié)構(gòu)
5.1.1分段結(jié)構(gòu)完整的匯編語言源程序由段組成;一個(gè)匯編語言源程序可以包含若干個(gè)代碼段、數(shù)據(jù)段、附加段或堆棧段,段與段之間的順序可隨意排列;所有的可執(zhí)行性語句必須位于某一個(gè)代碼段內(nèi),說明性語句可根據(jù)需要位于任一段內(nèi);需獨(dú)立運(yùn)行的程序必須包含一個(gè)代碼段,并具有指示程序執(zhí)行的起始點(diǎn),一個(gè)程序只有一個(gè)起始點(diǎn);還應(yīng)該有應(yīng)用程序執(zhí)行結(jié)束點(diǎn),將控制權(quán)交還操作系統(tǒng),一個(gè)程序只有一個(gè)程序結(jié)束點(diǎn);還應(yīng)該有匯編結(jié)束點(diǎn),指示匯編程序到此結(jié)束將源程序翻譯成目標(biāo)模塊代碼的過程。源程序由語句序列構(gòu)成舉例匯編源程序舉例DATASEGMENT ;定義數(shù)據(jù)段
……DATAENDSSTACKSEGMENT ;定義堆棧段
……STACKENDSCODESEGMENT;定義代碼段
ASSUMECS:CODE,DS:DATA,SS:STACK START:MOVAX,DATA ;程序起始點(diǎn)
MOVDS,AX ;設(shè)置DS指向用戶定義的數(shù)據(jù)段
…… ;程序代碼
MOVAH,4CHINT21H ;程序結(jié)束點(diǎn),返回DOS
……CODEENDSENDSTART;匯編結(jié)束,同時(shí)指明程序起始點(diǎn)START返回程序開始:程序起始點(diǎn)為了指明程序開始執(zhí)行的位置,需要使用一個(gè)標(biāo)號(hào)(例題中采用了start標(biāo)識(shí)符);連接程序會(huì)根據(jù)程序起始點(diǎn)正確地設(shè)置CS和IP值,根據(jù)程序大小和堆棧段大小設(shè)置SS和SP值;連接程序沒有設(shè)置DS和ES值。程序如果使用數(shù)據(jù)段或附加段,必須明確給DS或ES賦值。程序終止:程序結(jié)束點(diǎn)應(yīng)用程序執(zhí)行結(jié)束,應(yīng)該將控制權(quán)交還操作系統(tǒng);匯編語言程序設(shè)計(jì)中,有多種返回DOS的方法,但一般利用DOS功能調(diào)用的4CH子功能實(shí)現(xiàn)。
MOVAH,4CH INT21H匯編結(jié)束匯編結(jié)束表示匯編程序到此結(jié)束將源程序翻譯成目標(biāo)模塊代碼的過程;源程序的最后必須有一條END偽指令;
END[標(biāo)號(hào)]可選的“標(biāo)號(hào)”參數(shù)指定程序開始執(zhí)行點(diǎn),連接程序據(jù)此設(shè)置CS和IP值(例題中采用了start標(biāo)識(shí)符)。
————不要糊涂————程序終止和匯編結(jié)束是兩碼事5.1.2-5.1.6
匯編語言源程序語句類型及組成指令——執(zhí)行性語句
指令可由匯編程序翻譯成機(jī)器語言指令。匯編語言中的指令與機(jī)器語言指令基本上是一一對(duì)應(yīng)的。與具體的處理器有關(guān)、與匯編程序無關(guān)。偽指令——說明性語句
偽指令不匯編成機(jī)器語言指令,僅僅在匯編過程中告訴匯編程序應(yīng)如何匯編。例如告訴匯編程序已寫出的匯編語言源程序有幾個(gè)段,段的名稱是什么,是否采用過程,匯編到某處是否需要留出存儲(chǔ)空間,應(yīng)留多大,是否要用到外部變量等。偽指令與具體的處理器類型無關(guān),但與匯編程序有關(guān)。不同版本的匯編程序支持不同的偽指令。宏指令指令與偽指令語句組成標(biāo)號(hào):
指令助記符操作數(shù),操作數(shù),……
;注釋名字
偽指令定義符操作數(shù),操作數(shù),……
;注釋標(biāo)識(shí)符部分助記符部分操作數(shù)部分注釋部分匯編語言不區(qū)分大小寫,比如指令的助記符、寄存器名、內(nèi)存變量、指令標(biāo)號(hào)等都不區(qū)分大小寫。放在引號(hào)中的字符串是區(qū)分大小寫的,字符串是以ASCII存儲(chǔ)的。標(biāo)識(shí)符:標(biāo)號(hào)、名字標(biāo)識(shí)符(Identifier)一般最多由31個(gè)字母、數(shù)字及規(guī)定的特殊符號(hào)(如_、$、?、@)組成;不能以數(shù)字開頭;默認(rèn)情況下,匯編程序不區(qū)別標(biāo)識(shí)符中的字母大小寫。標(biāo)號(hào)是反映指令位置(邏輯地址)和屬性的標(biāo)識(shí)符,后跟一個(gè)冒號(hào)分隔。名字是反映偽指令位置(邏輯地址)和屬性的標(biāo)識(shí)符,后跟空格或制表符分隔,沒有冒號(hào)。一個(gè)源程序中,每個(gè)標(biāo)識(shí)符的定義是唯一的,還不能是匯編語言采用的保留字,保留字包括匯編指令、寄存器名、偽指令和操作符等。返回?變量和標(biāo)號(hào)的區(qū)別標(biāo)號(hào)和名字一經(jīng)定義便具有兩類三種屬性:①段值標(biāo)號(hào)和名字對(duì)應(yīng)存儲(chǔ)單元的段地址②偏移值標(biāo)號(hào)和名字對(duì)應(yīng)存儲(chǔ)單元的偏移地址③類型標(biāo)號(hào)的類型可以是NEAR(近)和FAR(遠(yuǎn)),分別表示段內(nèi)或段間。變量名的類型可以是BYTE(字節(jié))、WORD(字)和DWORD(雙字)等。地址屬性類型屬性
標(biāo)號(hào)是某條指令所存放單元的符號(hào)地址,而變量是某操作數(shù)據(jù)所存放單元的符號(hào)地址。在匯編語言程序中,指令語句中的名字一般采用標(biāo)號(hào),這個(gè)標(biāo)號(hào)可以是任選的,即可以不寫。標(biāo)號(hào)出現(xiàn)在代碼段,后面跟著冒號(hào)“:”。變量和標(biāo)號(hào)的屬性變量還具有另外兩個(gè)屬性:長度(LENGTH)、大小(SIZE)助記符(操作助記符)指令和偽指令采用易于記憶的符合表達(dá),這就是助記符。助記符將指出該語句的基本操作功能。它是語句的必要部分,也就是說每條語句都必須有操作助記符。操作助記符是匯編語言中規(guī)定了明確含義的一組符號(hào),所以不能隨意使用。例如ADD是加法指令的助記符,DB則是定義字節(jié)變量的偽指令助記符。返回注釋語句中由分號(hào)“;”開始的部分為注釋內(nèi)容,用以增加源程序的可讀性;必要時(shí),一個(gè)語句行也可以由分號(hào)開始作為階段性注釋;匯編程序在翻譯源程序時(shí)將跳過該部分,不對(duì)它們做任何處理。返回操作數(shù)操作數(shù)可以是第1種提法:常量、寄存器、存儲(chǔ)器、數(shù)值表達(dá)式。第2種提法:常量、寄存器、地址表達(dá)式、數(shù)值表達(dá)式。可以有一個(gè)或者多個(gè)操作數(shù),操作數(shù)與操作數(shù)之間用逗號(hào)分隔。返回常量常量可以分?jǐn)?shù)值常數(shù)和字符串常數(shù)兩類。常數(shù)指由10、16、2和8進(jìn)制形式表達(dá)的數(shù)值,各種進(jìn)制的數(shù)據(jù)以后綴字母區(qū)分,默認(rèn)不加后綴字母的是十進(jìn)制數(shù)。字符串常量是用單引號(hào)括起來的單個(gè)字符或多個(gè)字符,其數(shù)值是每個(gè)字符對(duì)應(yīng)的ASCII碼值。例如:‘d’(等于64H)、‘AB’(等于4142H)、‘Hello!’返回地址表達(dá)式/存儲(chǔ)器它所產(chǎn)生的結(jié)果是一個(gè)存儲(chǔ)器地址。如果這個(gè)地址存放的是數(shù)據(jù),一般稱它為變量;如果存放的是指令,一般稱它為標(biāo)號(hào)。返回?cái)?shù)值表達(dá)式數(shù)值表達(dá)式由運(yùn)算符和各種運(yùn)算對(duì)象構(gòu)成。運(yùn)算對(duì)象可以是常量、變量、標(biāo)號(hào);運(yùn)算結(jié)果可以是常量、存儲(chǔ)器的地址,此地址存放數(shù)據(jù)(變量)或者指令(標(biāo)號(hào))。匯編程序在匯編過程中計(jì)算表達(dá)式,運(yùn)算結(jié)果作為語句中的操作數(shù)去使用。表達(dá)式的數(shù)值在程序運(yùn)行前的匯編階段計(jì)算,所以組成表達(dá)式的各部分必須在匯編時(shí)就能確定。采用數(shù)值表達(dá)式增強(qiáng)程序可讀性。返回運(yùn)算符主要包括以下6種類型:算術(shù)運(yùn)算符邏輯運(yùn)算符3.關(guān)系運(yùn)算符4.數(shù)值返回運(yùn)算符5.修改屬性運(yùn)算符6.其他運(yùn)算符運(yùn)算符算術(shù)運(yùn)算符[例]MOVAL,21HSHL2;AL=84H●包括加(+)、減(-)、乘(*)、除(/)、求余數(shù)(MOD)、左移(SHL)和右移(SHR)6類運(yùn)算符中,地址表達(dá)式通常僅使用加和減運(yùn)算符。注意邏輯運(yùn)算符[例]ANDDX,0200HANDOFEH
其中第二個(gè)AND是邏輯運(yùn)算符,在程序匯編時(shí),計(jì)算0200HANDOFEH產(chǎn)生一個(gè)立即數(shù)作為指令操作數(shù)。而第一個(gè)AND是指令助記符,在匯編以后執(zhí)行AND指令,DX的內(nèi)容與上述立即數(shù)相“與”,結(jié)果放在DX中?!癜ò次徊僮鞯呐c(AND)、或(OR)、異或(XOR)、和非(NOT)四種運(yùn)算符。它們只適用于對(duì)常數(shù)進(jìn)行邏輯運(yùn)算。
AND、OR、XOR和NOT也是指令助記符。注意關(guān)系運(yùn)算符[例]MOVBX,((PORTLT5)AND20)OR((PORTGE5)AND30)此例中當(dāng)PORT的值小于5時(shí),執(zhí)行MOVBX,20否則執(zhí)行MOVBX,30。[例]MOVBX,06HLT05H;匯編為MOVBX,0MOVBX,04HLT05H;匯編為MOVBX,OFFFFH●包括EQ(相等)、NE(不相等)、LT(小于)、GT(大于)、LE(小于或大于)、GE(大于或等于)共六種。數(shù)值返回運(yùn)算符1.取偏移地址(變量/標(biāo)號(hào))格式:OFFSET變量名/標(biāo)號(hào)功能:取變量名或標(biāo)號(hào)所在段的段內(nèi)偏移量。3.取類型值(變量/標(biāo)號(hào))格式:TYPE變量名/標(biāo)號(hào)功能:返回一個(gè)數(shù)字值。若TYPE運(yùn)算符加在變量名前,返回的數(shù)值是該變量的類型屬性;若TYPE運(yùn)算符加在標(biāo)號(hào)前,返回的數(shù)值則是該變量距離屬性。
存儲(chǔ)器操作數(shù)的類型值2.取段基址(變量/標(biāo)號(hào))格式:SEG變量名/標(biāo)號(hào)功能:取變量名或標(biāo)號(hào)所在段的段地址。標(biāo)號(hào)/變量類型屬性類型值字節(jié)變量BYTE1字變量WORD2雙字變量DWORD4標(biāo)號(hào)NEAR-1標(biāo)號(hào)FAR-2存儲(chǔ)器操作數(shù)(變量/標(biāo)號(hào))的類型值返回4.求長度格式:LENGTH變量名功能:返回一個(gè)變量名所占的存儲(chǔ)單元(字節(jié)、字或雙字)的數(shù)目。如果變量使用重復(fù)定義子句說明的,則返回DUP前面的數(shù)值;若沒有DUP說明,則返回值總是1。5.求大小格式:SIZE變量名功能:返回變量名所占存儲(chǔ)單元的字節(jié)數(shù),它等于LENGTH和TYPE兩個(gè)運(yùn)算符返回值的乘積。則LENGTHBUF1=100TYPEBUF1=1LENGTHBUF2=1TYPEBUF2=1LENGTHBUF3=100
TYPEBUF3=4SIZEBUF1=100SIZEBUF2=1SIZEBUF3=400[例]BUF1DB100DUP(0)
BUF2DB20H,30HBUF3DD100DUP(0013H)修改屬性運(yùn)算符[例]MOVBYTEPTR[DI],04H;指明目的操作數(shù)為字節(jié)類型JMPDWORDPTR[BP];指明目的操作數(shù)為雙字節(jié)類型
;(即指明轉(zhuǎn)移操作為段間轉(zhuǎn)移)BUFDB20H,30HMOVDX,WORDPTRBUF1.PTR運(yùn)算符格式:類型PTR表達(dá)式功能:用于指出變量、標(biāo)號(hào)的類型屬性,新的類型只在當(dāng)前指令內(nèi)有效。[例]TAB1EQUTHISBYTETAB2DW20DUP(?)TAB1、TAB2對(duì)應(yīng)同一存儲(chǔ)器地址,對(duì)變量TAB1為字節(jié)訪問,對(duì)變量TAB2為字訪問,且TAB1和TAB2具有相同的段基址和偏移量。2.THIS運(yùn)算符格式:THIS類型功能:把它后面指定的類型或距離屬性賦給當(dāng)前的變量、標(biāo)號(hào)或地址表達(dá)式。THIS運(yùn)算符使下面的“原標(biāo)號(hào)或原變量”另有新的名字和類型,但并不分配新的存儲(chǔ)單元。注意[例]K1EQU1234HMOVAL,LOWK1;AL←34HMOVBL,HIGHK1;BL←12H3.HIGH和LOW運(yùn)算符格式:HIGH表達(dá)式
LOW表達(dá)式功能:從運(yùn)算對(duì)象中分離出高字節(jié)或低字節(jié)。[例]L1:JMPSHORTL2┇L2:MOVAX,BX┇4.SHORT運(yùn)算符格式:SHORT標(biāo)號(hào)功能:用于指定一個(gè)標(biāo)號(hào)的類型為SHORT(短標(biāo)號(hào))。當(dāng)轉(zhuǎn)移的目標(biāo)地址與本轉(zhuǎn)移指令的下一條指令之間的字節(jié)距離在-128~127范圍時(shí),可以用SHORT運(yùn)算符進(jìn)行說明。短轉(zhuǎn)移指令比近轉(zhuǎn)移指令少一個(gè)字節(jié)。5.段超越運(yùn)算符“:”格式:段前綴:地址表達(dá)式功能:段超越[例]MOVAX,ES:[BX]其他運(yùn)算符1.()格式:(表達(dá)式)功能:改變運(yùn)算符的優(yōu)先級(jí)別1.[]功能:地址表達(dá)式和多重變量的下標(biāo)值[例]MOVBX,((PORTLT5)AND20)OR((PORTGE5)AND30)MOVAX,[BX]BUF1DB10H,56H,78HBUF2DW2030H,5678HMOVAH,BUF1[0];AH←10HMOVAX,BUF2[1];AX←5678H運(yùn)算符及其優(yōu)先級(jí)別SHORT10OR,XOR9AND8NOT7EQ,NE,LT,LE,GT,GE6+,-5*,/,MOD,SHL,SHR4HIGH,LOW
3PTR,OFFSET,SEG,TYPE,THIS,段前綴2LENGTH,SIZE1()0
高低運(yùn)算符優(yōu)先級(jí)別5.2偽操作指令
回顧:偽指令——說明性語句
偽指令不匯編成機(jī)器語言指令,僅僅在匯編過程中告訴匯編程序應(yīng)如何匯編。例如告訴匯編程序已寫出的匯編語言源程序有幾個(gè)段,段的名稱是什么,是否采用過程,匯編到某處是否需要留出存儲(chǔ)空間,應(yīng)留多大,是否要用到外部變量等。偽指令與具體的處理器類型無關(guān),但與匯編程序有關(guān)。不同版本的匯編程序支持不同的偽指令。偽指令語句的格式:名字定義符操作數(shù);注釋變量實(shí)質(zhì)上是指內(nèi)存單元的數(shù)據(jù);變量需要事先定義才能使用;變量定義偽指令為變量申請(qǐng)固定長度為單位的存儲(chǔ)空間,并可以同時(shí)將相應(yīng)的存儲(chǔ)單元初始化;定義后的變量可以利用變量名等方法引用其中的數(shù)據(jù),即變量的數(shù)值,變量對(duì)應(yīng)的內(nèi)存單元地址不變。5.2.1數(shù)據(jù)定義偽指令(變量)
變量定義偽指令最常使用變量名為用戶自定義標(biāo)識(shí)符,也被稱為符號(hào)地址;變量名也可以沒有;變量的地址為所占內(nèi)存單元中地址最低的存儲(chǔ)單元的邏輯地址。操作數(shù)是用逗號(hào)分隔的參數(shù),主要由常量、數(shù)值表達(dá)式、字符串、地址表達(dá)式、“?”或者“DUP(重復(fù)次數(shù))”組成。其中“?”表示未賦初值,“DUP(重復(fù)次數(shù))”表示賦重復(fù)初值。[變量名]DB操作數(shù)
;定義字節(jié)[變量名]DW操作數(shù);定義字
[變量名]DD操作數(shù);定義雙字[變量名]DQ操作數(shù);定義8個(gè)字節(jié)[變量名]DT操作數(shù);定義10個(gè)字節(jié)變量定義的匯編語言格式變量舉例
DADA1DB20H;常數(shù)
DATA2DW0204H,1000H;常數(shù)
DATA3DB(-1*3),(15/3);數(shù)值表達(dá)式
DATA4DD12345H;常數(shù)
DATA5DB'0123';字符串
DATA6DW'AB','C','D';字符串
DATA7DB?;預(yù)留存儲(chǔ)單元,不賦初值
DATA8DD?;預(yù)留存儲(chǔ)單元,不賦初值
DATA9DB5DUP(00);賦值5個(gè)字節(jié)單元,內(nèi)容均為00HDATA10DW3DUP(?);預(yù)留3個(gè)字單元,不賦初值若ARRAY為變量名,AGAIN為標(biāo)號(hào)
ADDRNDWARRAY+2;變量內(nèi)容為存儲(chǔ)ARRAY+2存儲(chǔ)單元的偏移地址
ADDRFDDAGAIN;變量內(nèi)容為存儲(chǔ)AGAIN標(biāo)號(hào)的段地址及偏移地址變量的5個(gè)屬性1、段地址(SEG);2、偏移地址(OFFSET);3、類型(TYPE)4、長度(LENGTH),即變量名所占的存儲(chǔ)單元(字節(jié)、字或雙字)的數(shù)目。如果變量使用DUP定義的,則長度為DUP前面的數(shù)值;若沒有DUP說明,則長度值總是1。5、大小(SIZE),LENGTH和TYPE兩個(gè)運(yùn)算符返回值的乘積。若變量使用DUP定義,則SIZE表示該變量所占存儲(chǔ)單元的字節(jié)數(shù);若未使用DUP定義,則SIZE表示與TYPE值一致。返回[例]BUF1DB100DUP(0)
BUF2DB20H,30HBUF3DD100DUP(13H)則LENGTHBUF1=100TYPEBUF1=1LENGTHBUF2=1TYPEBUF2=1LENGTHBUF3=100
TYPEBUF3=4SIZEBUF1=100SIZEBUF2=1SIZEBUF3=4005.2.2符號(hào)定義偽指令符號(hào)定義類偽指令共有3個(gè),用于給符號(hào)重新命名或定義新的類型屬性。常用的有等價(jià)偽指令EQU、等號(hào)偽指令=、定義符號(hào)名的偽指令LABLE。1.等價(jià)偽指令舉例:ALFAEQU100HAEQUMOVMOVAX,ALFAAAX,ALFA格式:符號(hào)名EQU表達(dá)式功能:將表達(dá)式的值賦給符號(hào)名,不申請(qǐng)存儲(chǔ)單元。符號(hào)名一旦被EQU定義,就不能再賦值,即不能用EQU再為符號(hào)名重新賦值。注意TAB1EQUTHISBYTETAB2DW20DUP(?);TAB1、TAB2具有相同的段基址和偏移量;TAB1為字節(jié)訪問,TAB2為字訪問。2.等號(hào)偽指令舉例:ALFA=100MOVAL,ALFA;AL←100ALFA=ALFA+2;ALFA=102MOVAL,ALFA;AL←102格式:符號(hào)名=表達(dá)式功能:將表達(dá)式的值賦給符號(hào)名。等號(hào)偽指令可以在程序中不同的地方多次使用以重新為符號(hào)名賦值。3.定義符號(hào)名的偽指令舉例:BARY2LABELWORD
;定義BARY為字類型,與BARY1具有相同地址
BARY1DB12H,56H,48H,84H┆ADDAX,
BARY2;字加法
ABCF2LABELFAR;ABCF為FAR類型標(biāo)號(hào)ABCF1:MOVAX,1000H;ABCF2與ABCF1具有相同地址格式:符號(hào)名LABEL類型功能:定義一個(gè)標(biāo)號(hào)或變量,并指定其類型(BYTE、WORD、DWORD、NEAR、FAR)。5.2.3段定義偽指令●段定義偽指令用于將源程序劃分成若干段,這些邏輯段按用途可分為代碼段(用于存放程序)、數(shù)據(jù)段(用于存放數(shù)據(jù))、堆棧段(用于堆棧操作)和附加段(附加的數(shù)據(jù)段)。●需要說明的是,并不是所有的程序都必須包含這四個(gè)邏輯段,有時(shí)只需要一個(gè)段或兩個(gè)段?!?/p>
功能:把模塊劃分為若干個(gè)邏輯段。每SEGMENT/ENDS可定義一個(gè)邏輯段。格式:段名SEGMENT[定位類型][組合類型][′類別名′]┆
段名ENDS
多模塊連接時(shí)使用●定位類型表示將某段裝入內(nèi)存時(shí),對(duì)段的起始邊界的要求。合理選擇定位類型能夠在進(jìn)行段和模塊的定位時(shí)充分利用存儲(chǔ)空間。它有以下4種選擇:定位類型●
PAGE●PARA●WORD●
BYTEPAGE=××××××××00000000BPARA=××××××××××××0000BWORD=×××××××××××××××0BBYTE=××××××××××××××××B
WORD、BYTE類型偏移地址不從0起始;PARA、PAGE類型會(huì)令內(nèi)存空間有浪費(fèi);PARA類型為默認(rèn)類型。組合類型用來在多模塊連接時(shí)告訴連接程序本段和其他段的組合關(guān)系,相同類別的段被組成一個(gè)段組。組合類型有以下幾種:●
NONE:該段獨(dú)立,與其他段無關(guān)?!?/p>
PUBLIC:與其他模塊中同名同類別段相鄰的連接在一起,擁有相同段基址?!?/p>
COMMON●STACK●AT表達(dá)式●
MEMORYNONE類型為默認(rèn)類型。類別編者賦予該段的與段名不同的另一種名字信息,可以是任何合法的自定義符,必須用單引號(hào)括起來。連接程序時(shí)只使其與同類別段發(fā)生關(guān)聯(lián),這些同類別段被依序放在連續(xù)存儲(chǔ)區(qū)域內(nèi),但各段仍獨(dú)立。典型類別如:′STACK′′CODE′5.2.4假定偽指令格式:ASSUME段寄存器:段名[,段寄存器:段名…]功能:向匯編程序指示當(dāng)前各段所用的段寄存器,設(shè)定段寄存器與段的對(duì)應(yīng)關(guān)系。注意①本偽指令只是指示各邏輯段使用寄存器的情況,并沒有對(duì)段寄存器內(nèi)容進(jìn)行裝填。段寄存器的實(shí)際值(CS除外)還要由傳送指令在程序中裝填數(shù)據(jù)。②ASSUME偽指令也可以用來取消段寄存器與段之間的對(duì)應(yīng)關(guān)系(用NOTHING),然后再建立新的對(duì)應(yīng)關(guān)系。例如:CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK…舉例說明5.2.5過程定義偽指令●過程是程序的一部分,它可以被程序調(diào)用。每次可調(diào)用一個(gè)過程,當(dāng)過程中的指令執(zhí)行完后,控制返回調(diào)用它的地方。過程的定義是用過程定義偽指令完成的。格式:過程名PROC[NEAR/FAR]┇過程體
RET
過程名ENDP功能:完成過程定義,在過程體中實(shí)現(xiàn)過程的操作功能
①過程名是自定義符,定義開始和結(jié)束時(shí)的過程名必須相同。②過程名有三個(gè)屬性:段地址、偏移量和距離屬性(NEAR或FAR),匯編程序在匯編時(shí)根據(jù)過程類型生成段內(nèi)或段間的調(diào)用或返回指令代碼。③在一個(gè)過程中,RET常作為過程的最后一條指令。
例
CODESEGMENTAPRCPROCNEARADDAX,BX┆RETAPRCENDPSTART:MOVAX,NOM┆CALLAPRC┆CALLAPRC┆CODEENDSENDSTART
注意5.3.6其他偽指令1.程序計(jì)數(shù)器$格式:$功能:用在表達(dá)式里,它的值為下一個(gè)能分配的存儲(chǔ)單元的偏移地址。例如:A1DB12H,34H,56HMOVBX,$-A1;BX←03H2.ORG偽指令格式:ORG數(shù)值表達(dá)式功能:指定在它之后的語句或變量的偏移地址?!癞?dāng)無ORG偽指令時(shí),從段首址開始存放程序或數(shù)據(jù)。例如:DATASEGMENTORG2V1DB02H,03H,04HORG$+3V2DW1234HDATAENDS…————02H03H04H34H12H…——————028V1V25.3DOS和BIOS調(diào)用
DOS系統(tǒng)將數(shù)據(jù)的輸入與輸出將涉及輸入、輸出設(shè)備的管理編寫成一系列子程序,不僅系統(tǒng)可以使用,用戶也可以像調(diào)子程序一樣方便地使用它們。在系統(tǒng)的ROM中也有一組輸入、輸出管理程序可供用戶使用,這組程序通常稱為ROMBIOS(ROMInput/OutputSystem)。調(diào)用系統(tǒng)提供的子程序,通常稱為系統(tǒng)功能調(diào)用。功能調(diào)用的基本方法是采用一條軟中斷指令I(lǐng)NTn。所謂軟中斷是以指令的方式產(chǎn)生的中斷,當(dāng)CPU執(zhí)行該指令時(shí),就像響應(yīng)外部中斷一樣的方式轉(zhuǎn)入中斷處理程序,中斷處理程序結(jié)束后又返回到INT指令的下一條指令處。本節(jié)將主要說明與基本輸入、輸出有關(guān)的DOS系統(tǒng)功能調(diào)用的調(diào)用方式及其用途,目的是為程序設(shè)計(jì)中實(shí)現(xiàn)輸入、輸出操作打下基礎(chǔ)。系統(tǒng)功能調(diào)用步驟通常按照如下4個(gè)步驟進(jìn)行:⑴
在AH寄存器中設(shè)置系統(tǒng)功能調(diào)用號(hào)⑵
在指定寄存器中設(shè)置入口參數(shù)⑶
用中斷調(diào)用指令(INTi8)執(zhí)行功能調(diào)用⑷
根據(jù)出口參數(shù)分析功能調(diào)用執(zhí)行情況5.3.1DOS功能調(diào)用●DOS利用中斷提供給用戶近百個(gè)系統(tǒng)功能,主要包括設(shè)備管理、目錄管理和文件管理三個(gè)方面的功能。DOS中常用的軟中斷有8條,系統(tǒng)規(guī)定它們的中斷類型碼為20H~27H,它們各自的功能及入口/出口參數(shù)見表5-4。●INT21H中斷為系統(tǒng)功能調(diào)用,是我們用的最多的DOS中斷。它本身包含很多子程序,每個(gè)子程序?qū)?yīng)一個(gè)功能,其編號(hào)從0~62H。1.鍵盤輸入單字符——1號(hào)系統(tǒng)功能調(diào)用格式:MOVAH,1INT21H功能:執(zhí)行時(shí)系統(tǒng)首先等待鍵盤輸入,待程序員按下任何一鍵,系統(tǒng)先檢查是否是Ctrl-Break鍵。如果是則退出,否則將鍵入字符的ASCII碼置入AL寄存器,并在屏幕上顯示該字符。2.無回顯鍵盤輸入單字符——8號(hào)系統(tǒng)功能調(diào)用
●格式:
MOVAH,8INT21H●功能與1號(hào)功能調(diào)用基本相同,惟一的差別是鍵入的字符不送屏幕顯示。
3.無回顯直接控制臺(tái)輸入單字符——7號(hào)系統(tǒng)功能調(diào)用
●格式:
MOVAH,7INT21H●功能:從標(biāo)準(zhǔn)輸入設(shè)備鍵盤輸入單字符送AL,和1號(hào)調(diào)用相比,一是不回顯字符,二是不做針對(duì)Ctrl-Break鍵的檢查。
4.鍵盤輸入字符串——0AH號(hào)系統(tǒng)功能調(diào)用●功能是將鍵盤輸入的字符串寫入到內(nèi)存緩沖區(qū)中,因此必須事先定義一個(gè)緩沖區(qū)。┇
BUFDB20 ;定義緩沖區(qū)長度DB? ;由系統(tǒng)填寫實(shí)際鍵入字符數(shù)DB20DUP(?);用于存放鍵入的字符,最多可鍵入19 ;個(gè)字符,最后一個(gè)必須是回車符0DH┇
MOVDX,OFFSETBUFMOVAH,0AHINT21H ;0AH號(hào)系統(tǒng)功能調(diào)用
●格式:MOVDL,′A′MOVAH,2INT21H●功能:執(zhí)行2號(hào)系統(tǒng)功能調(diào)用時(shí),將置入DL寄存器中的字符A送屏幕顯示。5.輸出單字符——2號(hào)系統(tǒng)功能調(diào)用●功能是將指定的內(nèi)存緩沖區(qū)中的字符串在屏幕上顯示出來,緩沖區(qū)的字符串以“$”為結(jié)束標(biāo)志。使用格式如下:
BUFDB′GOODBYE$′┇MOVDX,OFFSETBUFMOVAH,9INT21H;在顯示器屏幕上顯示GOODBYE
6.輸出字符串——9號(hào)系統(tǒng)功能調(diào)用如果DL=0FFH,則表示是從鍵盤輸入單字符送AL寄存器;如果DL≠0FFH,則表示是將DL寄存器中的內(nèi)容送屏幕顯示輸出。它們的使用格式如下:MOVDL,0FFHMOVAH,6INT21H;鍵盤輸入單字符送ALMOVDL,′A′MOVAH,6INT21H;將DL中的字符A送屏幕顯示
7.直接控制臺(tái)輸入/輸出單字符——6號(hào)系統(tǒng)功能調(diào)用●格式:MOVAH,4CHINT21H●它沒有入口參數(shù),執(zhí)行結(jié)果是結(jié)束當(dāng)前正在執(zhí)行的程序,并返回DOS操作系統(tǒng)。8.返回操作系統(tǒng)——4CH號(hào)系統(tǒng)功能調(diào)用9.從串口輸入單字符——3號(hào)系統(tǒng)功能調(diào)用10.向串口輸出單字符——4號(hào)系統(tǒng)功能調(diào)用●格式:MOVAH,3INT21H●功能:它沒有入口參數(shù),系統(tǒng)將從異步通信口串行輸入的字符置入AL寄存器中?!窀袷剑篗OVDL,′$′MOVAH,4INT21H●功能:執(zhí)行時(shí)將DL寄存器中的字符通過異步通信口串行輸出。為節(jié)省篇幅,不再贅述其他的系統(tǒng)功能調(diào)用,需要時(shí)請(qǐng)參閱附錄B。
5.3.2ROM-BIOS功能調(diào)用ROM-BIOS也以中斷服務(wù)程序的形式,向程序員提供系統(tǒng)的基本輸入輸出程序ROM-BIOS功能更加基本,且與操作系統(tǒng)無關(guān)當(dāng)DOS沒有啟動(dòng)或不允許使用DOS功能調(diào)用時(shí),可以使用ROM-BIOS功能調(diào)用熟悉輸出一個(gè)字符:⑴
功能調(diào)用號(hào):AH=0EH⑵入口參數(shù):AL=欲顯示字符的ASCII碼,通常BX=0⑶
功能調(diào)用:INT10H⑷
出口參數(shù):無5.4程序設(shè)計(jì)舉例程序是計(jì)算機(jī)命令的有序集合,用計(jì)算機(jī)求解某些問題時(shí)往往需要編制程序,其設(shè)計(jì)步驟歸納如下:(1)分析問題(2)建立數(shù)學(xué)模型(3)確定算法(4)繪制程序流程圖(5)內(nèi)存空間分配(6)編制程序與靜態(tài)檢查(7)程序調(diào)試(動(dòng)態(tài)檢查)5.4.1直線運(yùn)行程序設(shè)計(jì)(順序程序設(shè)計(jì))順序程序順序程序是指程序中的每一條指令都是按指令的排列順序執(zhí)行的。順序結(jié)構(gòu)是最基本、最簡(jiǎn)單的程序結(jié)構(gòu)。完全采用順序結(jié)構(gòu)編寫的程序并不多見。例寫出計(jì)算y=a*b+c-18的程序
題中a,b,c分別為3個(gè)帶符號(hào)的8位二進(jìn)制數(shù)
CCEQU18STACKSEGMENTSTACKDW256DUP(?)TOPLABELWORDSTACKENDSDATASEGMENTDAT1DB34HDAT2DB56HDAT3DB0E7HDATYDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATA;取段地址送DSMOVDS,AXMOVAX,STACK;取堆棧段地址送SSMOVSS,AX;MOVSP,OFFSETTOP;SP設(shè)初值
MOVAL,DAT1;取aMOVBL,DAT2;取b;IMULBL;(AL)*(BL)→(AX)MOVBX,AX;(AX)→(BX)MOVAL,DAT3;取cCBW;擴(kuò)展ALADDAX,BX;(AX)+(BX)→(AX)SUBAX,CCMOVDATY,AXMOVAH,4CHINT21HCODEENDSENDSTARTMOVAL,DAT1MOVAX,DATA尋址方式?直接尋址立即數(shù)尋址●分支程序可以有兩種形式:簡(jiǎn)單分支結(jié)構(gòu)和多分支結(jié)構(gòu)。其中簡(jiǎn)單分支結(jié)構(gòu)有兩種,相當(dāng)于高級(jí)語言中的IFTHEN和IFTHENELSE結(jié)構(gòu);多分支結(jié)構(gòu)則相當(dāng)于高級(jí)語言中的DO-CASE結(jié)構(gòu)。它們的流程圖如圖所示?!褶D(zhuǎn)移指令Jcc和JMP可以實(shí)現(xiàn)分支控制,判斷的條件是各種指令,如CMP、TEST等執(zhí)行后形成的狀態(tài)標(biāo)志位。5.4.2分支程序設(shè)計(jì)條件判斷分支語句體1分支語句體2分支語句體nNY…條件1條件2條件n條件判斷Y分支語句體分支語句體N簡(jiǎn)單分支結(jié)構(gòu)流程圖多分支結(jié)構(gòu)流程圖正確選擇判定條件和相應(yīng)的條件轉(zhuǎn)移指令,并注意轉(zhuǎn)移目標(biāo)地址是否正確;(2)在編程時(shí)必須保證每條分支都能有完整的結(jié)果;(3)在檢查和調(diào)試時(shí)必須逐條分支進(jìn)行,因?yàn)橐粭l或其中幾條分支正確還不足以說明整個(gè)程序正確。例:求存儲(chǔ)器中某一有符號(hào)數(shù)X的絕對(duì)值,并將其送回原處。1.單分支結(jié)構(gòu)
X,X≧0-X,X<0X=流程圖開始X≧0F=-X結(jié)束YNSTACKSEGMENTSTACKDW256DUP(?)TOPLABELWORDSTACKENDSDATASEGMENTXADRDW3456H,8192HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAXDATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVSP,OFFSETTOPMOVAX,XADRANDAX,AX
JNSDONENEGAXMOVXADR,AXDONE:MOVAH,4CHINT21HCODEENDSENDSTART
JSNEGXJMPDONENEGX:NEGAXMOVXADR,AXDONE:MOVAH,4CHINT21HCODEENDS例:在存儲(chǔ)器A和B單元各有一個(gè)8位無符號(hào)數(shù),要求比較這兩個(gè)無符號(hào)數(shù)的大小,并根據(jù)比較結(jié)果在屏幕上顯示A>B或B>A(假設(shè)這兩個(gè)數(shù)不相等)。分析:首先使用比較指令比較兩個(gè)無符號(hào)數(shù)的大小,然后根據(jù)標(biāo)志位,使用無符號(hào)數(shù)轉(zhuǎn)移指令實(shí)現(xiàn)轉(zhuǎn)移。DATASEGMENTADB20HBDB92HDATAENDS CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,ACMPB,AL JABGA ;若B>AMOVDL,‘A’MOVBL,‘B’JMPDISPBGA:MOVDL,‘B’MOVBL,‘A’ DISP:MOVAH,2INT21HMOVDL,‘>’INT21HMOVDL,BLINT21HMOVAH,4CHINT21H CODEENDSENDSTART例:存儲(chǔ)器中有一無符號(hào)數(shù)N,若該數(shù)可用一位十六進(jìn)制數(shù)表示,則將其轉(zhuǎn)換成對(duì)應(yīng)的ASCII碼(字母部分采用大寫字母),否則只給出標(biāo)記0FFH而不進(jìn)行轉(zhuǎn)換。分析:1、只有當(dāng)數(shù)N為一位十六進(jìn)制數(shù)時(shí),即其值在0-15范圍內(nèi)時(shí),才對(duì)N作相應(yīng)轉(zhuǎn)換,否則只給出標(biāo)記(0FFH→AL)而不進(jìn)行轉(zhuǎn)換。
2、當(dāng)N為0-9時(shí),將其真值加30H即可得對(duì)應(yīng)ASCII碼值(30H-39H);當(dāng)N為10-15(A-F)時(shí),將其真值加37H可得到其對(duì)應(yīng)的ASCII碼值。2.多分支結(jié)構(gòu)開始N(AL)(AL)<=9(AL)+7H(AL)(AL)+30H(AL)結(jié)束0FFH(AL)NYYNNY(AL)>=0(AL)<16STACKSEGMENTSTACKDW256DUP(?)TOPLABELWORDSTACKENDSDATASEGMENTNDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVSP,OFFSETTOPMOVAL,NCMPAL,09JBED1;小于等于9跳轉(zhuǎn)
CMPAL,15JAG1;大于15跳轉(zhuǎn)
ADDAL,07JMPD1G1:MOVAL,0FFHJMPDONED1:ADDAL,30HDONE:MOVAH,4CHINT21HCODEENDSENDSTART5.4.3循環(huán)程序設(shè)計(jì)循環(huán)程序結(jié)構(gòu)是滿足一定條件的情況下,重復(fù)執(zhí)行某段程序。循環(huán)結(jié)構(gòu)的程序通常有5個(gè)部分:循環(huán)初始部分——為開始循環(huán)準(zhǔn)備必要的條件,如循環(huán)次數(shù)、循環(huán)體需要的數(shù)值等;循環(huán)工作部分——指重復(fù)執(zhí)行的程序部分,其中包括對(duì)循環(huán)條件等進(jìn)行修改的程序段;循環(huán)參數(shù)修改部分——按一定規(guī)律修改操作數(shù)地址及控制變量,以便每次執(zhí)行循環(huán)體時(shí)得到新的數(shù)據(jù);循環(huán)控制部分——判斷循環(huán)條件是否成立,決定是否繼續(xù)循環(huán);循環(huán)結(jié)束部分——主要用來分析和存放程序的結(jié)果。關(guān)鍵是什么?循環(huán)控制關(guān)鍵循環(huán)結(jié)構(gòu)程序設(shè)計(jì)的關(guān)鍵是循環(huán)控制部分循環(huán)控制可以在進(jìn)入循環(huán)之前進(jìn)行,也可以在循環(huán)體后進(jìn)行,于是形成兩種結(jié)構(gòu):“先判斷、后循環(huán)”結(jié)構(gòu)“先循環(huán)、后判斷”結(jié)構(gòu)循環(huán)是否結(jié)束可以通過循環(huán)次數(shù)、某些特定條件進(jìn)行判斷,于是形成兩種結(jié)構(gòu):計(jì)數(shù)控制循環(huán)條件控制循環(huán)先循環(huán)后判斷的循環(huán)結(jié)構(gòu)循環(huán)的初始狀態(tài)循環(huán)的工作部分及修改部分計(jì)數(shù)控制循環(huán)條件控制循環(huán)
結(jié)束
初始化
循環(huán)體
修改部分控制部分未結(jié)束結(jié)束先判斷后循環(huán)的循環(huán)結(jié)構(gòu)循環(huán)的初始狀態(tài)循環(huán)的工作部分及修改部分計(jì)數(shù)控制循環(huán)條件控制循環(huán)
結(jié)束初始化循環(huán)體修改部分控制條件未結(jié)束結(jié)束計(jì)數(shù)控制循環(huán)
計(jì)數(shù)控制循環(huán)利用循環(huán)次數(shù)作為控制條件。易于采用循環(huán)指令LOOP等指令實(shí)現(xiàn)。以先循環(huán)后判斷的循環(huán)結(jié)構(gòu)為例,計(jì)數(shù)控制循環(huán)過程:初始化:將循環(huán)次數(shù)或最大循環(huán)次數(shù)置入CX;循環(huán)體;循環(huán)控制:用LOOP指令實(shí)現(xiàn)對(duì)CX減1、并判斷是否為0。DECCXJNZ……條件控制循環(huán)當(dāng)某些時(shí)候,循環(huán)次數(shù)無法判定,但它與問題的某些條件有關(guān),則可利用特定條件判斷循環(huán)是否結(jié)束。條件控制循環(huán)用條件轉(zhuǎn)移指令判斷循環(huán)條件。轉(zhuǎn)移指令可以指定目的標(biāo)號(hào)來改變程序的運(yùn)行順序,如果目的標(biāo)號(hào)指向一個(gè)重復(fù)執(zhí)行的語句體的開始或結(jié)束,便構(gòu)成了循環(huán)控制結(jié)構(gòu)。例:某10個(gè)連續(xù)存儲(chǔ)單元存放10個(gè)二進(jìn)制有符號(hào)數(shù),統(tǒng)計(jì)負(fù)數(shù)個(gè)數(shù)并將其存儲(chǔ)、顯示。DATASEGMENTBUF DB2,-1,56……COUNTEQU10NEGADB?DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX LEASI,BUFMOVDL,0 MOVCX,COUNTLP: MOVAL,[SI]
ANDAL,ALJNSNEXT INCDL NEXT:INCSI LOOPLPMOVNEGA,DL MOVAH,2 INT21H MOVAH,4CHINT21H CODEENDSENDSTART
LOOP:DECCXJNZLP;CX←CX-1;若CX≠0,轉(zhuǎn)移補(bǔ)充子程序設(shè)計(jì)
子程序要利用過程定義偽指令聲明。子程序最后利用RET指令返回主程序,主程序執(zhí)行CALL指令調(diào)用子程序。子程序中對(duì)堆棧的壓入和彈出操作要成對(duì)使用,保持堆棧的平衡。子程序開始應(yīng)該保護(hù)使用到的寄存器內(nèi)容,子程序返回前相應(yīng)進(jìn)行恢復(fù)。子程序應(yīng)安排在代碼段的主程序之外,最好放在主程序執(zhí)行終止后的位置(返回DOS后、匯編結(jié)束END偽指令前),也可以放在主程序開始執(zhí)行之前的位置。子程序允許嵌套和遞歸。子程序可以與主程序共用一個(gè)數(shù)據(jù)段,也可以使用不同的數(shù)據(jù)段(注意修改DS)。子程序的編寫可以很靈活,例如具有多個(gè)出口(多個(gè)RET指令)和入口,但一定要保證堆棧操作的正確性。處理好子程序與主程序間的參數(shù)傳遞問題。提供必要的子程序說明信息。主程序與子程序之間的參數(shù)傳遞主程序與子程序間一個(gè)主要問題是參數(shù)傳遞入口參數(shù)(輸入?yún)?shù)):主程序調(diào)用子程序時(shí),提供給子程序的參數(shù)出口參數(shù)(輸出參數(shù)):子程序執(zhí)行結(jié)束返回給主程序的參數(shù)參數(shù)的具體內(nèi)容傳數(shù)值:傳送數(shù)據(jù)本身傳地址:傳送數(shù)據(jù)的主存地址常用的參數(shù)傳遞方法寄存器傳遞參數(shù)方式指定內(nèi)存單元(變量)傳遞參數(shù)方式堆棧傳遞參數(shù)方式例程例程例程例程用寄存器傳遞參數(shù)寄存器傳遞參數(shù)方式是指子程序的入口參數(shù)和出口參數(shù)是通過寄存器傳遞。由于通用寄存器個(gè)數(shù)有限,這種方法對(duì)少量數(shù)據(jù)可以直接傳遞數(shù)值,而對(duì)大量數(shù)據(jù)只能傳遞地址。采用寄存器傳遞參數(shù),注意帶有出口參數(shù)的寄存器不能保護(hù)和恢復(fù),帶有入口參數(shù)的寄存器可以保護(hù)、也可以不保護(hù),但最好能夠保持一致。以子程序方式統(tǒng)計(jì)一個(gè)字中‘1’的個(gè)數(shù)STACKSEGMENTSTACKDW256DUP(?)TOPLABELWORDSTACKENDSDATASEGMENTTWDW1234HTWISDW?DATAENDSCODE1SEGMENTASSUMECS:CODE1,DS:DATA,SS:STACKMAIN:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVSP,OFFSETTOPMOVAX,TWCALLFARPTRBCNT1;調(diào)BCNT1子程序
PUSHBXMOVAL,AHCALLFARPTRBCNT1
POPAX;從棧中彈出第一次結(jié)果
ADDAX,BX;兩次結(jié)果相加
MOVTWIS,AXMOVAH,4CHINT21HCODE1ENDSCODE2SEGMENTASSUMECS:CODE2BCNT1PROCFAR;建立子程序,統(tǒng)計(jì)ALMOVBX,0;中1個(gè)數(shù),結(jié)果送BX;MOVCX,08BLOOP1:ROLAL,01JNCBLOOP2INCBXBLOOP2:LOOPBLOOP1RETBCNT1ENDPCODE2ENDSENDMAIN——用寄存器傳遞參數(shù)以子程序方式完成將非壓縮BCD數(shù)轉(zhuǎn)換成16位二進(jìn)制數(shù)假設(shè)一組BCD數(shù)以非壓縮BCD碼的方式存于內(nèi)存的某個(gè)區(qū),并且BCD數(shù)據(jù)的高位存于高地址端,低位存于低地址端。由于轉(zhuǎn)換后的二進(jìn)制數(shù)為16位,所以非壓縮BCD數(shù)最多為5個(gè)字節(jié)。主程序應(yīng)將要轉(zhuǎn)換的一組BCD數(shù)或存放BCD數(shù)的首地址提交給子程序,子程序應(yīng)將轉(zhuǎn)換后的二進(jìn)制數(shù)提交給主程序。
入口參數(shù):存放BCD數(shù)的內(nèi)存首地址送入ES:SI,BCD數(shù)的字節(jié)數(shù)送入CX;
出口參數(shù):轉(zhuǎn)換后的16位二進(jìn)制數(shù)存于DX中。
——用寄存器傳遞參數(shù)0507090402低位數(shù)高位數(shù)數(shù)學(xué)多項(xiàng)式:A0A1A2A3A4=A0*10000+A1*1000+A2*100+A3*10+A4例如:十進(jìn)制數(shù)24975=2*10000+4*1000+9*100+7*10+5源程序本程序算法:1)DX=02)取要轉(zhuǎn)化的一組BCD數(shù)中的高位數(shù)→
(AX);3)(DX)=(DX)*10+(AX);4)重復(fù)(2)、(3)兩步,直到BCD碼的所有位都轉(zhuǎn)化為止。子程序主程序子程序CODESSEGMENT;ASSUMECS:CODESBCD_16BPROCFAR;PUSHBX;PUSHAX;ADDSI,CX;DECSI;SI指向BCD數(shù)的高位
MOVDX,0;BCDL:PUSHCX;MOVAL,ES:[SI];BCD數(shù)段地址在ES中;DECSI;ANDAL,0FH;CBW;MOVBX,AX;二進(jìn)制數(shù)的低位暫存于BX中
MOVAX,DX;高位暫存于AX中
MOVCX,10;MULCX;高位乘10
MOVDX,AX;ADDDX,BX;高位乘10加低位
POPCX;LOOPBCDL;POPAX;POPBX;RET;BCD_16BENDP;CODESENDS主程序STACKSEGMENTSTACK;DW256DUP(?);TOPLABELWORD;STACKENDS;DATASEGMENT;LENG1DW?;BCD1DB5DUP(?);RESULTDW?;DATAENDS;CODEMSEGMENT;ASSUMECS:CODE,DS:DATA,SS:STACK;MAIN:MOVAX,DATAMOVDS,AX;MOVES,AX;MOVAX,STACK;MOVSS,AX;MOVSP,OFFSETTOP;
LEASI,BCD1;BCD1的偏移地址送SIMOVCX,LENG1;BCD數(shù)的長度送CXCALLFARPTRBCD_16BMOVRESULT,DX;MOVAH,4CH;INT21H;CODEMENDS;
...
子程序部分
...
END
MAIN指定內(nèi)存單元(變量)傳遞參數(shù)方式子程序和主程序使用相同的內(nèi)存單元存取數(shù)據(jù)就是利用指定內(nèi)存單元方式進(jìn)行參數(shù)傳遞。如果主程序還要利用原來的變量值,則需要保護(hù)和恢復(fù)。利用共享內(nèi)存單元(變量)傳遞參數(shù),子程序的通用性較差,但特別適合在多個(gè)程序段間、尤其在不同的程序模塊間傳遞數(shù)據(jù)。以子程序方式完成將非壓縮BCD數(shù)轉(zhuǎn)換成16位二進(jìn)制數(shù)假設(shè)一組BCD數(shù)以分離BCD數(shù)的方式存于內(nèi)存的某個(gè)區(qū),并且BCD數(shù)據(jù)的高位存于高地址端,低位存于低地址端。由于轉(zhuǎn)換后的二進(jìn)制數(shù)為16位,所以非壓縮BCD數(shù)最多為5個(gè)字節(jié)。
DATA段及變量BCD1和LENG1可作為指定內(nèi)存單元,并假定結(jié)果也存入該段的RESULT字變量單元中。那么,對(duì)應(yīng)的子程序?qū)⑿薷娜缦拢鹤映绦蛑鞒绦蛟闯绦颉脙?nèi)存單元傳遞參數(shù)子程序CODESSEGMENT;ASSUMECS:CODES,ES:DATA;BCD-16BPROCFARPUSHBX;PUSHAX;PUSHSI;PUSHES;MOVAX,DATA;取指定內(nèi)存區(qū)段地址
MOVES,AX;ES偏移地址
MOVSI,OFFSETBCD1;偏移地址送SIMOVCX,ES:LENG1;BCD數(shù)的長度送CXADDSI,CX;DECSI;SI指向BCD數(shù)最高位
MOVDX,0;BCDL:PUSHCX;MOVAL,ES:[SI];DECSI;ANDAL,0FH;CBW;
MOVBX,AX;MOVAX,DX;MOVCX,10;MULCX;MOVDX,AX;ADDDX,BX;POPCX;LOOPBCDL;MOVES:RESULT,DX;DX中的結(jié)
POPES;果送指定單元
POPSI;
POPAX;POPBX;RET;BCD-16BENDP;CODESENDS;主程序STACKSEGMENTSTACK;DW256DUP(?);TOPLABELWORD;STACKENDS;DATASEGMENT;BCD1DB5DUP(?);ADSEGDW?;ADOFSTDW?;LENG1DW?;RESULTDW?;DATAENDS;CODEMSEGMENT;ASSUMECS:CODEM,DS:DATA,SS:STACK;MAIN:MOVAX,DATA;MOVDS,AX;MOVES,AX;MOVAX,STACK;MOVSS,AX;MOVSP,OFFSETTOP;
MOVAX,SEGBCD1;MOVADSEG,AX;MOVAX,OFFSETBCD1;MOVADOFST,AX;MOVAX,LENGTHBCD1;MOVLENG1,AX;CALLFARPTRBCD-16B;MOVAH,4CH;INT21H;CODEMENDS;
(子程序部
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 創(chuàng)業(yè)融資租賃合同范本
- 公路護(hù)欄修建合同范本
- 個(gè)人用電協(xié)議合同范例
- 公司運(yùn)輸購銷合同范本
- 刻字木材出售合同范本
- 個(gè)人旅游陪玩合同范本
- 個(gè)人住家保姆合同范本
- 勞務(wù)代理加盟合同范例
- fidic銀皮書合同范例
- 出售電廠燒火料合同范本
- 2023年部編人教版六年級(jí)道德與法治下冊(cè)全冊(cè)課件【完整版】
- 需求供給與均衡價(jià)格PPT課件
- 金融工程鄭振龍課后習(xí)題答案
- 最常用2000個(gè)英語單詞_(全部標(biāo)有注釋)字母排序
- 人造革的幾種生產(chǎn)制造方法
- 在銀行大零售業(yè)務(wù)工作會(huì)議上的講話講解學(xué)習(xí)
- 發(fā)電廠動(dòng)力部分復(fù)習(xí)資料
- 古代傳說中的藝術(shù)形象-
- 水電站大壩土建安裝工程懸臂模板施工手冊(cè)
- 三體系內(nèi)審檢查表(共58頁).doc
- 家樂福 全套管控文件
評(píng)論
0/150
提交評(píng)論