微機(jī)原理及應(yīng)用第04章_第1頁(yè)
微機(jī)原理及應(yīng)用第04章_第2頁(yè)
微機(jī)原理及應(yīng)用第04章_第3頁(yè)
微機(jī)原理及應(yīng)用第04章_第4頁(yè)
微機(jī)原理及應(yīng)用第04章_第5頁(yè)
已閱讀5頁(yè),還剩118頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

復(fù)習(xí)控制類(lèi)指令傳送類(lèi)指令數(shù)據(jù)操作類(lèi)指令串操作類(lèi)指令第4章匯編語(yǔ)言程序設(shè)計(jì)本章主要內(nèi)容:匯編語(yǔ)言源程序的結(jié)構(gòu)匯編語(yǔ)言語(yǔ)句格式偽指令功能調(diào)用匯編語(yǔ)言程序設(shè)計(jì)4.1匯編語(yǔ)言源程序了解:計(jì)算機(jī)的三種語(yǔ)言源程序的結(jié)構(gòu)匯編語(yǔ)言語(yǔ)句格式一、計(jì)算機(jī)設(shè)計(jì)語(yǔ)言機(jī)器語(yǔ)言匯編語(yǔ)言高級(jí)語(yǔ)言面向機(jī)器的語(yǔ)言機(jī)器語(yǔ)言匯編語(yǔ)言高級(jí)語(yǔ)言匯編程序匯編語(yǔ)言源程序用助記符編寫(xiě)源程序的編譯程序匯編程序匯編語(yǔ)言源程序機(jī)器語(yǔ)言目標(biāo)程序匯編程序的功能匯編程序的主要功能是將由匯編語(yǔ)言(助記符)編寫(xiě)的源程序翻譯成用機(jī)器語(yǔ)言(二進(jìn)制代碼)編寫(xiě)的目標(biāo)程序。下圖可用以說(shuō)明這個(gè)功能。匯編程序的功能目標(biāo)代碼文件:其中的地址數(shù)據(jù)還是浮動(dòng)的(相對(duì)的),不能直接運(yùn)行;列表文件:包含程序的邏輯地址、代碼程序及源程序?qū)φ涨鍐危接幸梅?hào)表,可用DOS的TYPE命令輸出;交叉索引文件:包含了符號(hào)定義行號(hào)和引用行號(hào),不能用TYPE命令輸出,需要執(zhí)行CREF文件后生成索引列表文件(.REF)才能輸出。觀察可得:匯編語(yǔ)言源程序作為匯編程序(MASM或ASM)這個(gè)“翻譯”的輸入,而這個(gè)“翻譯”的輸出是三個(gè)文件:二、匯編語(yǔ)言源程序結(jié)構(gòu)數(shù)據(jù)段名SEGMENT…數(shù)據(jù)段名ENDS附加段名SEGMENT…附加段名ENDS堆棧段名SEGMENT…堆棧段名ENDS代碼段名SEGMENT…代碼段名ENDS三、匯編語(yǔ)言語(yǔ)句類(lèi)型指令性語(yǔ)句指示性語(yǔ)句CPU執(zhí)行的語(yǔ)句,能夠生成目標(biāo)代碼CPU不執(zhí)行,而由匯編程序執(zhí)行的語(yǔ)句,不生成目標(biāo)代碼四、匯編語(yǔ)言語(yǔ)句格式指令性語(yǔ)句:[標(biāo)號(hào):][前綴]助記符[操作數(shù)],[操作數(shù)][;注釋]指令的符號(hào)地址,標(biāo)號(hào)后要有冒號(hào)操作碼注釋前加分號(hào)指示性語(yǔ)句格式:[名字]偽指令助記符操作數(shù)[,操作數(shù),…][;注釋]變量的符號(hào)地址,其后不加冒號(hào)指示性語(yǔ)句中至少有一個(gè)操作數(shù)區(qū)分標(biāo)號(hào)和名字標(biāo)號(hào)后有冒號(hào),在指令性語(yǔ)句前;名字后不加冒號(hào),在指示性語(yǔ)句前。名字由英文字母、數(shù)字及專(zhuān)用字符組成,最大長(zhǎng)度不能超過(guò)31個(gè),且不能由數(shù)字打頭,不能用保留字(如寄存器名,指令助記符,偽指令)。 操作碼指令碼命令CPU要完成的操作偽指令助記符指示匯編程序要完成的操作用來(lái)定義變量,分配存儲(chǔ)單元指示程序開(kāi)始和結(jié)束等注釋用分號(hào)作為注釋的開(kāi)始用于說(shuō)明程序或語(yǔ)句的功能,以便于閱讀和理解數(shù)據(jù)項(xiàng)及表達(dá)式寄存器存儲(chǔ)器單元常量變量或標(biāo)號(hào)表達(dá)式操作數(shù)常量數(shù)字常量:沒(méi)有任何屬性的純數(shù)值。在匯編期間,它的值已能完全確定,且在程序運(yùn)行中,它也不會(huì)發(fā)生變化。字符串常量:用引號(hào)引起的字符或字符串例:‘A’,’ABCD’匯編時(shí)被譯成對(duì)應(yīng)的ASCII碼41H,42H,43H,44H常數(shù)的應(yīng)用在程序中,常數(shù)主要出現(xiàn)在:

1)指令語(yǔ)句源操作數(shù)中做立即數(shù),它應(yīng)與目的操作數(shù)的位數(shù)相一致,可以是8位或16位的。

2)在指令語(yǔ)句中的基址加變址的尋址方式中作位移量。

3)在數(shù)據(jù)定義偽指令中。

例如:

MOVAX,1234HMOVBX,[SI+32H]DB12H

;定義一個(gè)字節(jié)數(shù)據(jù)變量變量是代表存放在某些存儲(chǔ)單元的數(shù)據(jù),這些數(shù)據(jù)在程序運(yùn)行期間隨時(shí)可以修改。為了便于對(duì)變量的訪問(wèn),它常常以變量名的形式出現(xiàn)程序中,它可以認(rèn)為是存放在數(shù)據(jù)存儲(chǔ)單元的符號(hào)地址。(1)變量的定義與預(yù)置(2)數(shù)據(jù)定義偽指令變量的定義與預(yù)置定義變量就是給變量分配存儲(chǔ)單元,且對(duì)這個(gè)存儲(chǔ)單元賦予一個(gè)符號(hào)名,即變量名,同時(shí)將這些存儲(chǔ)單元預(yù)置初值。

VAR-DATASEGMENTDATA1DB12HDATA2DB34HDATA3DW9876HVAR-DATAENDS變量的屬性定義變量是用數(shù)據(jù)定義偽指令DB,DW,DD等。經(jīng)過(guò)定義的變量,每個(gè)變量均有三個(gè)屬性:

(1)段屬性(SEG)

(2)偏移量屬性(OFFSET)

(3)類(lèi)屬性(TYPE)段屬性段屬性(SEG):表示變量存放在哪一個(gè)邏輯段中,即變量所在段的段基值。例如:VAR-DATASEGMENTDATA1DB12HDATA2DB34HDATA3DW9876HVAR-DATAENDS

三個(gè)變量都存放在VAR_DATA邏輯段中。當(dāng)在指令中要對(duì)這些變量進(jìn)行存取操作時(shí),事先要把它們所在段的段基值存放在某一個(gè)段寄存器中。偏移量屬性偏移量屬性(OFFSET):表示變量在邏輯段中離段起始點(diǎn)的字節(jié)數(shù)。

例如變量DATA1的偏移量為0,而DATA2的偏移量為1,DATA3的偏移量為2。段屬性和偏移量屬性構(gòu)成了變量的邏輯地址。類(lèi)屬性類(lèi)屬性(TYPE):表示變量占用存儲(chǔ)單元的字節(jié)數(shù)。類(lèi)屬性是由數(shù)據(jù)定義偽指令DB,DW,DD來(lái)規(guī)定的。

變量DATA1,DATA2的類(lèi)屬性為字節(jié);而DATA3的類(lèi)屬性為字;如果用DD定義,類(lèi)屬性為雙字。標(biāo)號(hào)標(biāo)號(hào)是一條指令目標(biāo)代碼的符號(hào)地址,它常作為轉(zhuǎn)移指令(含子程序調(diào)用指令)的操作數(shù)。與變量相似,每個(gè)標(biāo)號(hào)亦具有三個(gè)屬性:

(1)段屬性:表示這條指令目標(biāo)代碼在哪個(gè)邏輯段中。

(2)偏移量屬性:表示這條指令目標(biāo)代碼的首字節(jié)在段內(nèi)離段起始點(diǎn)的字節(jié)數(shù)。

(3)距離屬性:表示本標(biāo)號(hào)可作為段內(nèi)或段間的轉(zhuǎn)移特性。距離屬性又分為NEAR(近)屬性和FAR(遠(yuǎn))屬性。五、表達(dá)式與運(yùn)算符表達(dá)式由操作數(shù)和運(yùn)算符組成,而運(yùn)算符主要由以下幾種類(lèi)型組成:

一、算術(shù)運(yùn)算符二、邏輯運(yùn)算符三、關(guān)系運(yùn)算符四、取值運(yùn)算和屬性運(yùn)算符

五、其它運(yùn)算符算術(shù)運(yùn)算符+、-、*、/:加減乘除運(yùn)算符MOD:除法取余運(yùn)算符例如:MOVAL,

32

MOD5

;(AL)=

2邏輯運(yùn)算符AND:邏輯“與”操作符OR:邏輯“或”操作符XOR:“異或”操作符NOT:邏輯“非”操作符例如:

MOVAL,

24H

AND

0FH;(AL)=04H

24H

XOR

0FH

=

2BH關(guān)系運(yùn)算符參與關(guān)系運(yùn)算的必須是兩個(gè)數(shù)值,關(guān)系運(yùn)算是數(shù)值型的。關(guān)系運(yùn)算是邏輯判定式,當(dāng)為“真”時(shí)結(jié)果取0FFFFH,當(dāng)為“假”時(shí)結(jié)果取0。

EQ

等于LE

小于等于

NE

不等于GT

大于

LT

小于

GE

大于等于

例如:

5

LT6

=

0FFFFH取值運(yùn)算符OFFSET取得其后變量或標(biāo)號(hào)的偏移地址SEG取得其后變量或標(biāo)號(hào)的段地址TYPE取變量的類(lèi)型LENGTH取所定義存儲(chǔ)區(qū)的長(zhǎng)度SIZE取所定義存儲(chǔ)區(qū)的字節(jié)數(shù)用于分析存儲(chǔ)器操作數(shù)的屬性取值運(yùn)算符取值運(yùn)算符的格式:(1)SEG

求段基址格式:SEG〈符號(hào)名〉

(2)OFFSET

求偏移地址格式:OFFSET〈符號(hào)名〉

(3)TYPE

求符號(hào)名類(lèi)型值格式:TYPE〈符號(hào)名〉類(lèi)型1字節(jié)2字節(jié)4字節(jié)8字節(jié)10字節(jié)近程遠(yuǎn)程類(lèi)型值124810-1-2取值運(yùn)算符(4)SIZE

求為符號(hào)名分配的字節(jié)數(shù)格式:SIZE〈符號(hào)名〉

(5)LENGTH

求為符號(hào)名分配的項(xiàng)數(shù)格式:LENGTH

〈符號(hào)名〉

注意:SIZE和LENGTH要求為符號(hào)名定義的數(shù)據(jù)項(xiàng)必須是用重復(fù)格式DUP()定義的。取值運(yùn)算符例MOVAX,SEGDATAMOVDS,AXMOVBX,OFFSETDATA

LEABX,DATA等價(jià)于取值運(yùn)算符例若BUFFER存儲(chǔ)區(qū)是用如下偽指令定義:

BUFFERDW200DUP(0)

則:

TYPE BUFFER

等于2

LENGTHBUFFER

等于200

SIZEBUFFER

等于400注意:SIZE=TYPE*LENGTH屬性運(yùn)算符屬性運(yùn)算符PTR

用于指定其后存儲(chǔ)器操作數(shù)的類(lèi)型

格式:(類(lèi)型)PTR(符號(hào)名)例1:MOVBYTEPTR[BX],12H

例2:已知內(nèi)存變量D1是字節(jié)屬性,要把它的兩個(gè)字節(jié)內(nèi)容送到AX中。

MOVAX,WORDPTRD1其它運(yùn)算符方括號(hào):

[]方括號(hào)中內(nèi)容為操作數(shù)的偏移地址段重設(shè)符段寄存器名:[]用于修改默認(rèn)的段基地址例:

MOVAX,[BX]MOVAX,ES:[BX]4.2偽指令掌握:偽指令的格式及實(shí)現(xiàn)的操作偽指令的應(yīng)用偽指令由匯編程序執(zhí)行的“指令系統(tǒng)”。偽指令沒(méi)有對(duì)應(yīng)的機(jī)器指令,它不是由8086/8088CPU來(lái)執(zhí)行,而是由MASM-86識(shí)別,并完成相應(yīng)的功能。用于定義變量、分配存儲(chǔ)區(qū)、定義邏輯段、指示程序開(kāi)始和結(jié)束等標(biāo)號(hào)名偽指令操作數(shù)注釋

,偽指令語(yǔ)句格式這是一個(gè)任選字段。標(biāo)號(hào)名后面不能用冒號(hào)“:”,這是它與指令語(yǔ)句的突出區(qū)別。不同的偽指令,標(biāo)號(hào)名可以是常量名、變量名、過(guò)程名、結(jié)構(gòu)名、記錄名等。它們可以作為偽指令語(yǔ)句和指令語(yǔ)句的操作數(shù),這時(shí),標(biāo)號(hào)名就表示一個(gè)常量或存儲(chǔ)器地址。這是偽指令語(yǔ)句不可省略的主要成分。偽指令種類(lèi)很多,如定義數(shù)據(jù)偽指令DB,DW,DD;段定義偽指令SEGMENT;定義過(guò)程偽指令PROC等。它們是偽指令語(yǔ)句要求匯編程序完成的具體操作命令。本字段是否需要,需要幾個(gè),需要什么樣的操作數(shù)等都由偽指令字段中偽指令來(lái)確定。操作數(shù)可以是一個(gè)常數(shù)、字符串、常量名、變量名、標(biāo)號(hào)、一些專(zhuān)用的符號(hào)等。這是一個(gè)任選字段,它必須以分號(hào)為開(kāi)始,它的作用與指令語(yǔ)句的注釋字段相同。偽指令語(yǔ)句格式偽指令MASM-86識(shí)別的偽指令可分成以下幾類(lèi):

(1)符號(hào)定義偽指令

(8)定位偽指令

(2)內(nèi)存數(shù)據(jù)定義偽指令

(9)列表偽指令

(3)段定義偽指令

(10)系統(tǒng)隱含進(jìn)位制偽指令

(4)段寄存器說(shuō)明偽指令

(11)連接偽指令

(5)子程序定義偽指令

(12)記錄偽指令(6)模塊開(kāi)始偽指令(13)結(jié)構(gòu)偽指令(7)模塊結(jié)束偽指令(14)塊注釋偽指令

(15)宏命令偽指令符號(hào)定義偽指令格式:

(1)〈名字〉EQU〈表達(dá)式〉

(2)〈名字〉=〈表達(dá)式〉作用:把表達(dá)式的值賦給符號(hào)名。區(qū)別:在同一程序中,用EQU語(yǔ)句賦值的符號(hào)名不能被重新賦值,但用“=”號(hào)賦值的符號(hào)名可以被重新賦值。“〈〉”號(hào)表示此項(xiàng)不能缺省,但該符號(hào)不需要輸入。符號(hào)定義偽指令例:

CONSTANT EQU 100VAREQU30H+99HEQU說(shuō)明的表達(dá)式不占用內(nèi)存空間內(nèi)存數(shù)據(jù)定義偽指令用于定義數(shù)據(jù)區(qū)中變量的類(lèi)型此指令主要有以下五大類(lèi):字節(jié)定義偽指令DB

定義的變量為字節(jié)型字定義偽指令DW

定義的變量為字類(lèi)型四字節(jié)定義偽指令DD

定義的變量為雙字型八字節(jié)定義偽指令DQ

定義的變量為4字型十字節(jié)定義偽指令DT

定義的變量為10字節(jié)型字節(jié)定義偽指令格式:

[名字]DB〈表達(dá)式或數(shù)據(jù)項(xiàng)表〉

表達(dá)式值或項(xiàng)表中的每一項(xiàng)是一個(gè)字節(jié)數(shù),它們從符號(hào)名地址開(kāi)始按字節(jié)連續(xù)存放,直到表中數(shù)據(jù)項(xiàng)結(jié)束(地址遞增方向)。方括號(hào)[]表示該項(xiàng)可以缺省。字定義偽指令格式:

[名字]DW〈表達(dá)式或數(shù)據(jù)項(xiàng)〉

除表達(dá)式值或項(xiàng)表中的每一項(xiàng)是兩個(gè)字節(jié)數(shù)之外,其它與DB偽指令相同。四字節(jié)定義偽指令格式:

[名字]DD〈表達(dá)式或數(shù)據(jù)項(xiàng)〉

表達(dá)式值或項(xiàng)表的每一項(xiàng)是四個(gè)字節(jié)數(shù)。八字節(jié)定義偽指令格式:

[名字]DQ〈表達(dá)式或數(shù)據(jù)項(xiàng)表〉

表達(dá)式值或數(shù)據(jù)項(xiàng)表的每一項(xiàng)是八字節(jié)數(shù),各項(xiàng)從小地址一端連續(xù)存放,允許浮點(diǎn)數(shù)形式,與DD偽指令相同。高四個(gè)字節(jié)填0。十字節(jié)定義偽指令格式:

[名字]DT〈表達(dá)式或數(shù)據(jù)項(xiàng)表〉

表達(dá)式值或數(shù)據(jù)項(xiàng)表的每一項(xiàng)是10個(gè)字節(jié)數(shù),允許浮點(diǎn)數(shù)形式,與DQ偽指令相同,若項(xiàng)表中的數(shù)據(jù)項(xiàng)是十進(jìn)制整數(shù)書(shū)寫(xiě)的,匯編程序按組合的BCD碼格式存放,最低字節(jié)在高地址一端存放,數(shù)據(jù)的最高字節(jié)的最高位是符號(hào)位,“0”表示正,“1”表示負(fù)。數(shù)據(jù)定義偽指令該偽指令主要為數(shù)據(jù)項(xiàng)分配存儲(chǔ)單元并預(yù)置初值。該偽指令構(gòu)成的語(yǔ)句格式是:

DB

變量名+DW+表達(dá)式1,表達(dá)式2,…DD

其中表達(dá)式1,表達(dá)式2,…是給變量賦予的初值。表達(dá)式可以有如下幾種情況:

(1)數(shù)值表達(dá)式(2)?表達(dá)式(3)字符串表達(dá)式(4)帶DUP表達(dá)式數(shù)值表達(dá)式例如:

DA_BYTEDB50H,50DA_WORDDW0A3F1H,4981H

變量DA_BYTE的內(nèi)容為50H,它的下一個(gè)字節(jié)為32H。DA_WORD字單元內(nèi)容為0A3F1H,它的下一字單元為4981H。?表達(dá)式不帶引號(hào)的?表示可預(yù)置任何內(nèi)容。例如:

DA_BDB?,?DA_WDW?,?

第一條語(yǔ)句是要求匯編程序分配兩個(gè)字節(jié)單位,第二條語(yǔ)句是要求分配兩個(gè)字單元。這些單元里現(xiàn)在可以是任意值。字符串表達(dá)式DB偽指令:為字符串中每一個(gè)字符分配一個(gè)字節(jié)單元。字符串必須是用引號(hào)括起來(lái)且不超過(guò)255個(gè)字符。字符串自左至右以字符的ASCII碼按地址遞增的排列順序依次存放。DW偽指令:可以給兩個(gè)字符組成的字符串分配兩個(gè)字節(jié)存儲(chǔ)器單元,且這兩個(gè)字符ASCII碼的存儲(chǔ)順序是前一字符在高字節(jié),后一字符在低字節(jié),每一個(gè)數(shù)據(jù)項(xiàng)不能多于兩個(gè)字符。DD偽指令:僅可給兩個(gè)字符組成的字符串分配四個(gè)字節(jié)單元,且這兩個(gè)字符ASCII碼是存儲(chǔ)在兩個(gè)低字節(jié)中,兩個(gè)高字節(jié)均存放00H。字符串表達(dá)式STRING1DB‘ABCDEF’STRING2DW‘AB’,’CD’,’EF’STRING3DD‘AB’,CD’帶DUP表達(dá)式DUP是定義重復(fù)數(shù)據(jù)操作符。使用DUP操作符格式是:

DB

變量名+DW+表達(dá)式1DUP(表達(dá)式2)

DD

其中表達(dá)式1是重復(fù)的次數(shù),表達(dá)式2是重復(fù)的內(nèi)容

例如:

BB1DB12HDUP(’ABCD’)

BB2DW10HDUP(4)ARRAY1DB2DUP(0,1,2,?)ARRAY2DB100DUP(0,2DUP(1,2),0,3)700bytesARRAY2例題內(nèi)存數(shù)據(jù)定義偽指令例題 …VAR1DB32H,‘ABC’VAR2DW1234H,40H,‘AB’DD12345678HDB?,11000011BARRY1DB2DUP(0,1)ARRY2DW2DUP(?,1) …段定義偽指令存儲(chǔ)器在邏輯上是分段的,各段的定義由偽指令實(shí)現(xiàn)格式:

〈段名〉SEGMENT[定位方式][連接方式][類(lèi)別名]

:::

〈段名〉ENDS

段定義偽指令為程序的匯編和連接說(shuō)明了段名、分段的各種屬性以及分段的開(kāi)始和結(jié)束。段名是自定義符,開(kāi)始的段名與結(jié)束的段名必須相同。段的長(zhǎng)度不超過(guò)64KB(字節(jié))。SEGMENT后面的參數(shù)是可選項(xiàng)。定位方式定位方式指定段的起始地址邊界,方式有以下四種:

(1)PAGE:指定起始地址的低8位是0,即其值能被256整除(稱(chēng)為頁(yè)邊界)。

(2)PARA:指定起始地址的低4位是0,即其值能16整除(稱(chēng)為段邊界)。缺省值是PARA

(3)WORD:指定起始地址的最低位是0,即其值能被2整除(稱(chēng)為字邊界)。

(4)BYTE:指定起始地址是任意值。連接方式連接方式告訴連接程序本段與其它段可按以下方式連接:PRIVATE:

不組合,默認(rèn)狀態(tài)是PRIVATEPUBLIC:依次連接(順序由LINK程序確定)COMMON:覆蓋連接STACK:堆棧段的依次連接AT表達(dá)式:段定義在表達(dá)式值為段基的節(jié)邊界MEMORY:相應(yīng)段在同名段的最高地址處類(lèi)別名類(lèi)別名是合法的自定義符,它必須用單引號(hào)括起來(lái)。如代碼段(‘CODE’)、堆棧段(‘STACK’)等。凡是類(lèi)別名相同的段在連接時(shí)均按先后順序連接起來(lái),即不同模塊連接時(shí)將相同類(lèi)別的段放在連續(xù)的內(nèi)存區(qū)域中。格式:

ASSUME

段寄存器:段定義名1[,段寄存器:段定義名2,…]功能:說(shuō)明所定義邏輯段的性質(zhì)

該偽指令告訴匯編程序在匯編時(shí),段寄存器CS:、DS:、SS:和ES:應(yīng)具有的符號(hào)段基址,以便匯編指令時(shí)確定段和建立錯(cuò)誤信息。但是段寄存器實(shí)際值(CS除外)還要由傳送指令在執(zhí)行程序時(shí)賦值。段寄存器說(shuō)明偽指令例題DATA_SEG1SEGMENT

...(偽指令

Directives);數(shù)據(jù)段內(nèi)定義各類(lèi)程序執(zhí)行需要的相關(guān)的數(shù)據(jù)DATA_SEG1ENDSDATA_SEG2SEGMENT …(偽指令

Directives)DATA_SEG2ENDS;還可根據(jù)具體程序的需要,定義堆棧段供程序執(zhí)行過(guò)程中保持臨時(shí)數(shù)據(jù)例題CODE_SEGSEGMENT

ASSUME

CS:CODE_SEG,DS:DATA_SEG1,ES:DATA_SEG2START:MOVAX,DATA_SEG1 MOVDS,AX MOVAX,DATA_SEG2MOVES,AX :::;完成具體操作的指令序列CODE_SEGENDS

ENDSTART實(shí)際操作(實(shí)現(xiàn)X+Y→Z)DATASEGMENT ;數(shù)據(jù)段

XDB05H YDB04H ZDB?DATAENDS

CODESEGMENT ;代碼段

ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA ;數(shù)據(jù)段基址→AXMOVDS,AX ;AX→DS MOVAL,X ;內(nèi)存單元X的數(shù)據(jù)→AL ADDAL,Y ;內(nèi)存單元Y的數(shù)據(jù)+AL→AL,即X+Y→AL MOVZ,AL;AL→內(nèi)存單元Z,即求和結(jié)果送回Z

MOVAH,4CH ;送功能號(hào)

INT21H ;系統(tǒng)功能調(diào)用,返回操作系統(tǒng)

CODEENDS

ENDSTART子程序定義偽指令格式:〈過(guò)程名〉PROC[NEAR](或[FAR])

:::

〈過(guò)程名〉ENDP

過(guò)程名是自定義符。定義過(guò)程是為實(shí)現(xiàn)子程序調(diào)用而設(shè)的。調(diào)用格式為:

CALL〈過(guò)程名〉

過(guò)程由RET指令返回,它可以不是最后一條指令,它在過(guò)程中可以設(shè)多點(diǎn)返回。并且過(guò)程起始名和終止名必須相同。例題

CODE_SEG SEGMENT

BEGINPROC FAR…CALLNEAR A…CALL FARB…

BEGINENDPA PROCNEAR…RETA ENDPCODE_SEG ENDSCODE_SEG1SEGMENTB PROC FAR…RETB ENDPCODE_SEG1ENDS定位偽指令格式:

ORG〈表達(dá)式〉

該偽指令把以下語(yǔ)句定義的內(nèi)存數(shù)據(jù)或程序,從表達(dá)式指定的起點(diǎn)(偏移地址)開(kāi)始連續(xù)存放,直至遇到新的ORG指令。表達(dá)式的值是一個(gè)無(wú)符號(hào)數(shù)。DATASEGMENT

ORG0100HD1DB11H,22H,33HDATAENDS112233DS:0100計(jì)算值為非負(fù)常數(shù)模塊開(kāi)始偽指令格式:

NAME

模塊名該偽指令指明程序模塊的開(kāi)始,并指出模塊名。模塊名是自定義符,它不能是系統(tǒng)保留字,每次匯編只能出現(xiàn)一次。若該偽指令缺省,則取TITLE語(yǔ)句中的頁(yè)標(biāo)題前6個(gè)字符;若沒(méi)有TITLE語(yǔ)句,則取源程序文件名為模塊名。模塊結(jié)束偽指令格式:

END[啟動(dòng)標(biāo)號(hào)或過(guò)程名]該偽指令告訴匯編程序源文件結(jié)束,并給出執(zhí)行程序的入口位置。啟動(dòng)地址只有在主模塊才有意義。系統(tǒng)隱含進(jìn)位制偽指令格式:

RADIX

表達(dá)式

定義在源程序中書(shū)寫(xiě)數(shù)據(jù)時(shí)的隱含進(jìn)位制方式。表達(dá)式的值是2-16之間的十進(jìn)制數(shù),要遇到新的?RADIX語(yǔ)句后才改變隱含進(jìn)位制。宏命令偽指令格式:

宏名MACRO[形式參數(shù)1,形式參數(shù)2,…]

ENDM功能:宏命令偽指令為指令序列定義一個(gè)宏名,稱(chēng)為宏指令,宏名可以像指令一樣在程序中引用。

...…宏體(指令序列)宏命令——源程序中由匯編程序識(shí)別的具有獨(dú)立功能的一段程序代碼宏指令的使用宏指令的使用步驟:(1)宏定義:對(duì)各個(gè)宏指令進(jìn)行定義,并分別起一個(gè)名字;(2)宏調(diào)用:在需要使用的地方,通過(guò)宏指令名來(lái)調(diào)用它;(3)宏擴(kuò)展:由宏匯編程序用宏定義中的指令來(lái)代替宏調(diào)用中的宏指令名。宏命令偽指令當(dāng)代換指令中的符號(hào)時(shí),在其前面需加一個(gè)宏代換符&

例如:AD1MACROY,XMOVCL,XRO&YAX,CLENDM宏調(diào)用:經(jīng)宏代換語(yǔ)句定義的宏名,在應(yīng)用時(shí)可直接引用,這個(gè)過(guò)程稱(chēng)為宏調(diào)用。例如:AD1R,5

MOVCL,5RORAX,CL注意:宏調(diào)用時(shí),形式參數(shù)要用實(shí)在的參數(shù)取代,順序也應(yīng)與形式參數(shù)順序相同。宏指令-宏命令偽指令宏指令與過(guò)程的區(qū)別:

(1)宏調(diào)用語(yǔ)句由宏匯編程序中的宏處理程序來(lái)識(shí)別,并完成相應(yīng)的處理,而調(diào)用過(guò)程中的CALL語(yǔ)句由CPU來(lái)執(zhí)行。(2)匯編語(yǔ)言源程序在匯編過(guò)程中要將宏指令所代替的程序段匯編成相應(yīng)的機(jī)器代碼,每次調(diào)用均需插入到源程序的目標(biāo)代碼中,這樣使用宏調(diào)用并不能縮短目標(biāo)代碼的長(zhǎng)度。而在過(guò)程調(diào)用中,由于其目標(biāo)代碼與主程序分開(kāi)獨(dú)立存放的且在存儲(chǔ)器中只保留一份從而能有效的縮短目標(biāo)代碼的長(zhǎng)度。

(3)過(guò)程調(diào)用時(shí)需要保留程序的斷點(diǎn)和現(xiàn)場(chǎng),待過(guò)程執(zhí)行完畢還要恢復(fù)現(xiàn)場(chǎng),這些操作需要耗費(fèi)CPU的時(shí)間,而宏匯編則不需要進(jìn)行這些操作,因此,過(guò)程調(diào)用可節(jié)省程序占有的存儲(chǔ)空間,但會(huì)降低程序的執(zhí)行速度;而宏調(diào)用不能節(jié)省存儲(chǔ)空間,卻能有較快的執(zhí)行速度。

(4)在每次宏調(diào)用時(shí)允許修改有關(guān)的參數(shù),使得同一條宏指令在各次調(diào)用過(guò)程中可完成不同的操作;而“過(guò)程”一旦被定義,一般不允許修改,因此,任何一個(gè)“過(guò)程”在各次調(diào)用中只能完成完全相同的操作。宏指令-宏命令偽指令4.3

系統(tǒng)功能調(diào)用一、系統(tǒng)功能調(diào)用概述為給編寫(xiě)匯編語(yǔ)言源程序提供方便,MS-DOS系統(tǒng)中設(shè)置了幾十個(gè)內(nèi)部子程序,它們可完成I/O設(shè)備管理、存儲(chǔ)管理、文件管理和作業(yè)管理等功能。其入口地址已由系統(tǒng)置入中斷入口地址表中,在匯編語(yǔ)言源程序中可用軟件中斷指令調(diào)用它們。DOS功能調(diào)用高級(jí)調(diào)用,操作系統(tǒng)提供BIOS功能調(diào)用低級(jí)調(diào)用DOS功能調(diào)用包含多個(gè)子功能的功能包,用軟中斷指令調(diào)用,中斷類(lèi)型碼固定為21H各子功能采用功能號(hào)來(lái)區(qū)分二、系統(tǒng)功能調(diào)用方法系統(tǒng)功能調(diào)用中的幾十個(gè)子程序成為匯編語(yǔ)言程序員的重要工具,調(diào)用它們時(shí)采用統(tǒng)一的格式,只需要使用三個(gè)語(yǔ)句,如下所示:

(1)傳送入口參數(shù)到指定寄存器中;(2)功能號(hào)送入AH寄存器中;(3)INT21H。

有的子程序無(wú)入口參數(shù),則只需安排后兩個(gè)語(yǔ)句,調(diào)用結(jié)束后,系統(tǒng)將出口參數(shù)送到指定寄存器中或從屏幕顯示出來(lái)。常用的系統(tǒng)功能調(diào)用常用的系統(tǒng)功能調(diào)用有以下14個(gè):

(1)鍵盤(pán)輸入單字符(7)從串口輸入單字符

(2)鍵盤(pán)輸入字符串(8)向串口輸出單字符

(3)輸出單字符

(9)返回操作系統(tǒng)

(4)輸出字符串(10)設(shè)置日期(5)設(shè)置時(shí)間(11)取得日期(6)取得時(shí)間(12)無(wú)回顯鍵盤(pán)輸入單字符(13)直接控制臺(tái)輸入/輸出單字符(14)無(wú)回顯直接控制臺(tái)輸入單字符鍵盤(pán)輸入單字符鍵盤(pán)輸入單字符——1號(hào)系統(tǒng)功能調(diào)用格式:

MOVAH,1INT21H說(shuō)明:該調(diào)用沒(méi)有入口參數(shù),執(zhí)行1號(hào)系統(tǒng)功能調(diào)用時(shí),系統(tǒng)等待鍵盤(pán)輸入,待程序員按下任何一鍵,系統(tǒng)先檢查是否Ctrl-Break鍵,如果是則退出,否則將鍵入字符的ASCII碼置入AL寄存器中,并在屏幕上顯示該字符。注意:區(qū)分1、7和8號(hào)功能單字符輸入例GET_KEY:MOV AH,1 INT 21H

CMP AL,’Y’ JZ YES CMP AL,’N’ JZ NO JNZ GET_KEY

YES:┇ NO: ┇交互式應(yīng)答程序;輸入的字符在AL中當(dāng)?shù)谝弧⒍l指令執(zhí)行完時(shí),系統(tǒng)等待鍵盤(pán)按鍵。按下任一字符時(shí),AL中的內(nèi)容即為該字符的ASCII碼,同時(shí)顯示器上顯示出所按下的字符。鍵盤(pán)輸入字符串鍵盤(pán)輸入字符串——0AH號(hào)系統(tǒng)功能調(diào)用格式:

BUFDB20DB?

DB20DUP(?)

:::MOVDX,OFFSETBUFMOVAH,0AHINT21H;代碼段中0A功能調(diào)用;字符串在內(nèi)存中的存放地址在數(shù)據(jù)段中定義緩沖區(qū)輸出單字符輸出單字符—2號(hào)系統(tǒng)功能調(diào)用格式:

MOVDL,‘A’MOVAH,2INT21H說(shuō)明:執(zhí)行2號(hào)系統(tǒng)功能調(diào)用時(shí),將置入DL寄存器中的字符從屏幕上顯示輸出(或打印)。

;待輸出字符’A‘送到DL中輸出字符串輸出字符串——9號(hào)系統(tǒng)功能調(diào)用格式:

BUFDB‘goodbye$’MOVDX,OFFSETBUFMOVAH,9INT21H說(shuō)明:執(zhí)行9號(hào)系統(tǒng)功能調(diào)用時(shí),將內(nèi)存緩沖區(qū)BUF中存放的字符串送屏幕顯示輸出(或打?。?,緩沖區(qū)中的字符串必須以“$”字符作為結(jié)束標(biāo)志。待輸出字符串的偏移地址例

...BUFF2DB‘Howdoyoudo!$’...MOVDX,OFFSETBUFF2;送字符串的首地址至DXMOVAH,09H ;送功能號(hào)INT21H ;系統(tǒng)功能調(diào)用顯示字符串

執(zhí)行以上幾條指令后,屏幕上將顯示:Howdoyoudo!返回操作系統(tǒng)返回操作系統(tǒng)——4CH號(hào)系統(tǒng)功能調(diào)用格式:

MOVAH,4CHINT21H說(shuō)明:該調(diào)用沒(méi)有入口參數(shù),執(zhí)行結(jié)果是結(jié)束當(dāng)前正在執(zhí)行的程序,并返回操作系統(tǒng)。屏幕顯示操作系統(tǒng)提示符(N>),N為當(dāng)前使用驅(qū)動(dòng)器名。設(shè)置時(shí)間設(shè)置時(shí)間——2DH系統(tǒng)功能調(diào)用格式:

MOVAH,2DHINT21H說(shuō)明:如果設(shè)置成功,則將AL寄存器內(nèi)容清“0”,否則將AL寄存器置全置“1”。如當(dāng)前有效時(shí)間是8點(diǎn)15分20.5秒,應(yīng)將小時(shí)數(shù)8置入CH寄存器,分鐘數(shù)15置入CL寄存器中,秒數(shù)20置入DH寄存器中,百分之一秒數(shù)50置入DL寄存器中。

MOVCX,0815H

MOVDX,2050H

MOVAH,2DH

INT21H取得時(shí)間取得時(shí)間——2CH號(hào)系統(tǒng)功能調(diào)用格式:

MOVAH,2CHINT21H說(shuō)明:該調(diào)用沒(méi)有入口差數(shù),執(zhí)行結(jié)果是將當(dāng)前時(shí)間送入CX和DX寄存器中供使用。

從串口輸入單字符——3號(hào)系統(tǒng)功能調(diào)用格式:

MOVAH,3INT21H說(shuō)明:該調(diào)用沒(méi)有入口參數(shù),系統(tǒng)將從異步通信口串行輸入的字符置入AL寄存器中。從串口輸入單字符向串口輸出單字符向串口輸出單字符——4號(hào)系統(tǒng)功能調(diào)用格式:

MOVDL,‘$’MOVAH,4INT21H說(shuō)明:執(zhí)行結(jié)果將DL寄存器中的字符通過(guò)異步通信口串行輸出。無(wú)回顯鍵盤(pán)輸入單字符無(wú)回顯鍵盤(pán)輸入單字符——8號(hào)系統(tǒng)功能調(diào)用格式:

MOVAH,8INT21H說(shuō)明:它沒(méi)有入口參數(shù),與1號(hào)系統(tǒng)功能調(diào)用的區(qū)別僅在于鍵入的字符不送屏幕顯示。設(shè)置日期設(shè)置日期——2BH號(hào)系統(tǒng)功能調(diào)用格式:

MOVAH,2BHINT21H說(shuō)明:將年號(hào)以裝配型BCD碼形式置入CX寄存器中,將月號(hào)置入DH寄存器中,將日期置入DL寄存器中,然后調(diào)用。如果設(shè)置成功,則AL寄存器為全0,否則AL寄存器將為全1,從此以后日期會(huì)自動(dòng)修改。取得日期

取得日期——2AH號(hào)系統(tǒng)功能調(diào)用

格式:

MOVAH,2AHINT21H

說(shuō)明:該調(diào)用沒(méi)有入口參數(shù),執(zhí)行結(jié)果是將年號(hào)置入CX寄存器中,月份和日期置入DX寄存器中。直接控制臺(tái)輸入/輸出單字符直接控制臺(tái)輸入/輸出單字符——6號(hào)系統(tǒng)功能調(diào)用格式:

MOVDL,0FFHMOVAH,6INT21H無(wú)回顯直接控制臺(tái)輸入單字符無(wú)回顯直接控制臺(tái)輸入單字符——7號(hào)系統(tǒng)功能調(diào)用格式:

MOVAH,7INT21H說(shuō)明:該調(diào)用沒(méi)有入口參數(shù),系統(tǒng)等待從控制臺(tái)標(biāo)準(zhǔn)輸入設(shè)備輸入單字符后,將其ASCII碼置入AL寄存器中。復(fù)習(xí)段定義偽指令〈段名〉SEGMENT〈段名〉ENDS

段寄存器說(shuō)明偽指令

ASSUME

段寄存器:段定義名

子程序定義偽指令〈過(guò)程名〉PROC〈過(guò)程名〉ENDP

宏命令偽指令宏名MACROENDM

DOS功能調(diào)用一個(gè)完整源程序結(jié)構(gòu)例DSEGSEGMENTDATA1DB1,2,DATA2DW1234HDSEGENDSESEGSEGMENTDB20DUP(?)ESEGENDSSSEGSEGMENTSTACK‘STACK’DB200DUP(?)SSEGENDS一個(gè)完整源程序結(jié)構(gòu)例CSEGSEGMENTASSUMECS:CSEG,DS:DSEG,ES:ESEG,SS:SSEGSTART:MOVAX,DSEGMOVDS,AXMOVAX,ESEGMOVES,AXMOVAX,SSEGMOVSS,AX┇CSEGENDSENDSTART源程序代碼程序的編輯、匯編及連接過(guò)程匯編語(yǔ)言的程序一般要經(jīng)過(guò)編輯、匯編(MASM或ASM)、連接(LINK)和調(diào)試(DEBUG)這些步驟。

1.建立源程序文件

2.匯編(MASM或ASM)源程序

3.程序連接

4.執(zhí)行程序

5.調(diào)試程序匯編語(yǔ)言程序設(shè)計(jì)與執(zhí)行過(guò)程輸入?yún)R編語(yǔ)言源程序源文件.ASM匯編(編譯)目標(biāo)文件.OBJ鏈接可執(zhí)行文件.EXE調(diào)試最終程序4.4匯編語(yǔ)言程序設(shè)計(jì)設(shè)計(jì)步驟:根據(jù)實(shí)際問(wèn)題抽象出數(shù)學(xué)模型確定算法畫(huà)程序流程圖分配內(nèi)存工作單元和寄存器程序編碼調(diào)試在計(jì)算機(jī)上進(jìn)行程序設(shè)計(jì)過(guò)程D:\masm>EDIT輸入源程序D:\masm>MASM匯編D:\masm>LINK鏈接D:\masm>DEBUG調(diào)試簡(jiǎn)單程序簡(jiǎn)單程序是最簡(jiǎn)單的形式,計(jì)算機(jī)執(zhí)行程序的方式是“從頭到尾”,逐條執(zhí)行指令語(yǔ)句,直到程序結(jié)束。

例:將內(nèi)存(10050H)單元的內(nèi)容拆成兩段,每段4位,并將它們分別存入內(nèi)存(10051H)和(10052H)單元。即(10050H)單元中的低4位放入(10051H)低4位,(10050H)單元中的高4位放入(10052H)的低4位,而(10051H)和(10052H)的高4位均為零。簡(jiǎn)單程序例題

設(shè)(10050H)=7AH,程序如下:

MOVAX,1000H

MOVDS,AX

;DS=1000H

MOVSI,50H

;需拆字節(jié)7AH的地址賦給(SI)=50H

MOVAL,[SI]

;取10050H中內(nèi)容到AL中,

;(AL)=7AH

ANDAL,0FH

;把AL中的前4位清0,

;(AL)=0AH

01111010AND0000111100001010簡(jiǎn)單程序例題

MOV[SI+1],AL

;把OAH→(10051H)單元

MOVAL,[SI]

;把10050H內(nèi)容到AL中,

;(AL)=7AH

MOVCL,4

SHRAL,CL

;邏輯右移四次,前4位補(bǔ)0,

;AL=(07H)

MOV[SI+2],AL

;放入(10052H)單元例題:內(nèi)存自TABLE開(kāi)始的連續(xù)16個(gè)單元中存放著0-15的平方值,查表求DATA中任意數(shù)X(0≤X≤15)的平方值,并將結(jié)果放在RESULT中。

DATA1SEGMENTTABLEDB0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225DATADB10RESULTDB?DATA1ENDS

STACSEGMENTDB100DUP(?)STACENDS

CODESEGMENT

ASSUMEDS:DATA1,SS:STAC,CS:CODESR:MOVAX,DATA1

MOVDS,AX

MOVAX,STACMOVSS,AXLEABX,TABLEMOVAH,0MOVAL,DATAXLATMOVRESULT,AL

MOVAH,4CHINT21H

CODEENDS

ENDSR

;ADDBX,AL;MOVAL,[BX]分支程序

分支程序是利用條件指令,使程序執(zhí)行到某一指令后,根據(jù)條件是否滿(mǎn)足,來(lái)改變程序執(zhí)行的次序。這類(lèi)程序使計(jì)算機(jī)有了判斷作用。分支程序例題1例1:求AX累加器和BX寄存器中兩個(gè)無(wú)符號(hào)數(shù)之差的絕對(duì)值,結(jié)果放在內(nèi)存(2800)單元中。否是分支程序例題1

CLC

;清除CF

CMP

AX,

BX

;AX-BX≥0?

JC

AA

;CF=1,轉(zhuǎn)AA執(zhí)行

SUB

AX,

BX

;AX←AX-BX

MOV

DI,

2800H

;結(jié)果指針DI=2800H

MOV[DI],AX

;結(jié)果送至2800,2801H單元

HLT

AA:

SUB

BX,

AX

;BX←BX-AX

MOV

DI,

2800H

MOV

[DI],

BX

HLT分支程序例題2例2:

編寫(xiě)一個(gè)程序,從外設(shè)71號(hào)中取一個(gè)數(shù)M,判斷其值是否在10H和20H之間。如果M≥20H,則送0FFH給外設(shè)73H;如果M<10H,則送00H給外設(shè)73H;如果10H≤M<20H,則送88H給外設(shè)73H。

判斷M的分支流程圖

START:IN

AL,

71H

;將71H端口的字節(jié)讀入AL

CLC

;清除CF

CMP

AL,10H

;AL與10H比較

JC

LP1

;小于10H轉(zhuǎn)至LP1

CMP

AL,20H

;AL與20H比較

JC

LP2

;10H≤AL<20H轉(zhuǎn)到LP2

MOV

BL,0FFH

;AL≥20H則0FFH→BL

LP3:

MOVAL,BL

OUT

73H,AL

;將BL內(nèi)容輸出到73H端口

HLT

;暫停

LP1:

MOV

BL,

00JMP

LP3LP2:

MOV

BL,

88HJMP

LP3例題:編寫(xiě)程序,完成符號(hào)函數(shù):假設(shè)x的值存放在DATA1中,y的值存放DATA2中。DATSEGMENTDATA1DBXDATA2DBYDATENDSCODSEGMENTASSUMECS:COD,DS:DATST:MOVAX,DATMOVDS,AX

MOVAL,DATA1CMPAL,0JGEBIG;大于等于轉(zhuǎn)BIGMOVAL,0FFH;DATA2中置-1MOVDATA2,ALJMPAABIG:JEEQUAL;ZF=1,轉(zhuǎn)EQUALMOVAL,1;DATA2中置+1MOVDATA2,ALJMPAAEQUAL:MOVAL,0;DATA2中置0MOVDATA2,ALAA:MOVAH,4CHINT21HCODENDSENDST循環(huán)程序循環(huán)程序是強(qiáng)制CPU重復(fù)執(zhí)行某一指令系列的一種程序結(jié)構(gòu)形式,凡是要重復(fù)執(zhí)行的程序段都可以按循環(huán)結(jié)構(gòu)設(shè)計(jì)。循環(huán)結(jié)構(gòu)程序簡(jiǎn)化了程序執(zhí)行過(guò)程。相反,增加了一些循環(huán)控制等環(huán)節(jié),總的程序執(zhí)行語(yǔ)句和時(shí)間會(huì)有所增加。循環(huán)程序的組成:

循環(huán)程序的組成可分為初始化、循環(huán)化、循環(huán)控制和循環(huán)結(jié)束處理。循環(huán)程序(1)初始化:完成建立循環(huán)次數(shù)計(jì)數(shù)器,設(shè)定變量和存放數(shù)據(jù)的內(nèi)存地址指針的初值,裝入暫存單元的初值等。(2)循環(huán)體:是程序的處理部分(3)循環(huán)控制:包括修改指針、修改變量為下一次循環(huán)作準(zhǔn)備,以及修改循環(huán)計(jì)數(shù)器,判斷循環(huán)次數(shù)完成否。(4)結(jié)束處理:主要用來(lái)分析和存放程序的結(jié)果。循環(huán)程序基本結(jié)構(gòu)框圖循環(huán)程序例題1例1:要求將DATA1:0000地址開(kāi)始的100個(gè)數(shù)據(jù)送到DATA2:0000開(kāi)始的單元中去

MOV

AX,

DATA1

MOV

DS,

AX

;設(shè)置源操作數(shù)段首地址

MOV

AX,

DATA2

MOV

ES,

AX

;設(shè)置目的操作數(shù)段首的地址

MOV

SI,

0

;源操作數(shù)偏移地址送至SI

MOV

DI,

0

;目的操作數(shù)偏移地址送至DI

MOV

CX,

0100

;傳送的字節(jié)數(shù)送CX寄存器循環(huán)程序例題1

CLD

;使DF=0指針按增量方向修改

NEXT:MOVSB

;將源地址的1個(gè)字節(jié)送到目的地址單元

DEC

CX

;字節(jié)數(shù)減1

JNZ

NEXT

;100H字節(jié)如未傳送完,則繼續(xù)傳送

其中NEXT:MOVSBDECCXJNZNEXT

可用一條語(yǔ)句REPMOVSB

代替循環(huán)程序例題2例2:在一串?dāng)?shù)中找出最大值和最小值,并將最大值和最小值放在指定的存儲(chǔ)單元中。程序流程圖循環(huán)程序例2程序體

DATA

SEGMENTBUFFER

DW

X1,X2,…XnCOUNT

EQU($-BUFFER)/2MAX

DW?MIN

DW?DATA

ENDSPROG

SEGMENTASSUME

CS:PROG,

DS:DATASEARCH

PROG

FARSTART:

MOV

AX,

DATAMOV

DS,

AX循環(huán)程序例2程序體MOV

CX,

COUNTLEA

BX,

BUFFERMOV

AX,

[BX]MOV

DX,

[BX]DEC

CXLP:INC

BXINC

BXCMP

AX,

[BX]JGE

NEXT1MOV

AX,

[BX]JMPNEXT2

NEXT1:

CMP

DX,

[BX]JL

NEXT2MOV

DX,

[BX]NEXT2:

LOOP

LPMOV

MAX,

AXMOV

MIN,

DXMOV

AH,4CHINT

21H

SEARCH

ENDPPROG

ENDSEND

START子程序

子程序相對(duì)主程序而定,是一個(gè)子的程序段,確切地說(shuō),它是被父程序調(diào)用的程序。一般子程序具有公用性,重復(fù)性或有相對(duì)獨(dú)立性的特點(diǎn)?!匆弧底映绦虻恼{(diào)用與返回

子程序的調(diào)用與返回由CALL和RET指令實(shí)現(xiàn)。子程序的調(diào)用實(shí)際上是程序的轉(zhuǎn)移,但它與轉(zhuǎn)移指令有所不同,轉(zhuǎn)子指令CALL執(zhí)行時(shí)要保護(hù)返回地址,而轉(zhuǎn)移指令不考慮返回問(wèn)題。每個(gè)子程序都有RET指令負(fù)責(zé)把壓入棧后的返回地址彈出送IP或CS和IP(段間返回)實(shí)現(xiàn)程序返回。子程序〈二〉子程序設(shè)計(jì)與應(yīng)用應(yīng)該注意的問(wèn)題(1)現(xiàn)場(chǎng)保護(hù)與恢復(fù)

子程序使用時(shí),要注意寄存器內(nèi)容的保護(hù)。由于CPU的寄存器的數(shù)量有限,子程序使用的寄存器往往會(huì)和調(diào)用的寄存器發(fā)生沖突,破壞了調(diào)用程序中寄存器的內(nèi)容,影響了子程序返回后的繼續(xù)處理。為了避免這種現(xiàn)象,在子程序入口處把所用寄存器的內(nèi)容投入堆棧,保護(hù)起來(lái),而在退出子程序前恢復(fù)寄存器的內(nèi)容是必要的?;謴?fù)現(xiàn)場(chǎng)是保護(hù)現(xiàn)場(chǎng)的逆操作。當(dāng)用棧區(qū)保護(hù)現(xiàn)場(chǎng)時(shí),應(yīng)注意恢復(fù)現(xiàn)場(chǎng)的順序。子程序

(2)參數(shù)傳遞

指主程序與子程序之間相關(guān)信息或數(shù)據(jù)的傳遞。參數(shù)傳遞方式有寄存器傳遞,用內(nèi)存單元傳遞或用棧區(qū)傳遞(寄存器、變量、地址表、堆棧等)。(3)子程序說(shuō)明

由于子程序有共享性,可被其它程序調(diào)用,因此,每個(gè)子程序應(yīng)有必要的使用注釋。主要包括:〈1〉子程序名;〈2〉功能、技術(shù)指標(biāo);〈3〉占用寄存器和存儲(chǔ)單元;〈4〉入口、出口參數(shù);〈5〉嵌套哪些子程序子程序〈三〉子程序調(diào)用技巧常用技巧(1)子程序嵌套子程序調(diào)用子程序的過(guò)程。(2)子程序遞歸子程序調(diào)用自身的過(guò)程。(3)可重入子程序子程序被調(diào)用后沒(méi)有執(zhí)行完又被另一程序重復(fù)調(diào)用。(4)協(xié)同子程序兩個(gè)以上子程序協(xié)同完成一項(xiàng)任務(wù),且又相互調(diào)用,直到任務(wù)完成。子程序例題

例:數(shù)組求和子程序。假設(shè)有一數(shù)組求和子程序SUM,試用這個(gè)子程序分別求出ARY1和ARY2兩個(gè)數(shù)組和,結(jié)果分別存入SUM1和SUM2字單元中。

DATASEGMENTARY1DB03H,07H,50H,06H,23H,45H,0F6H,0DFHLEN1EQU$-ARY1SUM1DW?ARY2DB33H,44H,55H,12H,78H,89H,0FFH,0CDHL

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論