版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、返回主目錄返回主目錄 通過前面的學(xué)習(xí)我們知道,計(jì)算機(jī)之所以能夠自動地通過前面的學(xué)習(xí)我們知道,計(jì)算機(jī)之所以能夠自動地工作,是因?yàn)橛?jì)算機(jī)能按照程序的安排執(zhí)行相應(yīng)的指令,工作,是因?yàn)橛?jì)算機(jī)能按照程序的安排執(zhí)行相應(yīng)的指令,編寫這些程序的語言就稱為計(jì)算機(jī)語言。計(jì)算機(jī)語言按照編寫這些程序的語言就稱為計(jì)算機(jī)語言。計(jì)算機(jī)語言按照人類的語言習(xí)慣通常分為高級語言、中級語言和低級語言,人類的語言習(xí)慣通常分為高級語言、中級語言和低級語言,與人類自然語言相差較大、接近于機(jī)器描述的計(jì)算機(jī)語言與人類自然語言相差較大、接近于機(jī)器描述的計(jì)算機(jī)語言稱為低級語言,低級語言包括機(jī)器語言和匯編語言。本章稱為低級語言,低級語言包括機(jī)器語
2、言和匯編語言。本章主要介紹和計(jì)算機(jī)硬件系統(tǒng)緊密相關(guān)的匯編語言程序設(shè)計(jì)。主要介紹和計(jì)算機(jī)硬件系統(tǒng)緊密相關(guān)的匯編語言程序設(shè)計(jì)。5.1匯編語言基礎(chǔ)5.2匯編語言程序結(jié)構(gòu)5.3匯編語言程序設(shè)計(jì)小結(jié)第第5 5章章 匯編語言程序設(shè)計(jì)基礎(chǔ)匯編語言程序設(shè)計(jì)基礎(chǔ) 在計(jì)算機(jī)內(nèi)部,控制計(jì)算機(jī)工作的指令都以二進(jìn)制代在計(jì)算機(jī)內(nèi)部,控制計(jì)算機(jī)工作的指令都以二進(jìn)制代碼的形式出現(xiàn),這樣的指令稱為機(jī)器指令碼的形式出現(xiàn),這樣的指令稱為機(jī)器指令,用機(jī)器指令編用機(jī)器指令編寫的程序稱為機(jī)器語言程序?qū)懙某绦蚍Q為機(jī)器語言程序??梢姡???梢姡瑱C(jī)器語言是二進(jìn)制編機(jī)器語言是二進(jìn)制編碼表示的命令和數(shù)據(jù)的總稱碼表示的命令和數(shù)據(jù)的總稱,是面向機(jī)器的,
3、能夠被計(jì)算,是面向機(jī)器的,能夠被計(jì)算機(jī)直接識別和執(zhí)行的。然而,二進(jìn)制表述的機(jī)器語言既不機(jī)直接識別和執(zhí)行的。然而,二進(jìn)制表述的機(jī)器語言既不直觀,又不便于記憶、閱讀和書寫,為了程序設(shè)計(jì)的方便,直觀,又不便于記憶、閱讀和書寫,為了程序設(shè)計(jì)的方便,產(chǎn)生了匯編語言。匯編語言是一種符號語言,用與操作功產(chǎn)生了匯編語言。匯編語言是一種符號語言,用與操作功能含義相應(yīng)的縮寫英文字符組成的助記符號作為編程使用能含義相應(yīng)的縮寫英文字符組成的助記符號作為編程使用的語言,來表示二進(jìn)制格式的指令代碼和變量地址。計(jì)算的語言,來表示二進(jìn)制格式的指令代碼和變量地址。計(jì)算機(jī)在運(yùn)行匯編語言程序之前要先將其轉(zhuǎn)換成機(jī)器代碼,才機(jī)在運(yùn)行匯
4、編語言程序之前要先將其轉(zhuǎn)換成機(jī)器代碼,才能由計(jì)算機(jī)識別執(zhí)行,轉(zhuǎn)換的過程是由編譯程序來完成。能由計(jì)算機(jī)識別執(zhí)行,轉(zhuǎn)換的過程是由編譯程序來完成。5.1 5.1 匯編語言基礎(chǔ)匯編語言基礎(chǔ)5.1.1 匯編語言概述匯編語言概述 在匯編語言中,符號指令和機(jī)器指令通常是一一對應(yīng)在匯編語言中,符號指令和機(jī)器指令通常是一一對應(yīng)的,匯編語言與機(jī)器語言相比編程簡單、便于交流,并且的,匯編語言與機(jī)器語言相比編程簡單、便于交流,并且保留了機(jī)器語言與硬件系統(tǒng)聯(lián)系密切的特點(diǎn),所以,匯編保留了機(jī)器語言與硬件系統(tǒng)聯(lián)系密切的特點(diǎn),所以,匯編語言仍然是面向機(jī)器的語言,在使用匯編語言時必須對相語言仍然是面向機(jī)器的語言,在使用匯編語言
5、時必須對相應(yīng)的計(jì)算機(jī)硬件有一定了解,應(yīng)的計(jì)算機(jī)硬件有一定了解,CPU不同的計(jì)算機(jī),匯編語不同的計(jì)算機(jī),匯編語言也不同。由于機(jī)器不能直接執(zhí)行匯編語言源程序,所以言也不同。由于機(jī)器不能直接執(zhí)行匯編語言源程序,所以必須先將源程序轉(zhuǎn)換成二進(jìn)制代碼表示的機(jī)器指令,完成必須先將源程序轉(zhuǎn)換成二進(jìn)制代碼表示的機(jī)器指令,完成這一功能的軟件就是匯編程序,在這一功能的軟件就是匯編程序,在IBM - PC微型計(jì)算機(jī)系微型計(jì)算機(jī)系統(tǒng)中,目前廣泛使用的匯編程序是由統(tǒng)中,目前廣泛使用的匯編程序是由Microsoft公司開發(fā)的公司開發(fā)的宏匯編程序宏匯編程序 MASM。 用匯編語言設(shè)計(jì)的程序能夠充分利用硬件系統(tǒng)的功能用匯編語言
6、設(shè)計(jì)的程序能夠充分利用硬件系統(tǒng)的功能和結(jié)構(gòu)特性,有效地加快程序的執(zhí)行速度;直接對寄存器、和結(jié)構(gòu)特性,有效地加快程序的執(zhí)行速度;直接對寄存器、存儲器和存儲器和I/O端口進(jìn)行操作,減少程序占用的存儲空間。但端口進(jìn)行操作,減少程序占用的存儲空間。但是,由于匯編語言對于數(shù)學(xué)模型中的關(guān)系表示不夠直觀,是,由于匯編語言對于數(shù)學(xué)模型中的關(guān)系表示不夠直觀,使得在一些復(fù)雜計(jì)算程序設(shè)計(jì)中,設(shè)計(jì)匯編語言程序要花使得在一些復(fù)雜計(jì)算程序設(shè)計(jì)中,設(shè)計(jì)匯編語言程序要花費(fèi)較多的時間,編程上有一定難度。另外,由于是面向機(jī)費(fèi)較多的時間,編程上有一定難度。另外,由于是面向機(jī)器的語言,所以要求程序設(shè)計(jì)人員必須具備一定的計(jì)算機(jī)器的語言
7、,所以要求程序設(shè)計(jì)人員必須具備一定的計(jì)算機(jī)硬件知識。硬件知識。 同其它語言一樣,匯編語言的基本組成單位是語句,同其它語言一樣,匯編語言的基本組成單位是語句,在匯編語言源程序中每個語句由四項(xiàng)組成,其格式如下:在匯編語言源程序中每個語句由四項(xiàng)組成,其格式如下: 標(biāo)號:標(biāo)號: 操作項(xiàng)操作項(xiàng) 操作數(shù)操作數(shù) ;注釋;注釋其中,操作項(xiàng)是必不可少的。其中,操作項(xiàng)是必不可少的。5.1.2 匯編語言語句格式匯編語言語句格式 標(biāo)號是一個可選字段,由字母標(biāo)號是一個可選字段,由字母(A Z、a z)數(shù)字?jǐn)?shù)字(0 9)及專用字符及專用字符(?、.、-、$)組成的字符串,組成的字符串,最長不超過最長不超過31個字符,要求
8、必須以字母開頭,用冒號與操個字符,要求必須以字母開頭,用冒號與操作項(xiàng)分開。標(biāo)號實(shí)質(zhì)上是指令的符號地址,但并不是所有作項(xiàng)分開。標(biāo)號實(shí)質(zhì)上是指令的符號地址,但并不是所有指令語句都有標(biāo)號。如果指令語句前有標(biāo)號,則程序的其指令語句都有標(biāo)號。如果指令語句前有標(biāo)號,則程序的其他部分可以引用這個標(biāo)號,如程序中的他部分可以引用這個標(biāo)號,如程序中的JMP指令和指令和CALL指令的轉(zhuǎn)移目標(biāo)由標(biāo)號指定,即指令的轉(zhuǎn)移目標(biāo)由標(biāo)號指定,即JMP指令和指令和CALL指令是指令是根據(jù)標(biāo)號來確定它們之后要執(zhí)行的語句,可見標(biāo)號其實(shí)是根據(jù)標(biāo)號來確定它們之后要執(zhí)行的語句,可見標(biāo)號其實(shí)是指定了具體的指令地址,所以相同的標(biāo)號定義在同一程
9、序指定了具體的指令地址,所以相同的標(biāo)號定義在同一程序中只允許出現(xiàn)一次。中只允許出現(xiàn)一次。 1、標(biāo)號字段、標(biāo)號字段 標(biāo)號有三種屬性:標(biāo)號有三種屬性:段、偏移量和類型段、偏移量和類型。標(biāo)號的段屬性。標(biāo)號的段屬性是定義標(biāo)號的程序段的段基值;標(biāo)號的偏移量屬性是表示是定義標(biāo)號的程序段的段基值;標(biāo)號的偏移量屬性是表示該標(biāo)號在段內(nèi)的偏移地址,偏移量是一個該標(biāo)號在段內(nèi)的偏移地址,偏移量是一個16位的無符號數(shù);位的無符號數(shù);標(biāo)號的類型屬性有標(biāo)號的類型屬性有NEAR和和FAR兩種,兩種,NEAR只能提供同只能提供同一段內(nèi)的指令調(diào)用,一段內(nèi)的指令調(diào)用,F(xiàn)AR可以被其他段指令調(diào)用??梢员黄渌沃噶钫{(diào)用。 操作項(xiàng)是匯編
10、語言程序中不可省略的主要部分,用指令操作項(xiàng)是匯編語言程序中不可省略的主要部分,用指令助記符或定義符表示的機(jī)器指令操作碼,如:助記符或定義符表示的機(jī)器指令操作碼,如:MOV、ADD等,它告訴等,它告訴CPU要完成什么具體操作。有的操作項(xiàng)帶有前要完成什么具體操作。有的操作項(xiàng)帶有前綴,指令系統(tǒng)中允許與指令助記符一起出現(xiàn)的前綴是前綴指綴,指令系統(tǒng)中允許與指令助記符一起出現(xiàn)的前綴是前綴指令和段超越前綴。令和段超越前綴。2、操作項(xiàng)字段、操作項(xiàng)字段 操作數(shù)緊跟在操作項(xiàng)之后,具體指明操作項(xiàng)的指令對哪操作數(shù)緊跟在操作項(xiàng)之后,具體指明操作項(xiàng)的指令對哪些變量或常數(shù)進(jìn)行操作,它可以包含兩個操作數(shù)、一個操作些變量或常數(shù)
11、進(jìn)行操作,它可以包含兩個操作數(shù)、一個操作數(shù)或無操作數(shù)。如:數(shù)或無操作數(shù)。如:MOV、ADD等指令要求有兩個操作數(shù),等指令要求有兩個操作數(shù),它們之間用逗號隔開;它們之間用逗號隔開;NEG、INC等指令只需要一個操作數(shù);等指令只需要一個操作數(shù);而而CLC等指令就不需要操作數(shù),因?yàn)椴僮鲾?shù)已隱含在指令助等指令就不需要操作數(shù),因?yàn)椴僮鲾?shù)已隱含在指令助記符中了。操作數(shù)可以是數(shù)據(jù),也可以是存放數(shù)據(jù)的地址,記符中了。操作數(shù)可以是數(shù)據(jù),也可以是存放數(shù)據(jù)的地址,所以可以作為操作數(shù)的有:常量、變量、表達(dá)式、寄存器和所以可以作為操作數(shù)的有:常量、變量、表達(dá)式、寄存器和標(biāo)號。標(biāo)號。3、操作數(shù)字段、操作數(shù)字段 常量常量
12、常量是指令中的固定值,它們在程序運(yùn)常量是指令中的固定值,它們在程序運(yùn)行期間不發(fā)生變化,它可以分為數(shù)值常量和字符串常量。行期間不發(fā)生變化,它可以分為數(shù)值常量和字符串常量。例如:立即數(shù)尋址時的立即數(shù);直接尋址時的地址;例如:立即數(shù)尋址時的立即數(shù);直接尋址時的地址;ASCII碼字符串等都屬于常量。在匯編語言源程序中,數(shù)碼字符串等都屬于常量。在匯編語言源程序中,數(shù)值常量可以用二進(jìn)制數(shù)、八進(jìn)制數(shù)、十進(jìn)制數(shù)和十六進(jìn)制值常量可以用二進(jìn)制數(shù)、八進(jìn)制數(shù)、十進(jìn)制數(shù)和十六進(jìn)制數(shù)來表示,但要用不同的后綴加以區(qū)別。要注意的是,匯數(shù)來表示,但要用不同的后綴加以區(qū)別。要注意的是,匯編語言要求數(shù)值常量的第一位必須是數(shù)字,如:
13、編語言要求數(shù)值常量的第一位必須是數(shù)字,如:FFFFH應(yīng)應(yīng)寫成寫成0FFFFH,否則匯編時會被誤作為標(biāo)號處理。,否則匯編時會被誤作為標(biāo)號處理。 變量變量 變量是指存放在存儲器或寄存器中的數(shù)變量是指存放在存儲器或寄存器中的數(shù)據(jù),這些數(shù)據(jù)隨著程序運(yùn)行可能隨時會發(fā)生變化。寄存器據(jù),這些數(shù)據(jù)隨著程序運(yùn)行可能隨時會發(fā)生變化。寄存器有固定的名字,如:有固定的名字,如:AL、AX等;存儲器常以其地址或地等;存儲器常以其地址或地址表達(dá)式的形式出現(xiàn)。應(yīng)該指出,變量也有段、偏移量和址表達(dá)式的形式出現(xiàn)。應(yīng)該指出,變量也有段、偏移量和類型三個屬性。類型三個屬性。 表達(dá)式表達(dá)式 表達(dá)式是操作數(shù)最常見的形式,其值表達(dá)式是操
14、作數(shù)最常見的形式,其值由常數(shù)、變量、標(biāo)號通過運(yùn)算符連接,在匯編時計(jì)算確定。由常數(shù)、變量、標(biāo)號通過運(yùn)算符連接,在匯編時計(jì)算確定。匯編語言中運(yùn)算符分為:算術(shù)運(yùn)算符、邏輯運(yùn)算符、關(guān)系匯編語言中運(yùn)算符分為:算術(shù)運(yùn)算符、邏輯運(yùn)算符、關(guān)系運(yùn)算符、分析運(yùn)算符和屬性修改運(yùn)算符等。運(yùn)算符、分析運(yùn)算符和屬性修改運(yùn)算符等。 算術(shù)運(yùn)算符:算術(shù)運(yùn)算符:常用的算術(shù)運(yùn)算符有:加常用的算術(shù)運(yùn)算符有:加(+)、減減(-)、乘乘()、除除(/)和模和模(MOD)等等,算術(shù)運(yùn)算的,算術(shù)運(yùn)算的結(jié)果是一個數(shù)值,對于表示存儲器地址的地址表達(dá)式加和結(jié)果是一個數(shù)值,對于表示存儲器地址的地址表達(dá)式加和減運(yùn)算才有意義。減運(yùn)算才有意義。例如:例如
15、: MOV AX,VARX+2 表示將表示將VARX表示的地址加表示的地址加2后對應(yīng)的存儲單元內(nèi)的數(shù)后對應(yīng)的存儲單元內(nèi)的數(shù)據(jù)送據(jù)送AX。 邏輯運(yùn)算符:邏輯運(yùn)算符:邏輯運(yùn)算符包括:邏輯運(yùn)算符包括:AND(邏輯(邏輯“與與”)、)、OR(邏輯(邏輯“或或”)、)、XOR(邏輯(邏輯“異或異或”)、)、NOT(邏輯(邏輯“非非”),用于數(shù)值表達(dá)式中對數(shù)值進(jìn)行按位邏),用于數(shù)值表達(dá)式中對數(shù)值進(jìn)行按位邏輯運(yùn)算,結(jié)果也是一個數(shù)值。輯運(yùn)算,結(jié)果也是一個數(shù)值。例如:例如: MOV AL,0FH AND 35H 表示將表示將0FH與與35H按位邏輯按位邏輯“與與”后得到的數(shù)值(后得到的數(shù)值(05H)送送AL。
16、注意:注意:邏輯運(yùn)算符邏輯運(yùn)算符AND、OR、XOR、NOT同時也是指同時也是指令助記符,作為運(yùn)算符時在程序匯編時用作計(jì)算;作為指令令助記符,作為運(yùn)算符時在程序匯編時用作計(jì)算;作為指令助記符時是在程序執(zhí)行時用作計(jì)算的。助記符時是在程序執(zhí)行時用作計(jì)算的。例如:例如: AND AX,VARTB AND 8000H 表示將表示將VARTB表示的地址與表示的地址與8000H按位邏輯按位邏輯“與與”后,后,對應(yīng)的存儲單元內(nèi)的數(shù)據(jù)再與對應(yīng)的存儲單元內(nèi)的數(shù)據(jù)再與AX內(nèi)的數(shù)據(jù)進(jìn)行邏輯內(nèi)的數(shù)據(jù)進(jìn)行邏輯“與與”??梢?,在匯編時計(jì)算可見,在匯編時計(jì)算VARTB AND 8000H,得到的數(shù)值作為,得到的數(shù)值作為程序
17、的一個操作數(shù);執(zhí)行程序時計(jì)算第一個程序的一個操作數(shù);執(zhí)行程序時計(jì)算第一個AND,將前面得,將前面得到的操作數(shù)與到的操作數(shù)與AX內(nèi)的數(shù)據(jù)進(jìn)行內(nèi)的數(shù)據(jù)進(jìn)行“與與”運(yùn)算,結(jié)果送運(yùn)算,結(jié)果送AX。 關(guān)系運(yùn)算符:關(guān)關(guān)系運(yùn)算符:關(guān)系運(yùn)算符有系運(yùn)算符有EQ(等于等于)、NE(不等于不等于)、LT(小于小于)、GT(大于大于)、LE(小于等于小于等于)、GE(大于等于)。(大于等于)。關(guān)系運(yùn)算符必須有兩個操作數(shù),而且必須是兩個數(shù)值或是關(guān)系運(yùn)算符必須有兩個操作數(shù),而且必須是兩個數(shù)值或是同一段內(nèi)的存儲單元地址。關(guān)系運(yùn)算符只能有兩個結(jié)果同一段內(nèi)的存儲單元地址。關(guān)系運(yùn)算符只能有兩個結(jié)果“0”或或“1”,關(guān)系成立時運(yùn)算
18、結(jié)果為,關(guān)系成立時運(yùn)算結(jié)果為0FFFFH,關(guān)系不成,關(guān)系不成立時運(yùn)算結(jié)果為立時運(yùn)算結(jié)果為0。要注意的是,關(guān)系運(yùn)算符一般不單獨(dú)。要注意的是,關(guān)系運(yùn)算符一般不單獨(dú)使用,常與其他運(yùn)算符結(jié)合起來使用。使用,常與其他運(yùn)算符結(jié)合起來使用。例如:例如: MOV AX, 4 NE 3 表示將表示將4和和3進(jìn)行是否不相等的判斷,結(jié)果送進(jìn)行是否不相等的判斷,結(jié)果送AX。這里。這里由于由于4不等于不等于3,所以該關(guān)系運(yùn)算結(jié)果應(yīng)為,所以該關(guān)系運(yùn)算結(jié)果應(yīng)為0FFFFH,并送,并送寄存器寄存器AX。 分析操作符:分析操作符:分析操作符包括分析操作符包括OFFSET、SEG、TYPE、SIZE和和LENGTH,它們的作用是
19、把一個存儲單元地,它們的作用是把一個存儲單元地址分解為段地址和偏移地址。址分解為段地址和偏移地址。 1)OFFSET 表示取標(biāo)號或變量地址的偏移量,例如:表示取標(biāo)號或變量地址的偏移量,例如: MOV DX,OFFSET STRING 表示將表示將STRING的偏移地址送的偏移地址送DX寄存器,屬于立即數(shù)尋寄存器,屬于立即數(shù)尋址方式。址方式。 2)SEG 表示取標(biāo)號或變量的段地址。例如:表示取標(biāo)號或變量的段地址。例如: MOV BX,SEG TABLE1 表示將表示將TABLE1的段地址送的段地址送BX寄存器。寄存器。 3)TYPE 運(yùn)算結(jié)果是一個數(shù)值,表示存儲單元操作數(shù)運(yùn)算結(jié)果是一個數(shù)值,表示
20、存儲單元操作數(shù)的類型。運(yùn)算結(jié)果與操作數(shù)類型的對應(yīng)關(guān)系見表的類型。運(yùn)算結(jié)果與操作數(shù)類型的對應(yīng)關(guān)系見表51。 例如:例如: VAR DW 1234H ARRAY DB 56H MOV AX,TYPE VAR MOV BX,TYPE ARRAY 上例中前兩句偽指令定義了變量上例中前兩句偽指令定義了變量VAR的類型為字,變的類型為字,變量量ARRAY的類型為字節(jié),后兩句將的類型為字節(jié),后兩句將VAR、ARRAY的類型的類型對應(yīng)數(shù)值送寄存器對應(yīng)數(shù)值送寄存器AX、BX,即執(zhí)行,即執(zhí)行TYPE后后AX的值應(yīng)為的值應(yīng)為2,BX的值應(yīng)為的值應(yīng)為1。表表51 TYPE運(yùn)算結(jié)果與操作數(shù)類型的對應(yīng)關(guān)系運(yùn)算結(jié)果與操作數(shù)
21、類型的對應(yīng)關(guān)系 4) LENGTH 一般加在數(shù)組變量的前面,作用是計(jì)一般加在數(shù)組變量的前面,作用是計(jì)算數(shù)組變量占存儲單元的個數(shù)。若使用算數(shù)組變量占存儲單元的個數(shù)。若使用DUP,則執(zhí)行結(jié)果,則執(zhí)行結(jié)果是外層是外層DUP的給定值;若沒有使用的給定值;若沒有使用DUP,則執(zhí)行結(jié)果為,則執(zhí)行結(jié)果為1。例如:例如: D1 DB 10 DUP ( 0FH ) D2 DB ABCDEFGHIJK MOV BH,LENGTH D1 MOV BL,LENGTH D2 前兩句偽指令定義變量前兩句偽指令定義變量D1、D2的類型為字節(jié),重復(fù)的類型為字節(jié),重復(fù)操作符操作符DUP表示從表示從D1開始連續(xù)設(shè)定開始連續(xù)設(shè)定1
22、0個字節(jié)的空間,且個字節(jié)的空間,且將內(nèi)容設(shè)定為將內(nèi)容設(shè)定為0FH。后兩句執(zhí)行了。后兩句執(zhí)行了LENGTH運(yùn)算后,結(jié)果運(yùn)算后,結(jié)果分別為分別為10和和1,即執(zhí)行,即執(zhí)行LENGTH后將后將10送送BH,將將1送送BL。 屬性修改運(yùn)算符屬性修改運(yùn)算符:屬性修改運(yùn)算符有屬性修改運(yùn)算符有PTR、THIS和和STORT,用于指定或修改變量、標(biāo)號和存儲器操作數(shù)的,用于指定或修改變量、標(biāo)號和存儲器操作數(shù)的類型屬性,也稱綜合運(yùn)算符。類型屬性,也稱綜合運(yùn)算符。 1)PTR 用于指定或修改存儲單元操作數(shù)的類型。用于指定或修改存儲單元操作數(shù)的類型。例如:例如: MOV WORD PTR 5000H, 8 執(zhí)行執(zhí)行P
23、TR后指定存儲單元后指定存儲單元5000H為一個字單元,上面為一個字單元,上面的語句是將數(shù)值的語句是將數(shù)值8送地址為送地址為5000H的存儲單元,存儲單元的存儲單元,存儲單元類型為字,因此執(zhí)行語句后,類型為字,因此執(zhí)行語句后,5000H存儲單元的內(nèi)容為存儲單元的內(nèi)容為08H,5001H存儲單元的內(nèi)容為存儲單元的內(nèi)容為00H。注意,。注意,PTR的修的修改是臨時性的,僅在本語句中有效。改是臨時性的,僅在本語句中有效。 2)THIS 也是用來指定或修改存儲單元的類型。也是用來指定或修改存儲單元的類型。與與PTR不同的是,該運(yùn)算建立指定類型的地址操作數(shù),不同的是,該運(yùn)算建立指定類型的地址操作數(shù),其段
24、地址和偏移量與下一個存儲單元地址相同,因此其段地址和偏移量與下一個存儲單元地址相同,因此THIS運(yùn)算符更具有靈活性。例如:運(yùn)算符更具有靈活性。例如: BEGIN EQU THIS FAR PUSH AX 上述語句是使上述語句是使PUSH AX指令有一個具備指令有一個具備FAR屬性的屬性的地址地址BEGIN,使得標(biāo)號,使得標(biāo)號BEGIN可以被其他段的可以被其他段的JMP指令指令直接調(diào)用。直接調(diào)用。 3)SHORT 用于指定某個標(biāo)號的類型為用于指定某個標(biāo)號的類型為“短標(biāo)號短標(biāo)號”,即使當(dāng)前指令位置到指定標(biāo)號的距離在即使當(dāng)前指令位置到指定標(biāo)號的距離在128127個個字節(jié)的范圍內(nèi)字節(jié)的范圍內(nèi) 其他運(yùn)算
25、符:其他運(yùn)算符: 1)冒號冒號 一般跟在段寄存器名之后,用于給存儲單元一般跟在段寄存器名之后,用于給存儲單元操作數(shù)指定段屬性,不必考慮存儲單元原來的隱含屬性。操作數(shù)指定段屬性,不必考慮存儲單元原來的隱含屬性。例如:例如: MOV AX,ES: DI 冒號跟在段寄存器冒號跟在段寄存器ES之后,表示段寄存器的偏移地址之后,表示段寄存器的偏移地址由由DI指定。指定。 2)字節(jié)分離運(yùn)算符字節(jié)分離運(yùn)算符LOW和和HIGH 用于獲得一個數(shù)值或表用于獲得一個數(shù)值或表達(dá)式的低位或高位字節(jié)。例如:達(dá)式的低位或高位字節(jié)。例如: DATAX EQU 1234H MOV AL,LOW DATAX MOV AH,HIG
26、H DATAX 上述程序中,第一句定義上述程序中,第一句定義DATAX等于等于1234H;第二句;第二句執(zhí)行執(zhí)行LOW表示取表示取DATAX的低位,即將的低位,即將34H送送AL;第三句執(zhí);第三句執(zhí)行行HIGH表示取表示取DATAX的高位,即將的高位,即將12H送送AH。 需要注意的是:在表達(dá)式中可能出現(xiàn)各種運(yùn)算的運(yùn)算需要注意的是:在表達(dá)式中可能出現(xiàn)各種運(yùn)算的運(yùn)算符,匯編時都將運(yùn)算出它們的具體的結(jié)果,匯編程序的這符,匯編時都將運(yùn)算出它們的具體的結(jié)果,匯編程序的這個運(yùn)算過程將按照它們的優(yōu)先級別進(jìn)行運(yùn)算,運(yùn)算規(guī)則是:個運(yùn)算過程將按照它們的優(yōu)先級別進(jìn)行運(yùn)算,運(yùn)算規(guī)則是: 先執(zhí)行優(yōu)先級別高的運(yùn)算;先執(zhí)
27、行優(yōu)先級別高的運(yùn)算; 優(yōu)先級別相同的運(yùn)算,按從左到右的順序進(jìn)行;優(yōu)先級別相同的運(yùn)算,按從左到右的順序進(jìn)行; 可以使用各種括號改變運(yùn)算順序??梢允褂酶鞣N括號改變運(yùn)算順序。 各種運(yùn)算符的優(yōu)先級別見表各種運(yùn)算符的優(yōu)先級別見表52,為,為1的優(yōu)先級別最的優(yōu)先級別最高,為高,為11的優(yōu)先級別最低。的優(yōu)先級別最低。表表52 運(yùn)算符的優(yōu)先級別運(yùn)算符的優(yōu)先級別 注釋也是一個任選項(xiàng),跟在匯編語句之后,以分號注釋也是一個任選項(xiàng),跟在匯編語句之后,以分號“;”開始,注釋內(nèi)容并不出現(xiàn)在匯編后的機(jī)器代碼中,開始,注釋內(nèi)容并不出現(xiàn)在匯編后的機(jī)器代碼中,也不影響匯編程序的功能。一段完整的程序中,注釋是很也不影響匯編程序的功
28、能。一段完整的程序中,注釋是很重要的部分,它用于說明一條指令或一段程序的功能,闡重要的部分,它用于說明一條指令或一段程序的功能,闡述程序的思路,使程序容易閱讀,特別在模塊化程序設(shè)計(jì)述程序的思路,使程序容易閱讀,特別在模塊化程序設(shè)計(jì)中可通過注釋將各模塊的功能描述出來,大大加強(qiáng)了程序中可通過注釋將各模塊的功能描述出來,大大加強(qiáng)了程序的可讀性。的可讀性。4、注釋、注釋返回本章目錄返回本章目錄 匯編語言源程序采用分段式結(jié)構(gòu),一個匯編語言源程匯編語言源程序采用分段式結(jié)構(gòu),一個匯編語言源程序由若干個邏輯段組成,每個邏輯段以序由若干個邏輯段組成,每個邏輯段以SEGMENT語句開語句開始,以始,以ENDS語句
29、結(jié)束,整個源程序以語句結(jié)束,整個源程序以END語句結(jié)束。而語句結(jié)束。而邏輯段包括數(shù)據(jù)段、堆棧段、代碼段及附加段,要注意任邏輯段包括數(shù)據(jù)段、堆棧段、代碼段及附加段,要注意任何一個源程序至少必須有一個代碼段和一條作為源程序文何一個源程序至少必須有一個代碼段和一條作為源程序文件結(jié)束的偽指令件結(jié)束的偽指令END,END后面的標(biāo)號后面的標(biāo)號START表示該程表示該程序執(zhí)行時的啟動地址。下面給出一個簡單的匯編語言源程序執(zhí)行時的啟動地址。下面給出一個簡單的匯編語言源程序,以便同學(xué)對匯編語言源程序的格式結(jié)構(gòu)有一個大概的序,以便同學(xué)對匯編語言源程序的格式結(jié)構(gòu)有一個大概的了解。了解。5.2 5.2 匯編語言程序結(jié)
30、構(gòu)匯編語言程序結(jié)構(gòu)5.2.1 源程序源程序 DATA SEGMENT ;定義一個名字為;定義一個名字為DATA的段的段 HELLO DB HELLO WORLD1$ ;在;在 DATA 段內(nèi)定義一個字符串變量,并賦值段內(nèi)定義一個字符串變量,并賦值 DATA ENDS ;DATA段結(jié)束段結(jié)束 CODE SEGMENT ;定義一個名字為;定義一個名字為 CODE的程序代碼段的程序代碼段 ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX ;給;給DS賦初值賦初值 MOV DX,OFFSET HELLO ;取字符串;取字符串 變量的偏移量變量的偏移量
31、 MOV AH,9 ;置字符串顯示功能號;置字符串顯示功能號 INT 21H ;DOS功能調(diào)用功能調(diào)用 MOV DL,ODH ;送回車符;送回車符 MOV AH,2 ;置;置ASCII碼顯示功能號碼顯示功能號 INT 21H MOV DL,OAH ;送換行符;送換行符 MOV AH,2 INT 21H MOV AH,4CH INT 21H ;返回操作系統(tǒng);返回操作系統(tǒng) CODE ENDS ;代碼段結(jié)束;代碼段結(jié)束 END START ;源程序結(jié)束;源程序結(jié)束 從上面的匯編語言源程序可以看出,一個匯編語言源從上面的匯編語言源程序可以看出,一個匯編語言源程序一般總由若干段組成,這里第一段為數(shù)據(jù)段程
32、序一般總由若干段組成,這里第一段為數(shù)據(jù)段DATA,它在存儲器中存放用于顯示輸出的數(shù)據(jù);第二段為代碼段它在存儲器中存放用于顯示輸出的數(shù)據(jù);第二段為代碼段CODE,它包括了許多以符號表示的指令,用于實(shí)現(xiàn)數(shù)據(jù),它包括了許多以符號表示的指令,用于實(shí)現(xiàn)數(shù)據(jù)的輸出。的輸出。程序運(yùn)行時,在匯編語言源程序中除了執(zhí)行上一章中介紹程序運(yùn)行時,在匯編語言源程序中除了執(zhí)行上一章中介紹的指令外,還要執(zhí)行偽指令和宏指令。偽指令又稱偽操作,的指令外,還要執(zhí)行偽指令和宏指令。偽指令又稱偽操作,匯編程序?qū)υ闯绦騾R編時,偽指令本身不會產(chǎn)生可執(zhí)行的匯編程序?qū)υ闯绦騾R編時,偽指令本身不會產(chǎn)生可執(zhí)行的機(jī)器指令代碼,它僅僅是告訴匯編程序
33、有關(guān)源程序的某些機(jī)器指令代碼,它僅僅是告訴匯編程序有關(guān)源程序的某些信息,或者用來說明內(nèi)存單元的用途,即偽指令在匯編過信息,或者用來說明內(nèi)存單元的用途,即偽指令在匯編過程中是由匯編程序執(zhí)行的指令,它可以用來進(jìn)行數(shù)據(jù)定義、程中是由匯編程序執(zhí)行的指令,它可以用來進(jìn)行數(shù)據(jù)定義、符號定義、段定義、過程定義及程序命名及結(jié)束等主要操符號定義、段定義、過程定義及程序命名及結(jié)束等主要操作。作。5.2.2 偽指令偽指令 數(shù)據(jù)定義偽指令用于定義變量的類型、給存儲器賦初數(shù)據(jù)定義偽指令用于定義變量的類型、給存儲器賦初值或給變量分配存儲單元。值或給變量分配存儲單元。常用的數(shù)據(jù)定義偽指令有常用的數(shù)據(jù)定義偽指令有DB、DW、
34、DD等等。一般格式為:。一般格式為: 標(biāo)號標(biāo)號 偽指令助記符偽指令助記符 數(shù)據(jù)表達(dá)式數(shù)據(jù)表達(dá)式 方括號中的標(biāo)號為任選項(xiàng),通常使用符號地址表示。方括號中的標(biāo)號為任選項(xiàng),通常使用符號地址表示。數(shù)據(jù)表達(dá)式可以包含多個數(shù)據(jù),它們之間用逗號分隔開。數(shù)據(jù)表達(dá)式可以包含多個數(shù)據(jù),它們之間用逗號分隔開。數(shù)據(jù)定義偽指令助記符有以下三種:數(shù)據(jù)定義偽指令助記符有以下三種: DB 定義變量類型為字節(jié)定義變量類型為字節(jié)(BYTE),),DB后面的每個后面的每個操作數(shù)占一個字節(jié)單元。操作數(shù)占一個字節(jié)單元。 DW 定義變量類型為字定義變量類型為字(WORD),),DW后面的每個后面的每個操作數(shù)占一個字單元,即兩個字節(jié)單元。
35、在內(nèi)存中,低字操作數(shù)占一個字單元,即兩個字節(jié)單元。在內(nèi)存中,低字節(jié)在前,高字節(jié)在后。節(jié)在前,高字節(jié)在后。 DD 定義變量類型為雙字定義變量類型為雙字(DWORD),),DD后面的后面的每個操作數(shù)占兩個字單元,即四個字節(jié)單元。在內(nèi)存中,每個操作數(shù)占兩個字單元,即四個字節(jié)單元。在內(nèi)存中,低位字在前,高位字在后。低位字在前,高位字在后。1、數(shù)據(jù)定義偽指令、數(shù)據(jù)定義偽指令 這些數(shù)據(jù)定義偽操作可以把數(shù)據(jù)項(xiàng)存入指定的存儲單這些數(shù)據(jù)定義偽操作可以把數(shù)據(jù)項(xiàng)存入指定的存儲單元,或分配存儲單元空間。例如:元,或分配存儲單元空間。例如: R1 DB 0DH ;定義;定義R1單元的數(shù)值為單元的數(shù)值為0DH R2 DB
36、 ? ;定義;定義R2單元預(yù)留一個字節(jié)的存儲空間單元預(yù)留一個字節(jié)的存儲空間 R3 DB 1,2,3 ;定義;定義R3開始的開始的3個單元的數(shù)值為個單元的數(shù)值為 01H,02H,03H R4 DW 5 DUP (?) ;定義;定義R4預(yù)留預(yù)留5個字的存儲空間個字的存儲空間 R5 DB GOOD! ;定義;定義R5為字符串,其存儲單元為字符串,其存儲單元 數(shù)值為數(shù)值為47H,4FH,4FH,44H, ;21H 上例說明,數(shù)據(jù)表達(dá)式除了可以是二進(jìn)制、十進(jìn)制、上例說明,數(shù)據(jù)表達(dá)式除了可以是二進(jìn)制、十進(jìn)制、十六進(jìn)制的常數(shù),也可以是表達(dá)式及字符串,還可以是問十六進(jìn)制的常數(shù),也可以是表達(dá)式及字符串,還可以是
37、問號號“?”,它僅給變量保留相應(yīng)的存儲單元,而不給變量,它僅給變量保留相應(yīng)的存儲單元,而不給變量賦初值。當(dāng)相同的操作數(shù)重復(fù)出現(xiàn)或要保留多個存儲單元賦初值。當(dāng)相同的操作數(shù)重復(fù)出現(xiàn)或要保留多個存儲單元時,可用重復(fù)操作符號時,可用重復(fù)操作符號DUP表示,重復(fù)次數(shù)由表示,重復(fù)次數(shù)由DUP之前的之前的數(shù)字決定。經(jīng)過匯編偽指令,數(shù)據(jù)在存儲單元中的分配如數(shù)字決定。經(jīng)過匯編偽指令,數(shù)據(jù)在存儲單元中的分配如圖圖5-1所示。所示。R1 ODHR2 R3 01H 02H 03H R4R5 47H4FH4FH44H21H保留保留5個個字的存儲字的存儲空間,即空間,即10個字節(jié)個字節(jié)圖圖5-1 偽指令執(zhí)行后數(shù)據(jù)區(qū)的分配
38、情況偽指令執(zhí)行后數(shù)據(jù)區(qū)的分配情況 由圖由圖5-1可見,存儲單元中的數(shù)據(jù)均由可見,存儲單元中的數(shù)據(jù)均由補(bǔ)碼表示;對于多字節(jié)的數(shù)據(jù)分配,高字節(jié)補(bǔ)碼表示;對于多字節(jié)的數(shù)據(jù)分配,高字節(jié)存放在高地址單元,低字節(jié)存放在低地址單存放在高地址單元,低字節(jié)存放在低地址單元;對于字符串存儲單元存放的是相應(yīng)的元;對于字符串存儲單元存放的是相應(yīng)的ASCII碼;對于變量或標(biāo)號存儲單元存放的碼;對于變量或標(biāo)號存儲單元存放的是相應(yīng)的地址偏移量。是相應(yīng)的地址偏移量。 另外,在偽指令中還可以對重復(fù)子句進(jìn)另外,在偽指令中還可以對重復(fù)子句進(jìn)行嵌套,例如:行嵌套,例如:BUFFER DB 2,2 DUP (1,2 DUP (2,3)
39、 該偽指令匯編后的數(shù)據(jù)分配情況如圖該偽指令匯編后的數(shù)據(jù)分配情況如圖52所示。所示。03HBUFFER 02H01H02H03H02H01H02H03H02H03H圖圖5-2 偽指令執(zhí)行后偽指令執(zhí)行后數(shù)據(jù)區(qū)的分配情況數(shù)據(jù)區(qū)的分配情況 這里的符號是指這里的符號是指變量名、標(biāo)號名、過程名、指令助記符變量名、標(biāo)號名、過程名、指令助記符和寄存器名和寄存器名,符號定義偽指令用于給一個符號重新命名或定符號定義偽指令用于給一個符號重新命名或定義新的類型屬性義新的類型屬性。 (1)EQU偽指令偽指令 EQU偽指令將表達(dá)式的值賦予一個偽指令將表達(dá)式的值賦予一個名字,這是一個等值語句。定義以后可以用這個名字來代替名
40、字,這是一個等值語句。定義以后可以用這個名字來代替對應(yīng)的表達(dá)式。表達(dá)式可以是一個常數(shù)、符號、數(shù)值、表達(dá)對應(yīng)的表達(dá)式。表達(dá)式可以是一個常數(shù)、符號、數(shù)值、表達(dá)式或地址表達(dá)式,式或地址表達(dá)式,EQU偽指令的格式如下:偽指令的格式如下: 名字名字 EQU 表達(dá)式表達(dá)式2、符號定義偽指令、符號定義偽指令 EQU偽指令可以使程序更加簡練。如果源程序中需要偽指令可以使程序更加簡練。如果源程序中需要多次引用某個表達(dá)式,可以用一個比較簡短的名字通過多次引用某個表達(dá)式,可以用一個比較簡短的名字通過EQU偽指令來代表這個表達(dá)式。如果將來需要修改表達(dá)式,偽指令來代表這個表達(dá)式。如果將來需要修改表達(dá)式,只需修改只需修改
41、EQU語句中的表達(dá)式,而不必修改多處,便于程語句中的表達(dá)式,而不必修改多處,便于程序的維護(hù)。需要注意的是,序的維護(hù)。需要注意的是,EQU偽指令不允許對同一符號偽指令不允許對同一符號重復(fù)定義重復(fù)定義,即同一源程序中,用即同一源程序中,用EQU定義過的變量,不能再定義過的變量,不能再定義其他值。定義其他值。例如:例如: FIVE EQU 5 ;FIVE賦值為賦值為5 NINE EQU FIVE+4 ;NINE定義為數(shù)值表達(dá)式,其定義為數(shù)值表達(dá)式,其 值為值為9 REGS EQU SI ;指定寄存器;指定寄存器SI的名字為的名字為REGS ADDR EQU TABLE ;將標(biāo)號;將標(biāo)號TABLE賦值
42、到賦值到ADDR (2)等號等號(=)偽指令偽指令 等號等號(=)偽指令的功能與偽指令的功能與EQU偽偽 指令相仿,區(qū)別在于它可以對同一個名字重復(fù)定義。其偽指令相仿,區(qū)別在于它可以對同一個名字重復(fù)定義。其偽指令格式如下:指令格式如下: 名字名字 = 表達(dá)式表達(dá)式 利用等號利用等號(=)偽指令可以使程序設(shè)計(jì)更加靈活。偽指令可以使程序設(shè)計(jì)更加靈活。例如:例如: TABLE = 1 MOV AX,TABLE RRRR: ADD AX,1 TABLE = TABLE+1 MOV AX,TABLE CMP AX,100 JNE RRRR 上例中,標(biāo)號上例中,標(biāo)號TABLE被定義了不止一次,每循環(huán)一次它的
43、被定義了不止一次,每循環(huán)一次它的數(shù)值都會變化。數(shù)值都會變化。 段定義偽指令在匯編語言源程序中定義邏輯段,提供段定義偽指令在匯編語言源程序中定義邏輯段,提供了構(gòu)造程序的手段。常用的段定義偽指令有了構(gòu)造程序的手段。常用的段定義偽指令有ASSUME、SEGMENT和和ENDS等。等。 (1)SEGMENT和和ENDS 用用SEGMENT和和ENDS偽偽指令可以將程序分成多個段,用于定義一個邏輯段,給邏指令可以將程序分成多個段,用于定義一個邏輯段,給邏輯段賦予一個段名,并在后面的任選項(xiàng)中給出這個邏輯段輯段賦予一個段名,并在后面的任選項(xiàng)中給出這個邏輯段的其他特性,如定義類型、組合類型和類別。其偽指令格的
44、其他特性,如定義類型、組合類型和類別。其偽指令格式如下:式如下: 段名段名 SEGMENT 定位類型定位類型 組合類型組合類型 類別類別 (段定義體)(段定義體) 段名段名 ENDS3、段定義偽指令、段定義偽指令 SEGMENT偽指令定義一個邏輯段的開始,偽指令定義一個邏輯段的開始,ENDS偽偽指令則表示一個邏輯段的結(jié)束,這兩個偽指令總是成對出指令則表示一個邏輯段的結(jié)束,這兩個偽指令總是成對出現(xiàn)。前面的段名是該邏輯段的標(biāo)識符,是用來確定該邏輯現(xiàn)。前面的段名是該邏輯段的標(biāo)識符,是用來確定該邏輯段在存儲器中的首地址的,不可缺省,而且必須一致。兩段在存儲器中的首地址的,不可缺省,而且必須一致。兩個偽
45、指令語句之間的部分是邏輯段的內(nèi)容,個偽指令語句之間的部分是邏輯段的內(nèi)容,匯編語言的邏匯編語言的邏輯段包括代碼段、數(shù)據(jù)段和堆棧段等輯段包括代碼段、數(shù)據(jù)段和堆棧段等,代碼段主要包含程代碼段主要包含程序指令和某些偽指令序指令和某些偽指令;數(shù)據(jù)段用于定義數(shù)據(jù)和存儲單元;數(shù)據(jù)段用于定義數(shù)據(jù)和存儲單元;堆棧段主要為堆棧操作預(yù)留出存儲空間。堆棧段主要為堆棧操作預(yù)留出存儲空間。 SEGMENT偽指令后面可以有三個任選項(xiàng)偽指令后面可以有三個任選項(xiàng) “定位類定位類型型”、“組合類型組合類型”、“類別類別”,它們用來指示匯編程序,它們用來指示匯編程序和連接程序,如何確定段的邊界,如何進(jìn)行段的組合,以和連接程序,如何
46、確定段的邊界,如何進(jìn)行段的組合,以及控制段的裝入順序。在簡單匯編語言源程序中一般選用及控制段的裝入順序。在簡單匯編語言源程序中一般選用缺省方式,常用于多模塊的程序設(shè)計(jì)中。如果出現(xiàn),三者缺省方式,常用于多模塊的程序設(shè)計(jì)中。如果出現(xiàn),三者的順序必須符合格式中的規(guī)定,不能顛倒。的順序必須符合格式中的規(guī)定,不能顛倒。 1)定位類型:定位類型:定位類型任選項(xiàng)是告訴匯編程序如何確定位類型任選項(xiàng)是告訴匯編程序如何確定邏輯段的邊界在存儲器中的開始位置,定位類型有四種:定邏輯段的邊界在存儲器中的開始位置,定位類型有四種: BYTE:表示邏輯段邊界可以從任何一個字節(jié)開始,段:表示邏輯段邊界可以從任何一個字節(jié)開始,
47、段與段之間無空隙。這樣,該邏輯段可以緊接在前一個邏輯段與段之間無空隙。這樣,該邏輯段可以緊接在前一個邏輯段的后面。的后面。 WORD:表示邏輯段邊界從字地址開始,段與段之間:表示邏輯段邊界從字地址開始,段與段之間的空隙最多只有一個字節(jié)。這樣該邏輯段的起始地址必須是的空隙最多只有一個字節(jié)。這樣該邏輯段的起始地址必須是偶數(shù)。偶數(shù)。 PARA:表示邏輯段邊界從節(jié)地址開始,:表示邏輯段邊界從節(jié)地址開始,16個字節(jié)稱為個字節(jié)稱為一個節(jié)。段地址為一個節(jié)。段地址為16的倍數(shù),即的倍數(shù),即XXX0H,這樣段與段之間,這樣段與段之間空隙最多為空隙最多為15個字節(jié)。如果省略定位類型選項(xiàng),匯編語言個字節(jié)。如果省略定
48、位類型選項(xiàng),匯編語言程序默認(rèn)該邏輯段為程序默認(rèn)該邏輯段為PARA。 PAGE:表示邏輯段邊界地址從頁邊界開始。:表示邏輯段邊界地址從頁邊界開始。256個字個字節(jié)成為一個頁,則段地址為節(jié)成為一個頁,則段地址為256的倍數(shù),即的倍數(shù),即XX00H,這樣段,這樣段與段之間空隙最多為與段之間空隙最多為255個字節(jié)。個字節(jié)。 2)組合類型:組合類型:SEGMENT偽指令的第二個任選項(xiàng)是組偽指令的第二個任選項(xiàng)是組合類型,在滿足定位類型的前提下,它告訴連接程序,裝合類型,在滿足定位類型的前提下,它告訴連接程序,裝入存儲器時各個邏輯段如何進(jìn)行組合。組合類型有入存儲器時各個邏輯段如何進(jìn)行組合。組合類型有6種。種
49、。 NONE:此項(xiàng)為不組合,是組合類型的缺省選擇,此:此項(xiàng)為不組合,是組合類型的缺省選擇,此時連接程序認(rèn)為這個邏輯段是不組合的,即使兩個段有相時連接程序認(rèn)為這個邏輯段是不組合的,即使兩個段有相同的類別名,也作為不同的邏輯段分別裝入內(nèi)存。同的類別名,也作為不同的邏輯段分別裝入內(nèi)存。 PUBLIC:匯編程序連接時,對于不同程序模塊中的邏:匯編程序連接時,對于不同程序模塊中的邏輯段,只要具有相同的類別名,就把這些段順序連接成一輯段,只要具有相同的類別名,就把這些段順序連接成一個邏輯段裝入內(nèi)存,共用一個寄存器,所有段的偏移地址個邏輯段裝入內(nèi)存,共用一個寄存器,所有段的偏移地址都要變?yōu)橄鄳?yīng)組合段的偏移量
50、。都要變?yōu)橄鄳?yīng)組合段的偏移量。 STACK:表示該段為堆棧段的一部分,此時編譯程序:表示該段為堆棧段的一部分,此時編譯程序把所有同名段連接成一個連續(xù)的堆棧段,裝入把所有同名段連接成一個連續(xù)的堆棧段,裝入SS段寄存器,段寄存器,用段內(nèi)的最大偏移地址初始化用段內(nèi)的最大偏移地址初始化SP。 COMMON:該組合類型產(chǎn)生一個覆蓋段。模塊連接時,:該組合類型產(chǎn)生一個覆蓋段。模塊連接時,如果有相同的類別名,則都從同一個地址開始裝入,因而如果有相同的類別名,則都從同一個地址開始裝入,因而連接的邏輯段將發(fā)生覆蓋。連接以后段的長度等于原來最連接的邏輯段將發(fā)生覆蓋。連接以后段的長度等于原來最長的路段的長度,覆蓋部
51、分的內(nèi)容是最后一個邏輯段的內(nèi)長的路段的長度,覆蓋部分的內(nèi)容是最后一個邏輯段的內(nèi)容。容。 MEMORY:表示該段在存儲器中應(yīng)定位在所有其他段:表示該段在存儲器中應(yīng)定位在所有其他段的最高地址處。如果有多個段使用的最高地址處。如果有多個段使用MEMORY,則只把第一,則只把第一個遇到的段當(dāng)作個遇到的段當(dāng)作MEMORY處理,其余的段均按處理,其余的段均按PUBLIC處處理。理。 AT:表示該段定位在表達(dá)式所指示的位置上。:表示該段定位在表達(dá)式所指示的位置上。 3)類別名:類別名:類別名必須用單引號括起來,用于控制段類別名必須用單引號括起來,用于控制段的裝入順序。類別名可由程序設(shè)計(jì)人員自己選定任何字符的
52、裝入順序。類別名可由程序設(shè)計(jì)人員自己選定任何字符串組成,但它不能再作為程序的標(biāo)號,變量名或其他定義串組成,但它不能再作為程序的標(biāo)號,變量名或其他定義的符號。在連接處理時,的符號。在連接處理時,LINK程序把類別名相同的所有段程序把類別名相同的所有段存放在連續(xù)的存儲區(qū)內(nèi)。存放在連續(xù)的存儲區(qū)內(nèi)。 例如例如,下面就是一個分段結(jié)構(gòu)的源程序框架:,下面就是一個分段結(jié)構(gòu)的源程序框架: STACK1 SEGMENT PARA STACK STACK1 ; 定定 義堆棧段義堆棧段1 STACK1 ENDS DATA1 SEGMENT PARA DATA1 ;定義數(shù)據(jù)段;定義數(shù)據(jù)段1 DATA1 ENDS ST
53、ACK2 SEGMENT PARA STACK2 ;定義堆棧段;定義堆棧段2 STACK2 ENDS DATA2 SEGMENT PARA DATA2 ;定義數(shù)據(jù)段;定義數(shù)據(jù)段2 DATA2 ENDS CODE SEGMENT PARA MEMORY ;定義代碼段;定義代碼段 ASSUME CS: CODE, DS: DATA1, SS: STACK1 ; 指定段寄存器指定段寄存器 BEGIN: CODE ENDS END START (2)ASSUME 指示匯編程序指定段所使用的寄存器,指示匯編程序指定段所使用的寄存器,即將段寄存器與某個邏輯段建立起對應(yīng)關(guān)系,該偽指令即將段寄存器與某個邏輯段
54、建立起對應(yīng)關(guān)系,該偽指令不產(chǎn)生任何目標(biāo)代碼。其格式如下:不產(chǎn)生任何目標(biāo)代碼。其格式如下: ASSUNE 段寄存器名:段名段寄存器名:段名,段寄存器名:段名,段寄存器名:段名 其中段寄存器名是指四個段寄存器其中段寄存器名是指四個段寄存器CS、SS、DS、ES中的一個中的一個,但要注意,程序代碼段只能用,但要注意,程序代碼段只能用CS作寄存器,作寄存器,堆棧段只能用堆棧段只能用SS作段寄存器。段名是指邏輯段的名字。作段寄存器。段名是指邏輯段的名字。在一個源程序中,如果沒有另外的在一個源程序中,如果沒有另外的ASSUME偽指令重新偽指令重新設(shè)置,原有的設(shè)置,原有的ASSUME語句的設(shè)置一直有效。語句
55、的設(shè)置一直有效。 需要注意的是,需要注意的是,ASSUME偽指令只是告訴匯編程序偽指令只是告訴匯編程序段寄存器與邏輯段的關(guān)系,并沒有給段寄存器賦予實(shí)際段寄存器與邏輯段的關(guān)系,并沒有給段寄存器賦予實(shí)際的初值。若要給段寄存器賦值,可參考下面程序:的初值。若要給段寄存器賦值,可參考下面程序: CODE SEGMENT ;定義代碼段;定義代碼段 ASSUME CS: CODE, DS: DATA1, SS: STACK1 ;指定段寄存器;指定段寄存器 MOV AX, DATA1 MOV DS, AX ;初始化段寄存器;初始化段寄存器DS MOV AX, STACK1 MOV SS, AX ;初始化堆棧
56、段寄存器;初始化堆棧段寄存器SS CODE ENDS 過程又稱子程序,它是程序的一部分,可以被程序調(diào)用,過程又稱子程序,它是程序的一部分,可以被程序調(diào)用,當(dāng)過程中的指令執(zhí)行完后,返回程序調(diào)用點(diǎn),調(diào)用過程的指當(dāng)過程中的指令執(zhí)行完后,返回程序調(diào)用點(diǎn),調(diào)用過程的指令是令是CALL,從過程返回的指令為,從過程返回的指令為RET。程序設(shè)計(jì)中,我們常。程序設(shè)計(jì)中,我們常常把具有一定功能的程序段設(shè)計(jì)成一個子程序,匯編程序用常把具有一定功能的程序段設(shè)計(jì)成一個子程序,匯編程序用“過程過程”來構(gòu)造子程序。過程定義偽指令的格式如下:來構(gòu)造子程序。過程定義偽指令的格式如下: 過程名過程名 PROC NEAR/FAR
57、;NEAR與與FAR只選只選 一個,或缺省一個,或缺省 (過程體)(過程體) 過程名過程名 ENDP 其中,過程名不能省略,過程名也就是子程序的程序名,其中,過程名不能省略,過程名也就是子程序的程序名,可以通過可以通過CALL指令調(diào)用,它類同于一個標(biāo)號的作用,具有三指令調(diào)用,它類同于一個標(biāo)號的作用,具有三個屬性:段、偏移量和類型。類型可以選擇個屬性:段、偏移量和類型。類型可以選擇NEAR或或FAR,如,如果沒有選擇距離類型,則默認(rèn)為果沒有選擇距離類型,則默認(rèn)為NEAR。用。用PROC表示過程的表示過程的開始,開始,ENDP表示過程的結(jié)束,它們應(yīng)成對出現(xiàn),并使用同一表示過程的結(jié)束,它們應(yīng)成對出現(xiàn)
58、,并使用同一個過程名。一個過程應(yīng)該寫在某一個邏輯段內(nèi)。例如:個過程名。一個過程應(yīng)該寫在某一個邏輯段內(nèi)。例如:4、過程定義偽指令、過程定義偽指令 CODE SEGMENT ASSUME CS: CODE DISCH PROC NEAR ;定義一個過程(段內(nèi)調(diào)定義一個過程(段內(nèi)調(diào) 用屬性)用屬性) MOV AH, 2 INT 21H DISCH ENDP ;過程結(jié)束過程結(jié)束 START: MOV DL, 30H CALL DISCH ;調(diào)用過程(屬段內(nèi)調(diào)用)調(diào)用過程(屬段內(nèi)調(diào)用) MOV DL, A CALL DISCH ;調(diào)用過程(屬段內(nèi)調(diào)用)調(diào)用過程(屬段內(nèi)調(diào)用) MOV AH, 4CH IN
59、T 21H ;返回到返回到DOS CODE ENDS END START 注意,若過程調(diào)用為段間調(diào)用時,則在調(diào)用過程時要注意,若過程調(diào)用為段間調(diào)用時,則在調(diào)用過程時要將返回地址的段地址和偏移量都壓入堆棧。將返回地址的段地址和偏移量都壓入堆棧。 匯編程序內(nèi),為了指定下一個數(shù)據(jù)或指令在相應(yīng)段中匯編程序內(nèi),為了指定下一個數(shù)據(jù)或指令在相應(yīng)段中的偏移量,匯編程序使用了一個定位偽指令。其格式為:的偏移量,匯編程序使用了一個定位偽指令。其格式為: ORG 表達(dá)式表達(dá)式 它表示把表達(dá)式的值賦給當(dāng)前位置計(jì)數(shù)器它表示把表達(dá)式的值賦給當(dāng)前位置計(jì)數(shù)器$。例如:。例如:5、定位偽指令、定位偽指令ORG和當(dāng)前位置計(jì)數(shù)器和
60、當(dāng)前位置計(jì)數(shù)器$ DATA SEGMENT ORG 20H ;設(shè)置位置計(jì)數(shù)器設(shè)置位置計(jì)數(shù)器$為為20H D1 DB 12H, 13H ;12H,13H從偏移量為從偏移量為20H 處開始存放處開始存放 ORG $+01H ;設(shè)置位置計(jì)數(shù)器設(shè)置位置計(jì)數(shù)器$為為$+01H D2 DB 61H, 62H, 63H ;61H,62H,63H從偏移量從偏移量 為為21H處開始存放開始存放 DATA ENDS CODE SEGMENT ASSUME CS: CODE, ORG 100H ;設(shè)置位置計(jì)數(shù)器設(shè)置位置計(jì)數(shù)器$為為100H START: MOV AX, DATA ;BEGIN從偏移量為從偏移量為 1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 肱骨骨折護(hù)理題庫及答案
- 護(hù)理實(shí)習(xí)生與老年人溝通能力的現(xiàn)狀及影響因素分析-基于云南省某三甲醫(yī)院的橫斷面調(diào)查
- 2025年海南省公需課學(xué)習(xí)-養(yǎng)殖水域?yàn)┩恳?guī)劃編制工作規(guī)范
- 2025年?duì)I養(yǎng)周飲食健康知識競賽題庫及答案(共220題)
- 2025年八大特殊作業(yè)安全生產(chǎn)知識考試判斷題及答案(共80題)
- 2025年糧食作物生產(chǎn)試卷及答案
- 中學(xué)地理押題題庫及答案
- 照明節(jié)能維護(hù)合同范本
- 2025年部隊(duì)文字考試題庫及答案
- 2025年陜西榆林中考試題及答案
- 【MOOC】影視鑒賞-揚(yáng)州大學(xué) 中國大學(xué)慕課MOOC答案
- 南京信息工程大學(xué)《數(shù)學(xué)分析(3)》2022-2023學(xué)年第一學(xué)期期末試卷
- 瀝青混凝土心墻碾壓石渣壩施工方案
- 裝載機(jī)鏟斗的設(shè)計(jì)
- 中國民俗文化概說(山東聯(lián)盟)智慧樹知到答案2024年青島理工大學(xué)
- 基礎(chǔ)有機(jī)化學(xué)實(shí)驗(yàn)智慧樹知到期末考試答案章節(jié)答案2024年浙江大學(xué)
- 2024年北京市人力資源市場薪酬?duì)顩r白皮書
- 數(shù)字孿生智慧水利整體規(guī)劃建設(shè)方案
- 業(yè)委會換屆問卷調(diào)查表
- 慕課《如何寫好科研論文》期末考試答案
- 幼兒園中班安全教育《這些東西能吃嗎》
評論
0/150
提交評論