微機(jī)第03章0(匯編程序設(shè)計(jì))_第1頁(yè)
微機(jī)第03章0(匯編程序設(shè)計(jì))_第2頁(yè)
微機(jī)第03章0(匯編程序設(shè)計(jì))_第3頁(yè)
微機(jī)第03章0(匯編程序設(shè)計(jì))_第4頁(yè)
微機(jī)第03章0(匯編程序設(shè)計(jì))_第5頁(yè)
已閱讀5頁(yè),還剩119頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1共一百二十四頁(yè)匯編語(yǔ)言(hu bin y yn)的特點(diǎn)匯編語(yǔ)言是一種以處理器指令系統(tǒng)為基礎(chǔ)的低級(jí)程序設(shè)計(jì)語(yǔ)言,它采用助記符表達(dá)指令操作碼,采用標(biāo)識(shí)符號(hào)表示指令操作數(shù)利用匯編語(yǔ)言編寫程序的主要優(yōu)點(diǎn)是可以直接、有效地控制計(jì)算機(jī)硬件,因而容易創(chuàng)建代碼序列(xli)短小、運(yùn)行快速的可執(zhí)行程序在有些應(yīng)用領(lǐng)域,匯編語(yǔ)言的作用是不容置疑和無(wú)可替代的匯編程序設(shè)計(jì)的過(guò)程是與其他高級(jí)語(yǔ)言程序設(shè)計(jì)大致相同2共一百二十四頁(yè)教學(xué)(jio xu)重點(diǎn)匯編語(yǔ)言源程序格式與開發(fā)常量、變量和標(biāo)號(hào)匯編語(yǔ)言程序設(shè)計(jì)(chn x sh j)方法順序程序設(shè)計(jì)分支程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)子程序設(shè)計(jì)3共一百二十四頁(yè)3.1 匯編語(yǔ)言(hu b

2、in y yn)源程序格式完整的匯編語(yǔ)言源程序由段組成一個(gè)匯編語(yǔ)言源程序可以包含若干個(gè)代碼段、數(shù)據(jù)段、附加段或堆棧段,段與段之間的順序可隨意排列需獨(dú)立(dl)運(yùn)行的程序必須包含一個(gè)代碼段,并指示程序執(zhí)行的起始點(diǎn),一個(gè)程序只有一個(gè)起始點(diǎn)所有的可執(zhí)行性語(yǔ)句必須位于某一個(gè)代碼段內(nèi),說(shuō)明性語(yǔ)句可根據(jù)需要位于任一段內(nèi)通常,程序還需要一個(gè)堆棧段 源程序由語(yǔ)句序列構(gòu)成4共一百二十四頁(yè)匯編語(yǔ)言(hu bin y yn)的語(yǔ)句格式執(zhí)行性語(yǔ)句執(zhí)行性語(yǔ)句用于表達(dá)處理器指令(zhlng)(也稱為硬指令(zhlng),匯編后對(duì)應(yīng)一條指令(zhlng)代碼。由處理器指令(zhlng)組成的代碼序列是程序設(shè)計(jì)的主體標(biāo)號(hào):

3、硬指令助記符 操作數(shù),操作數(shù) ;注釋說(shuō)明性語(yǔ)句說(shuō)明性語(yǔ)句用于表達(dá)偽指令,指示源程序如何匯編、變量怎樣定義、過(guò)程怎么設(shè)置等名字 偽指令助記符 參數(shù),參數(shù), ;注釋5共一百二十四頁(yè)硬指令(zhlng)與偽指令(zhlng)硬指令(Instruction)使CPU產(chǎn)生動(dòng)作、并在程序執(zhí)行時(shí)才處理的指令硬指令就是第2章學(xué)習(xí)(xux)的處理器指令,與具體的處理器有關(guān)、與匯編程序無(wú)關(guān)偽指令(Directive)不產(chǎn)生CPU動(dòng)作、在程序執(zhí)行前由匯編程序處理的說(shuō)明性指令偽指令與具體的處理器類型無(wú)關(guān),但與匯編程序有關(guān)。不同版本的匯編程序支持不同的偽指令 硬指令和偽指令采用易于記憶的符合表達(dá),這就是助記符6共一百二

4、十四頁(yè)第3章:標(biāo)號(hào)(bioho)、名字與標(biāo)識(shí)符標(biāo)號(hào)(bioho)是反映硬指令位置(邏輯地址)和屬性的標(biāo)識(shí)符,后跟一個(gè)冒號(hào)分隔名字是反映偽指令位置(邏輯地址)和屬性的標(biāo)識(shí)符,后跟空格或制表符分隔,沒(méi)有冒號(hào)標(biāo)識(shí)符(Identifier)一般最多由31個(gè)字母、數(shù)字及規(guī)定的特殊符號(hào)(如 _、$、?、)組成,不能以數(shù)字開頭。默認(rèn)情況下,匯編程序不區(qū)別標(biāo)識(shí)符中的字母大小寫一個(gè)源程序中,每個(gè)標(biāo)識(shí)符的定義是唯一的,且不能是匯編系統(tǒng)所采用的保留字7共一百二十四頁(yè)保留字保留字(Reserved Word)是匯編程序已經(jīng)利用的標(biāo)識(shí)符(也稱為關(guān)鍵字),主要有:硬指令助記符例如:MOV、ADD偽指令助記符例如:DB、D

5、W操作符例如:OFFSET、PTR寄存器名例如:AX、CS預(yù)定(ydng)義符號(hào)例如:data 匯編語(yǔ)言(hu bin y yn)對(duì)大小寫不敏感8共一百二十四頁(yè)操作數(shù)和參數(shù)(cnsh)處理器指令中的操作數(shù)可以是立即數(shù)、寄存器和存儲(chǔ)單元(cn ch dn yun)偽指令中的參數(shù)可以是常數(shù)、變量名、表達(dá)式等,可以有多個(gè),參數(shù)之間用逗號(hào)分隔9共一百二十四頁(yè)注釋(zhsh)語(yǔ)句中由分號(hào)“;”開始的部分為注釋內(nèi)容(nirng),用以增加源程序的可讀性必要時(shí),一個(gè)語(yǔ)句行也可以由分號(hào)開始作為階段性注釋匯編程序在翻譯源程序時(shí)將跳過(guò)該部分,不對(duì)它們做任何處理10共一百二十四頁(yè)分隔符語(yǔ)句的4個(gè)組成部分要用分隔符分

6、開標(biāo)號(hào)后用冒號(hào),注釋前用分號(hào)操作數(shù)之間和參數(shù)之間使用(shyng)逗號(hào)分隔其他部分通常采用空格或制表符多個(gè)空格和制表符的作用與一個(gè)相同MASM支持續(xù)行符 “”11共一百二十四頁(yè)例3.1 在屏幕上顯示(xinsh)一段信息;數(shù)據(jù)(shj)段(定義要顯示的字符串)stringdbHello, Assembly !,0dh,0ah,$;代碼段(顯示字符串的程序)mov dx,offset stringmov ah,9int 21hHello, Assembly !程序功能12共一百二十四頁(yè)3.1.1 簡(jiǎn)化(jinhu)段定義格式.model small;定義程序的存儲(chǔ)模式(小型(xioxng)模式)

7、.stack;定義堆棧段(默認(rèn)是1KB空間).data;定義數(shù)據(jù)段;數(shù)據(jù)定義.code;定義代碼段start:mov ax,data;程序起始點(diǎn)mov ds,ax;設(shè)置DS指向用戶定義的數(shù)據(jù)段;程序代碼mov ax,4c00hint 21h;程序結(jié)束點(diǎn),返回DOS;子程序代碼end start;匯編結(jié)束,同時(shí)指明程序起始點(diǎn)start13共一百二十四頁(yè)第1個(gè)源文件wjl301.asm;wjl301.asm.model small.stack.datastringdb Hello, Assembly !,0dh,0ah,$.codestart:mov ax,datamov ds,axmov dx,

8、offset stringmov ah,9int 21hmov ax,4c00hint 21hend start14共一百二十四頁(yè)匯編語(yǔ)言程序(chngx)的處理過(guò)程(附錄B)編輯(binj)文本編輯器,如 PWB.EXE源程序:文件名.asm匯編匯編程序,如 ML.EXE目標(biāo)模塊:文件名.obj連接連接程序,如 LINK.EXE可執(zhí)行文件:文件名.exe調(diào)試調(diào)試程序,如 DEBUG.EXE應(yīng)用程序錯(cuò)誤錯(cuò)誤錯(cuò)誤錯(cuò)誤15共一百二十四頁(yè)上機(jī)過(guò)程(guchng)1:編輯源程序源程序文件應(yīng)以. ASM為擴(kuò)展名源程序文件的形成(編輯)可以通過(guò)任何一個(gè)文本編輯器實(shí)現(xiàn):DOS中的全屏幕文本編輯器EDIT E

9、DIT wjl301.asmMASM 6.X提供(tgng)的集成工作環(huán)境PWBWindows中的記事本Notepad其他程序開發(fā)工具中的編輯環(huán)境 16共一百二十四頁(yè)上機(jī)過(guò)程(guchng)2:匯編源程序MASM 6.x匯編是將源程序翻譯成由機(jī)器代碼組成的目標(biāo)模塊文件(wnjin)的過(guò)程MASM 6.x提供的匯編程序是ML.EXE ML /c wjl301.asm如果源程序中沒(méi)有語(yǔ)法錯(cuò)誤,MASM將自動(dòng)生成一個(gè)目標(biāo)模塊文件(wjl301.obj);否則MASM將給出相應(yīng)的錯(cuò)誤信息。這時(shí)應(yīng)根據(jù)錯(cuò)誤信息,重新編輯修改源程序后,再進(jìn)行匯編17共一百二十四頁(yè)開發(fā)(kif)過(guò)程2:匯編源程序MASM 5

10、.xMASM 5.x提供的匯編程序是MASM.EXE MASM wjl301.asm ;如果利用分號(hào)“;”結(jié)尾命令,則匯編程序不再提示(tsh)輸入模塊文件名、列表文件名等,直接采用默認(rèn)的文件名。默認(rèn)采用源程序文件相同的主文件名,擴(kuò)展名則是相應(yīng)類型文件的擴(kuò)展名,例如目標(biāo)文件(.obj)和列表文件(.lst)等18共一百二十四頁(yè)上機(jī)過(guò)程(guchng)2:生成列表文件匯編過(guò)程中,可以通過(guò)參數(shù)選擇生成列表文件(.LST)。列表文件是一種文本文件,含有源程序和目標(biāo)(mbio)代碼,對(duì)我們學(xué)習(xí)匯編語(yǔ)言程序設(shè)計(jì)和發(fā)現(xiàn)錯(cuò)誤很有用匯編程序ML.EXE和MASM.EXE都可帶其他參數(shù),為了生成列表文件,各自的

11、命令是: ML /Fl wjl301.asm產(chǎn)生.obj/.exe/.lst MASM /l wjl301.asm;產(chǎn)生.obj/.lst以上命令除產(chǎn)生模塊文件wjl301.obj外,還將生成列表文件wjl301.lst19共一百二十四頁(yè)上機(jī)過(guò)程(guchng)3:連接目標(biāo)模塊連接程序能把一個(gè)或多個(gè)目標(biāo)文件和庫(kù)文件合成一個(gè)可執(zhí)行程序(.EXE、.COM文件):LINK wjl301.obj;如果沒(méi)有嚴(yán)重錯(cuò)誤,LINK將生成一個(gè)可執(zhí)行文件(wjl301.exe);否則將提示(tsh)相應(yīng)的錯(cuò)誤信息。這時(shí)需要根據(jù)錯(cuò)誤信息重新修改源程序文件后再匯編、鏈接,直到生成可執(zhí)行文件ML.EXE匯編程序(MA

12、SM 6.x)可自動(dòng)調(diào)用LINK連接程序,實(shí)現(xiàn)匯編和連接的依次進(jìn)行ML wjl301.asm20共一百二十四頁(yè)上機(jī)過(guò)程4:運(yùn)行(ynxng)和調(diào)試經(jīng)匯編、連接生成的可執(zhí)行程序在操作系統(tǒng)下只要輸入文件名就可以運(yùn)行: wjl301操作系統(tǒng)裝載該文件進(jìn)入主存,并開始運(yùn)行如果出現(xiàn)運(yùn)行錯(cuò)誤,可以從源程序開始排錯(cuò),也可以利用(lyng)調(diào)試程序幫助發(fā)現(xiàn)錯(cuò)誤采用DEBUG.EXE調(diào)試程序: DEBUG wjl301.exe21共一百二十四頁(yè)1. 存儲(chǔ)(cn ch)模式(Memory Model)存儲(chǔ)模式?jīng)Q定了一個(gè)(y )程序的規(guī)模,也確定了子程序調(diào)用、指令轉(zhuǎn)移和數(shù)據(jù)訪問(wèn)等的缺省屬性當(dāng)使用簡(jiǎn)化段定義的源程序格

13、式時(shí),必須有存儲(chǔ)模式.MODEL語(yǔ)句,且位于所有簡(jiǎn)化段定義語(yǔ)句之前。其格式為:.MODEL 存儲(chǔ)模式.MODEL語(yǔ)句確定了程序采用的存儲(chǔ)模式,MASM有7種可以選擇,如表3.1所示 本課程學(xué)習(xí)過(guò)程中,均采用小型模式SMALL22共一百二十四頁(yè)2. 邏輯段的簡(jiǎn)化(jinhu)定義.STACK 大小堆棧段定義偽指令.STACK創(chuàng)建(chungjin)一個(gè)堆棧段,段名是:STACK??蛇x的“大小”參數(shù)指定堆棧段所占存儲(chǔ)區(qū)的字節(jié)數(shù),默認(rèn)是1KB(1024400H字節(jié)).DATA數(shù)據(jù)段定義偽指令.DATA創(chuàng)建一個(gè)數(shù)據(jù)段,段名是:_DATA。數(shù)據(jù)段名可用DATA預(yù)定義標(biāo)識(shí)符表示.CODE 段名代碼段定義偽

14、指令.CODE創(chuàng)建一個(gè)代碼段,可選的“段名”參數(shù)指定該代碼段的段名。如果沒(méi)有給出段名,則采用默認(rèn)段名 一個(gè)段的開始自動(dòng)結(jié)束前面的一個(gè)段 簡(jiǎn)化段定義偽指令之前,需有存儲(chǔ)模式語(yǔ)句23共一百二十四頁(yè)3. 程序(chngx)開始為了指明程序開始執(zhí)行的位置,需要使用一個(gè)標(biāo)號(hào)(例題中采用了start 標(biāo)識(shí)符)連接程序會(huì)根據(jù)程序起始點(diǎn)正確地設(shè)置CS和IP值,根據(jù)程序大小和堆棧段大小設(shè)置SS和SP值連接程序沒(méi)有設(shè)置DS和ES值。程序如果使用數(shù)據(jù)段或附加段,必須明確給DS或ES賦值大多數(shù)程序需要數(shù)據(jù)段,程序的執(zhí)行開始應(yīng)是:start:mov ax,data;data表示(biosh)數(shù)據(jù)段的段地址mov ds,

15、ax;設(shè)置DS24共一百二十四頁(yè)4. 程序終止并返回(fnhu)操作系統(tǒng)應(yīng)用程序執(zhí)行結(jié)束,應(yīng)該將控制權(quán)交還(jiohun)操作系統(tǒng)匯編語(yǔ)言程序設(shè)計(jì)中,有多種返回DOS的方法,但一般利用DOS功能調(diào)用的4CH子功能實(shí)現(xiàn),它需要的入口參數(shù)是AL返回?cái)?shù)碼(通常用0表示程序運(yùn)行正常,沒(méi)有錯(cuò)誤)于是,應(yīng)用程序的終止代碼就是:mov ax,4c00hint 21h25共一百二十四頁(yè)5. 匯編(hubin)結(jié)束匯編結(jié)束表示通知匯編程序結(jié)束工作,即將源程序翻譯成目標(biāo)模塊代碼的過(guò)程結(jié)束。源程序的最后必須(bx)有一條END偽指令END 標(biāo)號(hào)可選的“標(biāo)號(hào)”參數(shù)指定程序開始執(zhí)行點(diǎn),連接程序據(jù)此設(shè)置CS和IP值(例題

16、中采用了start 標(biāo)識(shí)符) 程序終止和匯編結(jié)束是兩碼事26共一百二十四頁(yè)第1個(gè)源文件wjl301.asm;wjl301.asm.model small.stack.datastringdb Hello, Assembly !,0dh,0ah,$.codestart:mov ax,datamov ds,axmov dx,offset stringmov ah,9int 21hmov ax,4c00hint 21hend start27共一百二十四頁(yè)簡(jiǎn)化段定義(dngy)的源程序格式.model small;小型模式(msh)存儲(chǔ)模式.stack; 1KB空間堆棧段.data;數(shù)據(jù)段;數(shù)據(jù)定義.

17、code;代碼段start:mov ax,data;起始點(diǎn)mov ds,ax;設(shè)置DS;程序代碼mov ax,4c00hint 21h;結(jié)束點(diǎn),返回DOS;子程序代碼end start;匯編結(jié)束28共一百二十四頁(yè)3.1.2 完整(wnzhng)段定義格式完整段定義利用SEGMENT和ENDS一對(duì)偽指令定義邏輯段同時(shí)需要配合ASSUME偽指令指明邏輯段是代碼段、堆棧段、數(shù)據(jù)段還是附加段完整段定義其優(yōu)點(diǎn)是可以指明邏輯段的定位、組合、類別等屬性(shxng);簡(jiǎn)化段定義只能采用系統(tǒng)默認(rèn)的屬性完整段定義和簡(jiǎn)化段定義的實(shí)質(zhì)是一致的29共一百二十四頁(yè)3.1.3 可執(zhí)行程序的結(jié)構(gòu)(jigu)DOS操作系統(tǒng)支

18、持兩種可執(zhí)行程序結(jié)構(gòu)1. EXE程序程序可以有多個(gè)代碼段和多個(gè)數(shù)據(jù)段,程序長(zhǎng)度可以超過(guò)64KB通常生成EXE結(jié)構(gòu)的可執(zhí)行程序2. COM程序只有一個(gè)邏輯(lu j)段,程序長(zhǎng)度不超過(guò)64KB需要滿足一定條件才能生成COM結(jié)構(gòu)的可執(zhí)行程序(MASM 6.x需要采用TINY模式)30共一百二十四頁(yè)3.2 常量、變量(binling)和標(biāo)號(hào) 匯編語(yǔ)言的數(shù)據(jù)可以簡(jiǎn)單分為常量和變量常量可作硬指令的立即數(shù)或偽指令的參數(shù),變量主要作為存儲(chǔ)器操作數(shù)匯編語(yǔ)言語(yǔ)句中的名字和標(biāo)號(hào)具有(jyu)邏輯地址和類型屬性,主要用做地址操作數(shù),也可以作為立即數(shù)和存儲(chǔ)器操作數(shù)本節(jié)將詳細(xì)討論語(yǔ)句中的參數(shù)和操作數(shù)、名字和標(biāo)號(hào),并引出

19、相關(guān)的偽指令和操作符31共一百二十四頁(yè)3.2.1 常量(chngling)常量表示一個(gè)(y )固定的數(shù)值,它又分成多種形式常數(shù)字符串符合常量數(shù)值表達(dá)式32共一百二十四頁(yè)1. 常數(shù)(chngsh)指由10、16、2和8進(jìn)制形式表達(dá)的數(shù)值,各種進(jìn)制的數(shù)據(jù)以后(yhu)綴字母區(qū)分,默認(rèn)不加后綴字母的是十進(jìn)制數(shù)01100100B由0和1兩個(gè)數(shù)字組成,以字母B/b結(jié)尾二進(jìn)制64H0FFH0B800H由0 9、A F數(shù)字組成,以字母H/h 結(jié)尾,以字母開頭的常數(shù)需要加一個(gè)前導(dǎo)0十六進(jìn)制100255D由0 9數(shù)字組成,以字母 D/d 結(jié)尾(缺省情況可以省略)十進(jìn)制33共一百二十四頁(yè)2. 字符串字符串常量是用

20、單引號(hào)或雙引號(hào)括起來(lái)(q li)的單個(gè)字符或多個(gè)字符其數(shù)值是每個(gè)字符對(duì)應(yīng)的ASCII碼值例如:d(等于64H)AB(等于4142H)Hello, Assembly !34共一百二十四頁(yè)3. 符號(hào)(fho)常量符號(hào)常量使用標(biāo)識(shí)符表達(dá)一個(gè)數(shù)值MASM提供等價(jià)機(jī)制,用來(lái)為常量定義符號(hào)名符號(hào)定義偽指令有等價(jià)“EQU”和等號(hào)“”:符號(hào)名 EQU 數(shù)值表達(dá)式符號(hào)名 EQU ;MASM 5.x不支持符號(hào)名 數(shù)值表達(dá)式EQU用于數(shù)值等價(jià)時(shí)不能重復(fù)定義符號(hào)名,但“”允許(ynx)重復(fù)賦值。例如:X = 7 ;等效于:X equ 7X = X+5 ;“X EQU X+5”是錯(cuò)誤的35共一百二十四頁(yè)4. 數(shù)值(sh

21、z)表達(dá)式數(shù)值表達(dá)式一般是指由運(yùn)算符連接的各種常量所構(gòu)成的表達(dá)式匯編程序在匯編過(guò)程中計(jì)算表達(dá)式,最終得到一個(gè)確定(qudng)的數(shù)值,所以也是常量表達(dá)式的數(shù)值在程序運(yùn)行前的匯編階段計(jì)算,所以組成表達(dá)式的各部分必須在匯編時(shí)就能確定匯編語(yǔ)言支持多種運(yùn)算符(表3.4)我們經(jīng)常使用的是加減乘除( * / )例如:mov ax,3*4+5;等價(jià)于:mov ax,1736共一百二十四頁(yè)3.2.2 變量(binling) 變量實(shí)質(zhì)上是指可以讀寫的內(nèi)存單元,雖然內(nèi)存單元地址不變,但其中存放的數(shù)據(jù)可以改變變量需要事先(shxin)定義才能使用變量定義(Define)偽指令為變量申請(qǐng)固定長(zhǎng)度為單位的存儲(chǔ)空間,并可

22、以同時(shí)將相應(yīng)的存儲(chǔ)單元初始化定義后的變量可以通過(guò)變量名等方法引用(讀寫)其中的數(shù)據(jù),即變量中的數(shù)值37共一百二十四頁(yè)1. 變量(binling)的定義 變量定義的匯編語(yǔ)言格式為:變量名 變量定義偽指令 初值表變量定義偽指令有DB、DW、DD等(表3.5)變量名為用戶自定義的標(biāo)識(shí)符,有時(shí)變量名也可以缺省初值表是用逗號(hào)分隔的參數(shù),主要由常量、數(shù)值表達(dá)式或“?”組成。其中“?”表示未賦初值多個(gè)存儲(chǔ)單元如果初值相同,可以用復(fù)制操作符DUP進(jìn)行定義:重復(fù)次數(shù)(csh) DUP(重復(fù)參數(shù))表示初值表首元素的邏輯地址,常稱為符號(hào)地址。38共一百二十四頁(yè)定義字節(jié)(z ji)變量(Define Byte)DB

23、偽指令用于分配(fnpi)一個(gè)或多個(gè)字節(jié)單元,并可以將它們初始化為指定值初值表中每個(gè)數(shù)據(jù)一定是字節(jié)量,存放一個(gè)8位數(shù)據(jù):可以是0255的無(wú)符號(hào)數(shù)或是128127帶符號(hào)數(shù)也可以是字符串常數(shù)實(shí)例39共一百二十四頁(yè)定義字節(jié)(z ji)變量實(shí)例;數(shù)據(jù)(shj)段Xdb a,-5db 2 dup(100),?Ydb ABC應(yīng)用40共一百二十四頁(yè)字節(jié)(z ji)變量的應(yīng)用 Xdb a, -5 db 2 dup(100), ? Ydb ABCmov al,X ;此處X表示它的第1個(gè)數(shù)據(jù),故ALadec X+1 ;對(duì)X為始的第2個(gè)數(shù)據(jù)減1,故成為6mov Y,al ;現(xiàn)在(xinzi)Y這個(gè)字符串成為 aBC

24、符號(hào)地址變量初值初值表41共一百二十四頁(yè)定義(dngy)字變量(Define Word)DW偽指令用于分配(fnpi)一個(gè)或多個(gè)字單元,并可以將它們初始化為指定值初值表中每個(gè)數(shù)據(jù)是字量,一個(gè)字單元可用于存放任何16位數(shù)據(jù):一個(gè)段地址一個(gè)偏移地址兩個(gè)字符065535之間的無(wú)符號(hào)數(shù)3276832767之間的帶符號(hào)數(shù)42共一百二十四頁(yè)定義(dngy)字變量實(shí)例;數(shù)據(jù)(shj)段countdw 8000h,?,ABmaxintequ 64hnumberdw maxintarraydw maxint dup(0)43共一百二十四頁(yè)定義(dngy)雙字變量(Define Double word)DD 偽指

25、令用于分配一個(gè)或多個(gè)雙字單元,并可以將它們初始化為指定值初值表中每個(gè)數(shù)據(jù)是一個(gè)32位的雙字量:可以是有符號(hào)或無(wú)符號(hào)的32位整數(shù)(zhngsh)也可以用來(lái)表達(dá)16位段地址(高位字)和16位的偏移地址(低位字)的遠(yuǎn)指針varddDD0,?,12345678hfarpointDD00400078h44共一百二十四頁(yè)2. 變量(binling)的應(yīng)用變量具有存儲(chǔ)單元的邏輯地址屬性程序代碼中通過(guò)變量名可直接存取其所指向(zh xin)的首個(gè)數(shù)據(jù)X db a, -5 mov al, X ;X a通過(guò)變量名加減位移量可存取以改變量地址為基地址的前/后數(shù)據(jù) mov al, X+1 ;X -5 例題3.2 變量

26、的定義和應(yīng)用45共一百二十四頁(yè)例題(lt)3.2 變量的定義;數(shù)據(jù)段bvar1db 100, 01100100b, 64h, d;字節(jié)變量:不同進(jìn)制表達(dá)(biod)同一個(gè)數(shù)值,內(nèi)存中有4個(gè)64Hminint = 5;符號(hào)常量:minint 數(shù)值為 5,不占內(nèi)存空間bvar2db -1,minint,minint+5;內(nèi)存中數(shù)值依次為 FFH, 5, 0AH db ? , 2 dup(20h);預(yù)留一個(gè)字節(jié)空間,重復(fù)定義了2個(gè)數(shù)值 20Hwvar1dw 2010h, 4*4;字變量:兩個(gè)數(shù)據(jù)是 2010H、0010H,共占4個(gè)字節(jié)wvar2dw ?;wvar2是沒(méi)有初值的字變量46共一百二十四頁(yè)

27、例題3.2 變量(binling)的定義(續(xù))dvardd 12347777h,87651111h,?;雙字(shun z)變量:2個(gè)雙字?jǐn)?shù)據(jù),一個(gè)雙字空間abcdb a,b,c,?;定義字符,實(shí)際是字節(jié)變量maxint equ 0ah;符號(hào)常量:maxint10stringdb ABCDEFGHIJ;定義字符串:使用字節(jié)定義DB偽指令crlfsdb 13,10,$;回車符0DH、換行符0AH和美元符$24Harray1dw maxint dup(0);10個(gè)初值為0的字量,可以認(rèn)為是數(shù)組arraydb 2 dup(2,3,2 dup(4);6個(gè)字節(jié)內(nèi)容依次為:02 03 04 04 02 0

28、3 04 0447共一百二十四頁(yè)例題(lt)3.2 變量的應(yīng)用;代碼段mov dl, bvar1 ;DL100 ddec bvar2+1 ;bvar2+14mov abc3, dl ;abc3處原為?現(xiàn)abcabcd,mov ax,word ptr dvar0 ;取雙字到DX.AXmov dx,word ptr dvar2add ax,word ptr dvar4 ;加雙字到DX.AXadc dx,word ptr dvar6mov word ptr dvar8,ax ;保存雙字的求和(qi h)結(jié)果mov word ptr dvar10,dx48共一百二十四頁(yè)例題(lt)3.2 變量的應(yīng)用(

29、續(xù))mov cx,maxint;CX10mov bx,0;BX0 again:add stringbx,3;string 每個(gè)數(shù)值加 3inc bxloop again;循環(huán)lea dx,abc;從abc開始顯示,直到遇到(y do)$mov ah,9;09H號(hào)DOS功能調(diào)用int 21h;顯示結(jié)果:abcdDEFGHIJKLMabc串string串49共一百二十四頁(yè)3.2 變量(binling)的定位匯編程序按照指令的先后順序一個(gè)接著一個(gè)分配存儲(chǔ)空間,按照段定義偽指令規(guī)定的邊界定位屬性確定每個(gè)邏輯段的起始位置(包括偏移地址)定位偽指令ORG控制數(shù)據(jù)或代碼所在的偏移地址ORG 參數(shù)ORG偽指令

30、是將當(dāng)前偏移地址指針指向參數(shù)表達(dá)的偏移地址。例如:ORG 100h;從100H處安排數(shù)據(jù)或程序ORG $+10;偏移地址加10,即跳過(guò)10個(gè)字節(jié)空間(kngjin)匯編語(yǔ)言程序中,符號(hào)“$”表示當(dāng)前偏移地址值50共一百二十四頁(yè)3.2.3 名字和標(biāo)號(hào)(bioho)的屬性名字和標(biāo)號(hào)是用戶自定義的標(biāo)識(shí)符。名字用于偽指令,標(biāo)號(hào)用于硬指令。名字和標(biāo)號(hào)一經(jīng)使用便具有兩類屬性:邏輯地址屬性名字和標(biāo)號(hào)對(duì)應(yīng)存儲(chǔ)單元的邏輯地址,含段地址和偏移地址;類型屬性變量名的類型可以是BYTE(字節(jié))、WORD(字)和DWORD(雙字)等;標(biāo)號(hào)、段名、子程序名的類型可以是NEAR(近)和FAR(遠(yuǎn)),分別表示段內(nèi)或段間調(diào)用匯

31、編程序提供有關(guān)操作符,以便(ybin)獲取這些屬性值51共一百二十四頁(yè)1. 地址(dzh)操作符地址操作符取得(qd)名字或標(biāo)號(hào)的段地址和偏移地址返回名字或標(biāo)號(hào)的段地址SEG 名字/標(biāo)號(hào)返回名字或標(biāo)號(hào)的偏移地址OFFSET 名字/標(biāo)號(hào)段前綴,采用指定的段地址寄存器 :當(dāng)前偏移地址 $將括起的表達(dá)式作為存儲(chǔ)器地址指針 52共一百二十四頁(yè)2. 類型(lixng)操作符類型操作符對(duì)名字或標(biāo)號(hào)的類型屬性進(jìn)行設(shè)置類型名 PTR 名字/標(biāo)號(hào)其中類型名可以是BYTE、WORD、DWORD(依次表示(biosh)字節(jié)、字、雙字)等,或是NEAR、FAR(分別表示(biosh)近、遠(yuǎn)),還可以是由結(jié)構(gòu)、記錄等定

32、義的類型對(duì)變量:LENGTHOF操作符獲知某變量名指向多少個(gè)數(shù)據(jù)項(xiàng)SIZEOF操作符獲知它共占用多少字節(jié)空間53共一百二十四頁(yè)3.3 順序程序設(shè)計(jì)(shj)沒(méi)有分支、循環(huán)等轉(zhuǎn)移指令的程序,會(huì)按指令書寫的前后順利依次執(zhí)行(zhxng),這就是順序程序順序結(jié)構(gòu)是最基本的程序結(jié)構(gòu)完全采用順序結(jié)構(gòu)編寫的程序并不多見例題3.4 順序程序設(shè)計(jì)實(shí)例采用查表法,實(shí)現(xiàn)一位16進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼顯示54共一百二十四頁(yè)例3.4 數(shù)據(jù)(shj)段;數(shù)據(jù)段ASCII db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h;對(duì)應(yīng)0 9的ASCII碼 db 41h,42h,43h,44h

33、,45h,46h;對(duì)應(yīng)A F的ASCII碼 hex db 04h,0bh;假設(shè)(jish)兩個(gè)查表數(shù)據(jù)55共一百二十四頁(yè)例3.4 代碼段 ;代碼段mov bx,offset ASCII;BX指向(zh xin)ASCII碼表首址mov al,hex;AL取得一位16進(jìn)制數(shù);即要查表項(xiàng)在ASCII碼表中的位移and al,0fh;屏蔽高4位只取低4位Xlat;換碼:ALDS:BXALXLAT56共一百二十四頁(yè)例3.4 代碼段(續(xù))mov dl,al;入口參數(shù)(cnsh):DLALmov ah,2;02號(hào)DOS功能調(diào)用int 21h;顯示一個(gè)ASCII碼字符mov al,hex+1;轉(zhuǎn)換并顯示下一

34、個(gè)數(shù)據(jù)and al,0fhxlatmov dl,almov ah,2int 21hXLAT57共一百二十四頁(yè)3.4 分支(fnzh)程序設(shè)計(jì)分支程序根據(jù)條件是真或假?zèng)Q定執(zhí)行與否判斷的條件是各種指令(zhlng),如CMP、TEST等執(zhí)行后形成的狀態(tài)標(biāo)志轉(zhuǎn)移指令Jcc和JMP可以實(shí)現(xiàn)分支控制分支結(jié)構(gòu)有單分支結(jié)構(gòu)雙分支結(jié)構(gòu)多分支結(jié)構(gòu)58共一百二十四頁(yè)單分支(fnzh)結(jié)構(gòu)條件成立跳轉(zhuǎn),否則順序執(zhí)行分支語(yǔ)句體注意選擇正確的條件轉(zhuǎn)移(zhuny)指令和轉(zhuǎn)移(zhuny)目標(biāo)地址實(shí)例:求絕對(duì)值59共一百二十四頁(yè)計(jì)算(j sun)AX中有符號(hào)數(shù)的絕對(duì)值 cmp ax,0 jge nonneg;條件滿足(m

35、nz)(AX0),轉(zhuǎn)移 neg ax;條件不滿足,求補(bǔ)nonneg: mov result,ax;條件滿足;不恰當(dāng)?shù)姆种?cmp ax,0 jl yesneg;條件滿足(AX0),轉(zhuǎn)移 jmp nonnegyesneg: neg ax;條件不滿足,求補(bǔ)nonneg: mov result,ax;條件滿足60共一百二十四頁(yè)雙分支(fnzh)結(jié)構(gòu)條件成立跳轉(zhuǎn)執(zhí)行第2個(gè)分支語(yǔ)句體,否則順序執(zhí)行第1個(gè)分支語(yǔ)句體注意第1個(gè)分支體后一定要有一個(gè)(y )JMP指令跳到第2個(gè)分支體后實(shí)例:顯示BX的最高位61共一百二十四頁(yè)判斷(pndun)BX的最高位并顯示shl bx,1;BX最高位左移進(jìn)入(jnr)CF標(biāo)

36、志jc one;CF1,即最高位為1,轉(zhuǎn)移mov dl,30h;CF0,即最高位為0:DL30H0jmp two;一定要跳過(guò)另一個(gè)分支體 one:mov dl,31h;DL 31H1 two:mov ah,2int 21h;顯示也可用JNC指令實(shí)現(xiàn)62共一百二十四頁(yè)判斷(pndun)BX的最高位并顯示(另解)shl bx,1;BX最高位移入CF標(biāo)志(biozh)jnc one;CF0,即最高位為0,轉(zhuǎn)移mov dl,31h;CF1,即最高位為1:DL31H1jmp two;一定要跳過(guò)另一個(gè)分支體 one:mov dl,30h;DL 30H0 two:mov ah,2int 21h;顯示轉(zhuǎn)換為單

37、分支結(jié)構(gòu)63共一百二十四頁(yè)判斷(pndun)BX的最高位并顯示(另解)mov dl,0 ;DL30H0shl bx,1;BX最高位移入CF標(biāo)志(biozh)jnc two;CF0,即最高位為0,轉(zhuǎn)移mov dl,1;CF1,即最高位為1:DL31H1 two:mov ah,2int 21h;顯示 編寫分支程序,需留心分支的開始和結(jié)束64共一百二十四頁(yè)判斷(pndun)BX的最高位并顯示(另解)mov dl,0shl bx,1;BX最高位移入CF標(biāo)志(biozh)adc dl,30h;CF0,DL030h030H0;CF1,DL030h131H1 two:mov ah,2int 21h;顯示65

38、共一百二十四頁(yè)例題(lt)3.5 顯示壓縮BCD,去前導(dǎo)0;數(shù)據(jù)段BCDdb 04h;代碼段mov dl,BCDtest dl,0ffh;如果BCD碼為0,顯示0jz zero;雙分支(fnzh)結(jié)構(gòu)test dl,0f0h;如果BCD碼高位為0,不顯示0jz one;單分支結(jié)構(gòu)66共一百二十四頁(yè)顯示(xinsh)壓縮BCD,去前導(dǎo)0(續(xù))mov cl,4;處理(chl)高位shr dl,clor dl,30h;轉(zhuǎn)換為ASCII碼mov ah,2;顯示高位int 21hmov dl,BCDand dl,0fhone:or dl,30h;處理低位jmp twozero:mov dl,0two:m

39、ov ah,2int 21h67共一百二十四頁(yè)大小寫字母轉(zhuǎn)換(zhunhun)(參例題3.6) ;如果DL是一個(gè)小寫字母,則轉(zhuǎn)換(zhunhun)為大寫cmp dl,a;小于小寫字母a,不需要處理jb dispcmp dl,z;大于小寫字母z,也不需要處理ja dispsub dl,20h;是小寫字母,則轉(zhuǎn)換為大寫 disp:轉(zhuǎn)換原理68共一百二十四頁(yè)多分支(fnzh)結(jié)構(gòu)多分支結(jié)構(gòu)是多個(gè)(du )條件對(duì)應(yīng)各自的分支語(yǔ)句體,哪個(gè)條件成立就轉(zhuǎn)入相應(yīng)分支體執(zhí)行or ah,ah;cmp ah,0jz function0dec ah;cmp ah,1jz function1dec ah;cmp ah,

40、2jz function2AH=0fuction0YNAH=1fuction1YNAH=2fuction2YN69共一百二十四頁(yè)3.5 循環(huán)(xnhun)程序設(shè)計(jì)循環(huán)程序結(jié)構(gòu)要求在滿足一定(ydng)條件的情況下,重復(fù)執(zhí)行某段程序循環(huán)結(jié)構(gòu)的程序通常由3個(gè)部分組成:循環(huán)初始化部分為開始循環(huán)準(zhǔn)備必要的條件,如循環(huán)次數(shù)、循環(huán)體需要的數(shù)值等循環(huán)體部分指重復(fù)執(zhí)行的程序部分,其中包括對(duì)循環(huán)條件等的修改程序段循環(huán)參數(shù)改變及控制部分判斷循環(huán)條件是否成立,決定是否繼續(xù)循環(huán)關(guān)鍵是什么?70共一百二十四頁(yè)循環(huán)(xnhun)控制循環(huán)結(jié)構(gòu)程序的設(shè)計(jì)關(guān)鍵是循環(huán)控制部分循環(huán)控制可以在進(jìn)入循環(huán)之前進(jìn)行,也可以在循環(huán)體后進(jìn)行,

41、于是形成兩種結(jié)構(gòu):“先判斷、后循環(huán)”結(jié)構(gòu)“先循環(huán)、后判斷”結(jié)構(gòu)循環(huán)結(jié)束的控制可以用循環(huán)次數(shù),還可以用特定條件等,于是又有:計(jì)數(shù)(j sh)控制循環(huán)條件控制循環(huán)圖示71共一百二十四頁(yè)“先循環(huán)、后判斷(pndun)”的循環(huán)結(jié)構(gòu)循環(huán)(xnhun)的初始狀態(tài)循環(huán)的工作部分及修改部分計(jì)數(shù)控制循環(huán)條件控制循環(huán) 結(jié)束 初始化 修改部分控制條件YN 循環(huán)體72共一百二十四頁(yè)3.5.1 計(jì)數(shù)控制(kngzh)循環(huán) 計(jì)數(shù)控制循環(huán)利用循環(huán)次數(shù)作為控制條件采用循環(huán)指令(zhlng)LOOP和JCXZ易于實(shí)現(xiàn)初始化:將循環(huán)次數(shù)或最大循環(huán)次數(shù)置入CX循環(huán)體循環(huán)控制:用LOOP指令對(duì)CX減1、并判斷是否為073共一百二十四

42、頁(yè)用二進(jìn)制形式顯示(xinsh)BL內(nèi)容(例3.8)mov cx,8;CX8(循環(huán)次數(shù))again:shl bl,1;左移進(jìn)CF,從高位開始顯示mov dl,0;MOV指令不改變(gibin)CFadc dl,30h;DL030HCF;CF若是0,則DL 0 ;CF若是1,則DL 1 mov ah,2int 21h;顯示loop again;CX減1,如果CX未減至0,則循環(huán)計(jì)數(shù)控制循環(huán) 先循環(huán)后判斷74共一百二十四頁(yè)例3.9 求數(shù)組中的最大/最小元素(yun s);數(shù)據(jù)(shj)段arraydw 10; 設(shè)一個(gè)數(shù)組,其中頭一個(gè)數(shù)據(jù)10表示元素個(gè)數(shù)dw -3,0,20,900,587,-632

43、,777, dw 234,-34,-56 ;這是一個(gè)有符號(hào)字量元素組成的數(shù)組maxaydw ?;存放最大值minaydw ?;存放最小值初始化:循環(huán)次數(shù)元素個(gè)數(shù)1循環(huán)體:逐個(gè)比較求最大、小值循環(huán)控制:比較完所有數(shù)據(jù)75共一百二十四頁(yè)例3.9 代碼段;代碼段lea si,arraymov cx,si;取得元素個(gè)數(shù)dec cx;減1后是循環(huán)(xnhun)次數(shù)add si,2mov ax,si;取出第一個(gè)元素給AX,AX用于暫存最大值mov bx,ax;取出第一個(gè)元素給BX,BX用于暫存最小值初始化76共一百二十四頁(yè)例3.9 代碼段(續(xù)) maxck:add si,2cmp si,ax;與下一個(gè)數(shù)據(jù)

44、比較jle minckmov ax,si;AX取得(qd)更大的數(shù)據(jù)jmp next minck:cmp si,bxjge nextmov bx,si;BX取得更小的數(shù)據(jù) next:loop maxck;計(jì)數(shù)循環(huán)mov maxay,ax;保存最大值mov minay,bx;保存最小值循環(huán)體結(jié)束(jish)控制77共一百二十四頁(yè)3.5.2 條件控制(kngzh)循環(huán)條件控制循環(huán)需要利用特定條件判斷循環(huán)是否結(jié)束(jish)條件控制循環(huán)用條件轉(zhuǎn)移指令判斷循環(huán)條件轉(zhuǎn)移指令可以指定目的標(biāo)號(hào)來(lái)改變程序的運(yùn)行順序,如果目的標(biāo)號(hào)指向一個(gè)重復(fù)執(zhí)行的語(yǔ)句體的開始或結(jié)束,便構(gòu)成了循環(huán)控制結(jié)構(gòu)78共一百二十四頁(yè)顯示(

45、xinsh)以ASCII碼0結(jié)尾的字符串;數(shù)據(jù)段stringdb Let us have a try !,0;代碼段mov bx,offset stringagain:mov dl,bxcmp dl,0jz done;為0結(jié)束mov ah,2;不為(b wi)0,顯示int 21hinc bx;指向下一個(gè)字符jmp againdone:條件控制循環(huán) 先判斷后循環(huán)79共一百二十四頁(yè)例3.11 記錄(jl)字單元中“1”的個(gè)數(shù);數(shù)據(jù)段 numberdw 11101111 11100100 B;代碼段mov bx,numberxor dl,dl;循環(huán)初值:DL0 again:test bx,0fff

46、fh;也可以(ky)用cmp bx,0jz done ;全部是0就可以退出循環(huán),減少循環(huán)次數(shù)shl bx,1;用指令shr bx,1也可以adc dl,0;利用ADC指令加CF的特點(diǎn)進(jìn)行計(jì)數(shù)jmp again條件控制循環(huán) 先判斷后循環(huán)80共一百二十四頁(yè)例3.11 十進(jìn)制顯示(xinsh)(016) done:cmp dl,10;判斷1的個(gè)數(shù)是否小于10jb digit;1的個(gè)數(shù)小于10,轉(zhuǎn)移(zhuny)push dxmov dl,1;1的個(gè)數(shù)大于或等于10mov ah,2;則要先顯示一個(gè)1int 21hpop dxsub dl,10 digit:add dl,0;顯示個(gè)數(shù)mov ah,2in

47、t 21h單分支結(jié)構(gòu)81共一百二十四頁(yè)3.5.3 串操作(cozu)類指令 (略)8088的串操作類指令能對(duì)內(nèi)存中一個(gè)連續(xù)區(qū)域的數(shù)據(jù)(如數(shù)組、字符串等)進(jìn)行傳送、比較等操作,指令有:傳送數(shù)據(jù)串:MOVS,STOS,LODS檢測(cè)數(shù)據(jù)串:CMPS,SCAS重復(fù)(chngf)前綴: REP,REPZ,REPNZ串操作指令采用了特殊的尋址方式(數(shù)據(jù)段/附加段,源可跨越/目標(biāo)不可跨越,SI/DI/CX)利用循環(huán)程序也可以實(shí)現(xiàn)串操作指令的功能82共一百二十四頁(yè)3.6 子程序設(shè)計(jì)(chn x sh j) 把功能相對(duì)獨(dú)立的程序段單獨(dú)編寫和調(diào)試,作為一個(gè)相對(duì)獨(dú)立的模塊供程序調(diào)用,就形成(xngchng)子程序通

48、過(guò)子程序可以實(shí)現(xiàn)源程序的模塊化,可簡(jiǎn)化源程序結(jié)構(gòu),可以提高編程效率主程序(調(diào)用程序)通過(guò)CALL指令調(diào)用子程序(被調(diào)用程序)子程序通過(guò)RET指令返回主程序83共一百二十四頁(yè)3.6.1 過(guò)程(guchng)定義和子程序編寫匯編語(yǔ)言中,子程序要用一對(duì)過(guò)程偽指令PROC和ENDP聲明,格式(g shi)如下:過(guò)程名 PROC NEAR|FAR ;過(guò)程體過(guò)程名 ENDP可選的參數(shù)指定過(guò)程的調(diào)用屬性。沒(méi)有指定過(guò)程屬性,則采用默認(rèn)屬性NEAR 屬性(段內(nèi)近調(diào)用)的過(guò)程只能被同一代碼段的其他程序所調(diào)用FAR 屬性(段間遠(yuǎn)調(diào)用)的過(guò)程可以被相同或不同代碼段的程序所調(diào)用84共一百二十四頁(yè)子程序編寫(binxi)

49、注意事項(xiàng)子程序要用過(guò)程定義偽指令聲明主程序執(zhí)行CALL指令后調(diào)用子程序,子程序利用RET指令返回主程序堆棧(duzhn)操作子程序中對(duì)堆棧操作(壓入/彈出)要匹配使用,以保持堆棧的平衡現(xiàn)場(chǎng)的保護(hù)和恢復(fù)子程序首部應(yīng)保護(hù)要用到的寄存器(內(nèi)容),子程序返回前需進(jìn)行相應(yīng)恢復(fù)子程序的位置子程序應(yīng)安排在代碼段的主程序之外,最好放在主程序執(zhí)行終止后的位置(即返回DOS的指令之后、結(jié)束匯編的END偽指令之前),也可以放在主程序開始執(zhí)行之前的位置85共一百二十四頁(yè)用BIOS調(diào)用(dioyng)輸出1個(gè)字符;主程序mov al,?;主程序提供顯示字符call dpchar;調(diào)用子程序;子程序:顯示AL中的字符dp

50、charproc;過(guò)程定義,過(guò)程名為dpcharpush ax;順序入棧,保護(hù)寄存器push bxmov bx,0mov ah,0eh;顯示器0EH號(hào)輸出一個(gè)字符功能int 10hpop bx;逆序出棧,恢復(fù)寄存器pop axret;子程序返回(fnhu)dpcharendp;過(guò)程結(jié)束完整的程序見下頁(yè)86共一百二十四頁(yè)例3.15源程序主程序部分(b fen);wjl315.asm.model small.stack.codestart:mov ax,datamov ds,axmov al,?;主程序提供(tgng)顯示字符call dpchar;調(diào)用子程序mov ax,4c00hint 21h

51、主程序部分本程序不需要數(shù)據(jù)段87共一百二十四頁(yè)例3.15 源程序子程序部分(b fen)dpcharproc;過(guò)程定義,過(guò)程名為dpcharpush ax;順序入棧,保護(hù)寄存器push bxmov bx,0mov ah,0eh;顯示器0EH號(hào)輸出一個(gè)字符功能int 10hpop bx;逆序出棧,恢復(fù)寄存器pop axret;子程序返回(fnhu)dpcharendp;過(guò)程結(jié)束end start子程序安排在主程序后88共一百二十四頁(yè)子程序編寫(binxi)注意事項(xiàng)(續(xù))子程序允許嵌套(調(diào)用別的子程序)和遞歸(調(diào)用自身)子程序可以與主程序共用一個(gè)數(shù)據(jù)段,也可以使用(shyng)不同的數(shù)據(jù)段(注意修

52、改DS),還可以在子程序后設(shè)置數(shù)據(jù)區(qū)(利用CS尋址)子程序的編寫可以很靈活。例如:子程序可以具有多個(gè)出口(多個(gè)RET指令)和多個(gè)入口。注意點(diǎn):要保證堆棧操作的正確性(特別是多出口時(shí))處理好子程序與主程序間的參數(shù)傳遞問(wèn)題提供必要的子程序說(shuō)明信息89共一百二十四頁(yè)例3.16 顯示(xinsh)0結(jié)尾的字符串;數(shù)據(jù)(shj)段msgdb Well, I made it !,0;代碼段(主程序)mov si,offset msg;主程序提供顯示字符串call dpstri;調(diào)用子程序dpstri顯示串嵌套子程序90共一百二十四頁(yè)例3.16 子程序;子程序dpstri:顯示DS:SI指向的字符串(以0結(jié)

53、尾) dpstriprocpush axdps1:mov al,si;取顯示字符inc sicmp al,0;是結(jié)尾,則顯示結(jié)束jz dps2call dpchar;調(diào)用(dioyng)子程序dpchar顯示單字符jmp dps1dps2:pop axretdpstriendp;子程序dpchar:顯示AL中的字符(同例題3.15,略)91共一百二十四頁(yè)含數(shù)據(jù)(shj)區(qū)的子程序;子程序HTOASC:十六進(jìn)制數(shù)轉(zhuǎn)換(zhunhun)為ASCII碼 HTOASCprocpush bxmov bx,offset ASCIIand al,0fhxlat CS:ASCII ;換碼:ALCS:BXALp

54、op bxret;數(shù)據(jù)區(qū)ASCIIdb 30h,31h,32h,33h,34h,35h,36h,37hdb 38h,39h,41h,42h,43h,44h,45h,46hHTOASCendp92共一百二十四頁(yè)多出口(ch ku)子程序;子程序HTOASC:十六進(jìn)制數(shù)轉(zhuǎn)換(zhunhun)為ASCII碼 HTOASCprocand al,0fhcmp al,9jbe htoasc1add al,37h;是A F,加37Hret;子程序返回htoasc1:add,30h;是0 9,加30Hret;子程序返回HTOASCendp93共一百二十四頁(yè)參數(shù)傳遞主程序與子程序間的參數(shù)傳遞入口參數(shù)(輸入?yún)?shù))

55、 主程序調(diào)用(dioyng)子程序時(shí),提供給子程序的參數(shù)出口參數(shù)(輸出參數(shù)) 子程序執(zhí)行結(jié)束返回給主程序的參數(shù)參數(shù)的具體形式傳數(shù)值:傳送數(shù)據(jù)本身傳地址:傳送數(shù)據(jù)的主存地址常用的參數(shù)傳遞方法通過(guò)寄存器傳遞通過(guò)共享變量傳遞通過(guò)堆棧傳遞94共一百二十四頁(yè)3.6.2 用寄存器傳遞(chund)參數(shù)最簡(jiǎn)單和常用的參數(shù)傳遞方法是通過(guò)寄存器,只要把參數(shù)存于約定的寄存器中就可以了由于通用寄存器個(gè)數(shù)有限,這種方法對(duì)少量數(shù)據(jù)可以直接傳遞數(shù)值,而對(duì)大量數(shù)據(jù)只能傳遞地址采用寄存器傳遞參數(shù),注意帶有出口參數(shù)的寄存器不能保護(hù)和恢復(fù),帶有入口參數(shù)的寄存器可以保護(hù)、也可以不保護(hù),但最好能夠保持一致前面 3 個(gè)子程序(chng

56、x): dpchar 、dpstri、HTOASC都是通過(guò)寄存器實(shí)現(xiàn)參數(shù)傳遞的。dpchardpstriHTOASC95共一百二十四頁(yè)3.6.3 用共享變量傳遞(chund)參數(shù)子程序和主程序使用同一個(gè)變量名存取數(shù)據(jù)就是利用共享變量(全局變量)進(jìn)行參數(shù)傳遞如果變量定義和使用不在同一個(gè)源程序文件中,需要利用 PUBLIC、EXTERN 加以聲明如果主程序還要利用原來(lái)的變量值,則需要保護(hù)和恢復(fù)利用共享變量傳遞參數(shù),子程序的通用性較差,但特別(tbi)適合在多個(gè)程序段間、尤其在不同的程序模塊間傳遞數(shù)據(jù)96共一百二十四頁(yè)處在不同文件(wnjin)中的共享變量的說(shuō)明public說(shuō)明(shumng)標(biāo)識(shí)符

57、要被別的文件所引用public 標(biāo)識(shí)符,標(biāo)識(shí)符,extern說(shuō)明本文件要引用別的文件所定義的標(biāo)識(shí)符extern 標(biāo)識(shí)符:類型,標(biāo)識(shí)符:類型,文件1.asmextern va:byte, addr:far文件2.asmpublic va, addr97共一百二十四頁(yè)3.6.4 用堆棧傳遞(chund)參數(shù)參數(shù)傳遞還可以通過(guò)堆棧這個(gè)臨時(shí)存儲(chǔ)區(qū)。主程序?qū)⑷肟趨?shù)壓入堆棧,子程序從堆棧中取出參數(shù),一般利用BP指針進(jìn)行訪問(wèn)子程序?qū)⒊隹趨?shù)壓入堆棧,主程序彈出堆棧取得它們采用堆棧傳遞參數(shù)是程式化的,它是編譯程序處理參數(shù)傳遞、以及匯編語(yǔ)言與高級(jí)語(yǔ)言混合編程時(shí)的常規(guī)(chnggu)方法98共一百二十四頁(yè)用堆棧

58、傳遞(chund)參數(shù)主程序?qū)⒆映绦虻娜肟趨?shù)壓入堆棧,子程序從堆棧中取出參數(shù);子程序?qū)⒊隹趨?shù)壓入堆棧,主程序彈出堆棧取得它們。例入口參數(shù):順序(shnx)壓入偏移地址和元素個(gè)數(shù)出口參數(shù):AL校驗(yàn)和99共一百二十四頁(yè)checksumcprocpush bpmov bp,sppush bxpush cxmov bx,bp+6mov cx,bp+4xor al,al sumc:add al,bx inc bxloop sumcpop cxpop bxpop bpretchecksumcendpmov ax,offset arraypush axmov ax,countpush axcall ch

59、ecksumcadd sp,4mov result,al主程序 子程序利用BP間接尋址取參數(shù),注意位移量主程序?qū)崿F(xiàn)平衡(pnghng)堆棧: add sp,n子程序?qū)崿F(xiàn)平衡堆棧: ret n參看(cnkn)后圖100共一百二十四頁(yè)圖4.3斷點(diǎn)(dun din)傳遞(chund)參數(shù)取參數(shù)的工具101共一百二十四頁(yè)子程序的嵌套子程序內(nèi)包含有子程序的調(diào)用就是(jish)子程序嵌套。子程序嵌套沒(méi)有什么特殊要求例題(lt)102共一百二十四頁(yè)例4.10:子程序嵌套ALdispprocpush axpush cxpush dxpush axmov dl,almov cl,4shr dl,clcall d

60、ldisppop dxand dl,0fhcall dldisppop dxpop cxpop axretALdispendp;將dl中的一位16進(jìn)制數(shù)顯示(xinsh)出來(lái)dldispprocor dl,30hcmp dl,39hjbe dldisp1add dl,7dldisp1:mov ah,2int 21hretdldispendp103共一百二十四頁(yè)子程序的遞歸調(diào)用(dioyng)當(dāng)子程序直接或間接地嵌套調(diào)用自身時(shí)稱為遞歸調(diào)用,含有遞歸調(diào)用的子程序稱為遞歸子程序。遞歸子程序必須采用寄存器或堆棧傳遞參數(shù),遞歸深度(shnd)受堆??臻g的限制。例4.12:求階乘=-=010)!1(!NN

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論