




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 第第2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式2.1 匯編語(yǔ)言語(yǔ)句格式匯編語(yǔ)言語(yǔ)句格式2.2 偽指令偽指令2.3 匯編語(yǔ)言源程序基本框架匯編語(yǔ)言源程序基本框架第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 2.1 匯編語(yǔ)言語(yǔ)句格式匯編語(yǔ)言語(yǔ)句格式同其他程序設(shè)計(jì)語(yǔ)言一樣,匯編語(yǔ)言的翻譯器同其他程序設(shè)計(jì)語(yǔ)言一樣,匯編語(yǔ)言的翻譯器(匯編程序)對(duì)源程序有嚴(yán)格的格式要求。這樣,(匯編程序)對(duì)源程序有嚴(yán)格的格式要求。這樣,匯編程序才能確切翻譯源程序,形成功能等價(jià)的匯編程序才能確切翻譯源程序,形成功能等價(jià)的機(jī)器指令(目標(biāo)代碼),連接后能直接運(yùn)行。匯機(jī)器指令(
2、目標(biāo)代碼),連接后能直接運(yùn)行。匯編語(yǔ)言程序格式就是匯編語(yǔ)言必須遵循的語(yǔ)法規(guī)編語(yǔ)言程序格式就是匯編語(yǔ)言必須遵循的語(yǔ)法規(guī)則。則。 第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 匯編語(yǔ)言源程序由語(yǔ)句序列構(gòu)成,匯編語(yǔ)言程序中的語(yǔ)句可以分為匯編語(yǔ)言源程序由語(yǔ)句序列構(gòu)成,匯編語(yǔ)言程序中的語(yǔ)句可以分為指令語(yǔ)句、偽指令語(yǔ)句和宏指令語(yǔ)句三種。指令語(yǔ)句、偽指令語(yǔ)句和宏指令語(yǔ)句三種。(1)指令語(yǔ)句:對(duì)應(yīng)于指令語(yǔ)句:對(duì)應(yīng)于CPU指令系統(tǒng)中的一條機(jī)器指令,由指令系統(tǒng)中的一條機(jī)器指令,由CPU執(zhí)行,能完成一定操作功能,能夠翻譯成機(jī)器代碼的語(yǔ)句。執(zhí)行,能完成一定操作功能,能夠翻譯成機(jī)器代碼的語(yǔ)句。(2)偽指令語(yǔ)句:無(wú)對(duì)
3、應(yīng)的機(jī)器指令,不由偽指令語(yǔ)句:無(wú)對(duì)應(yīng)的機(jī)器指令,不由CPU執(zhí)行,只為匯編執(zhí)行,只為匯編程序在翻譯匯編語(yǔ)言源程序時(shí)提供有關(guān)信息,并不翻譯成機(jī)器代碼程序在翻譯匯編語(yǔ)言源程序時(shí)提供有關(guān)信息,并不翻譯成機(jī)器代碼的語(yǔ)句。的語(yǔ)句。(3)宏指令語(yǔ)句:就是由若干條指令語(yǔ)句形成的語(yǔ)句,一條宏指宏指令語(yǔ)句:就是由若干條指令語(yǔ)句形成的語(yǔ)句,一條宏指令語(yǔ)句的功能相當(dāng)于若干條指令語(yǔ)句的功能,詳見(jiàn)第令語(yǔ)句的功能相當(dāng)于若干條指令語(yǔ)句的功能,詳見(jiàn)第5章。章。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 匯編語(yǔ)言源程序中的每個(gè)語(yǔ)句可以由匯編語(yǔ)言源程序中的每個(gè)語(yǔ)句可以由4項(xiàng)組成,格式如下:項(xiàng)組成,格式如下:名字:名字: 操作
4、碼操作碼 操作數(shù)操作數(shù),操作數(shù),操作數(shù) ;注釋?zhuān)蛔⑨屍渲校猪?xiàng)是一個(gè)符號(hào)項(xiàng)。其中,名字項(xiàng)是一個(gè)符號(hào)項(xiàng)。操作碼項(xiàng)是一個(gè)操作碼的助記符,它可以是指令、偽指令或宏指令操作碼項(xiàng)是一個(gè)操作碼的助記符,它可以是指令、偽指令或宏指令名。名。操作數(shù)項(xiàng)由一個(gè)或多個(gè)表達(dá)式組成,它提供為執(zhí)行所要求的操作而操作數(shù)項(xiàng)由一個(gè)或多個(gè)表達(dá)式組成,它提供為執(zhí)行所要求的操作而需要的信息。需要的信息。注釋項(xiàng)用來(lái)說(shuō)明程序或語(yǔ)句的功能。注釋項(xiàng)用來(lái)說(shuō)明程序或語(yǔ)句的功能。“;”為識(shí)別注釋項(xiàng)的開(kāi)始。為識(shí)別注釋項(xiàng)的開(kāi)始。帶方括號(hào)的項(xiàng)是可選項(xiàng),需要根據(jù)具體情況而定。帶方括號(hào)的項(xiàng)是可選項(xiàng),需要根據(jù)具體情況而定。匯編語(yǔ)言源程序中的每條語(yǔ)句一般占一
5、行,各項(xiàng)之間必須用空格或匯編語(yǔ)言源程序中的每條語(yǔ)句一般占一行,各項(xiàng)之間必須用空格或制表符作為分隔符,操作數(shù)之間用逗號(hào)分隔。制表符作為分隔符,操作數(shù)之間用逗號(hào)分隔。 第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 名字是用戶按照一定規(guī)則定義的標(biāo)識(shí)符,可由下列符號(hào)組成:名字是用戶按照一定規(guī)則定義的標(biāo)識(shí)符,可由下列符號(hào)組成:字母字母 AZ、az數(shù)字?jǐn)?shù)字 09 特殊字符特殊字符 ?、.、_、$數(shù)字不能作名字項(xiàng)的第一個(gè)字符。而圓點(diǎn)僅能用作第一個(gè)字符,可數(shù)字不能作名字項(xiàng)的第一個(gè)字符。而圓點(diǎn)僅能用作第一個(gè)字符,可以用很多字符來(lái)說(shuō)明名字,但只有前面的以用很多字符來(lái)說(shuō)明名字,但只有前面的31個(gè)字符能被匯編程序
6、所個(gè)字符能被匯編程序所識(shí)別。為了便于記憶,名字的定義應(yīng)該能夠見(jiàn)名知義,如用識(shí)別。為了便于記憶,名字的定義應(yīng)該能夠見(jiàn)名知義,如用BUFFER表示緩沖區(qū)、表示緩沖區(qū)、SUM表示累加和等。表示累加和等。名字有兩種形式:標(biāo)號(hào)或變量。指令語(yǔ)句中的名字通常用標(biāo)號(hào)表示,名字有兩種形式:標(biāo)號(hào)或變量。指令語(yǔ)句中的名字通常用標(biāo)號(hào)表示,而偽指令語(yǔ)句中的名字通常用變量名、段名和過(guò)程名表示,多數(shù)情而偽指令語(yǔ)句中的名字通常用變量名、段名和過(guò)程名表示,多數(shù)情況下用變量名表示。況下用變量名表示。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 (1)標(biāo)號(hào)標(biāo)號(hào)標(biāo)號(hào)在代碼段中定義,也可以用標(biāo)號(hào)在代碼段中定義,也可以用EQU或或L
7、ABEL偽指令來(lái)定義,標(biāo)號(hào)與其所代表的指令之間用冒偽指令來(lái)定義,標(biāo)號(hào)與其所代表的指令之間用冒號(hào)分開(kāi),用來(lái)代表一條指令所在單元的地址。標(biāo)號(hào)分開(kāi),用來(lái)代表一條指令所在單元的地址。標(biāo)號(hào)也可以作為過(guò)程名定義。標(biāo)號(hào)經(jīng)常在轉(zhuǎn)移指令號(hào)也可以作為過(guò)程名定義。標(biāo)號(hào)經(jīng)常在轉(zhuǎn)移指令的操作數(shù)字段出現(xiàn),用以表示轉(zhuǎn)向的目標(biāo)地址。的操作數(shù)字段出現(xiàn),用以表示轉(zhuǎn)向的目標(biāo)地址。標(biāo)號(hào)在命名時(shí),應(yīng)盡量取有意義的字符,以便程標(biāo)號(hào)在命名時(shí),應(yīng)盡量取有意義的字符,以便程序的閱讀和理解。序的閱讀和理解。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 標(biāo)號(hào)有標(biāo)號(hào)有3種屬性:段屬性、偏移屬性和類(lèi)型屬性。種屬性:段屬性、偏移屬性和類(lèi)型屬性。段屬
8、性:標(biāo)號(hào)所代表指令單元的段起始地址,此值必須段屬性:標(biāo)號(hào)所代表指令單元的段起始地址,此值必須在一個(gè)段寄存器中,而標(biāo)號(hào)的段則總是在在一個(gè)段寄存器中,而標(biāo)號(hào)的段則總是在CS寄存器中。寄存器中。偏移屬性:標(biāo)號(hào)所代表指令單元的段內(nèi)偏移地址,標(biāo)號(hào)偏移屬性:標(biāo)號(hào)所代表指令單元的段內(nèi)偏移地址,標(biāo)號(hào)的偏移地址是從段起始地址到定義標(biāo)號(hào)的位置之間的字的偏移地址是從段起始地址到定義標(biāo)號(hào)的位置之間的字節(jié)數(shù)。對(duì)于節(jié)數(shù)。對(duì)于16位段是位段是16位無(wú)符號(hào)數(shù)。位無(wú)符號(hào)數(shù)。類(lèi)型屬性:用來(lái)指出標(biāo)號(hào)是在本段內(nèi)引用還是在其他段類(lèi)型屬性:用來(lái)指出標(biāo)號(hào)是在本段內(nèi)引用還是在其他段中引用的。如是在段內(nèi)引用的,則稱(chēng)為中引用的。如是在段內(nèi)引用的
9、,則稱(chēng)為NEAR,轉(zhuǎn)移源和,轉(zhuǎn)移源和轉(zhuǎn)移目標(biāo)在同一個(gè)代碼段中,轉(zhuǎn)移時(shí),只改變轉(zhuǎn)移目標(biāo)在同一個(gè)代碼段中,轉(zhuǎn)移時(shí),只改變IP值,不值,不改變改變CS值;如在段外引用,則稱(chēng)為值;如在段外引用,則稱(chēng)為FAR,轉(zhuǎn)移源和轉(zhuǎn)移,轉(zhuǎn)移源和轉(zhuǎn)移目標(biāo)在不同的代碼段中,轉(zhuǎn)移時(shí),既改變目標(biāo)在不同的代碼段中,轉(zhuǎn)移時(shí),既改變IP值,又改變值,又改變CS值。值。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 (2)變量變量 變量在除代碼段以外的其它段中定義,后面變量在除代碼段以外的其它段中定義,后面不跟冒號(hào)。它也可以用不跟冒號(hào)。它也可以用EQU或或LABEL偽指令來(lái)偽指令來(lái)定義。變量是一個(gè)可以存放數(shù)據(jù)的存儲(chǔ)單元的名定義。
10、變量是一個(gè)可以存放數(shù)據(jù)的存儲(chǔ)單元的名字,即存放數(shù)據(jù)的存儲(chǔ)單元的地址符號(hào)名。變量字,即存放數(shù)據(jù)的存儲(chǔ)單元的地址符號(hào)名。變量用用DB、DW、DD定義,此時(shí)變量名僅表示該數(shù)定義,此時(shí)變量名僅表示該數(shù)據(jù)區(qū)或存儲(chǔ)區(qū)的第一個(gè)數(shù)據(jù)單元的首地址。變量據(jù)區(qū)或存儲(chǔ)區(qū)的第一個(gè)數(shù)據(jù)單元的首地址。變量經(jīng)常在操作數(shù)字段出現(xiàn)。經(jīng)常在操作數(shù)字段出現(xiàn)。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 變量也有變量也有3種屬性:段屬性、偏移屬性和類(lèi)型屬性。種屬性:段屬性、偏移屬性和類(lèi)型屬性。變量所代表數(shù)據(jù)單元的段起始地址,此值必須變量所代表數(shù)據(jù)單元的段起始地址,此值必須在一個(gè)段寄存器中(在一個(gè)段寄存器中(DS、ES或或SS中)。
11、中)。變量所代表數(shù)據(jù)單元的段內(nèi)偏移地址,變量變量所代表數(shù)據(jù)單元的段內(nèi)偏移地址,變量的偏移地址是從段的起始地址到定義變量的位置之間的的偏移地址是從段的起始地址到定義變量的位置之間的字節(jié)數(shù)。對(duì)于字節(jié)數(shù)。對(duì)于16位段是位段是16位無(wú)符號(hào)數(shù)。在當(dāng)前段內(nèi)給出位無(wú)符號(hào)數(shù)。在當(dāng)前段內(nèi)給出變量的偏移值等于當(dāng)前地址計(jì)數(shù)器的值,當(dāng)前地址計(jì)數(shù)變量的偏移值等于當(dāng)前地址計(jì)數(shù)器的值,當(dāng)前地址計(jì)數(shù)器的值可以用器的值可以用$來(lái)表示。來(lái)表示。變量的類(lèi)型屬性定義該變量所保留的字節(jié)數(shù),變量的類(lèi)型屬性定義該變量所保留的字節(jié)數(shù),如如BYTE(1個(gè)字節(jié)長(zhǎng)),個(gè)字節(jié)長(zhǎng)),WORD(2個(gè)字節(jié)長(zhǎng)),個(gè)字節(jié)長(zhǎng)),DWORD(4個(gè)字節(jié)長(zhǎng))。這一點(diǎn)
12、,將在數(shù)據(jù)定義偽指令個(gè)字節(jié)長(zhǎng))。這一點(diǎn),將在數(shù)據(jù)定義偽指令中說(shuō)明。中說(shuō)明。在同一個(gè)程序中,同樣的標(biāo)號(hào)或變量的定義只允許出現(xiàn)在同一個(gè)程序中,同樣的標(biāo)號(hào)或變量的定義只允許出現(xiàn)一次,否則匯編程序會(huì)指示出錯(cuò)。一次,否則匯編程序會(huì)指示出錯(cuò)。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 操作碼項(xiàng)可以是指令、偽指令或宏指令的助記符。助記操作碼項(xiàng)可以是指令、偽指令或宏指令的助記符。助記符表示指令語(yǔ)句的功能,如符表示指令語(yǔ)句的功能,如INC、MOV等,其符號(hào)與意等,其符號(hào)與意義是由系統(tǒng)定義的,編程時(shí)必須照寫(xiě)不誤,既不能多寫(xiě),義是由系統(tǒng)定義的,編程時(shí)必須照寫(xiě)不誤,既不能多寫(xiě),也不能少寫(xiě),如果指令帶有前綴(如也
13、不能少寫(xiě),如果指令帶有前綴(如REP、REPE等),等),則指令前綴和指令助記符要用空格分開(kāi)。則指令前綴和指令助記符要用空格分開(kāi)。對(duì)于指令,匯編程序?qū)⑵浞g為機(jī)器語(yǔ)言指令。對(duì)于偽對(duì)于指令,匯編程序?qū)⑵浞g為機(jī)器語(yǔ)言指令。對(duì)于偽指令,匯編程序?qū)⒏鶕?jù)其所要求的功能進(jìn)行處理。對(duì)于指令,匯編程序?qū)⒏鶕?jù)其所要求的功能進(jìn)行處理。對(duì)于宏指令,則將根據(jù)其定義展開(kāi)。在第宏指令,則將根據(jù)其定義展開(kāi)。在第5章中將會(huì)專(zhuān)門(mén)討論。章中將會(huì)專(zhuān)門(mén)討論。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 指令中的操作數(shù)用來(lái)指定參與操作的數(shù)據(jù)。對(duì)于指令中的操作數(shù)用來(lái)指定參與操作的數(shù)據(jù)。對(duì)于一般指令,可以有一個(gè)或兩個(gè)操作數(shù),也可以沒(méi)
14、一般指令,可以有一個(gè)或兩個(gè)操作數(shù),也可以沒(méi)有操作數(shù);對(duì)于偽指令和宏指令,可以根據(jù)需要有操作數(shù);對(duì)于偽指令和宏指令,可以根據(jù)需要有多個(gè)操作數(shù)。操作數(shù)多于一個(gè)時(shí),各操作數(shù)之有多個(gè)操作數(shù)。操作數(shù)多于一個(gè)時(shí),各操作數(shù)之間用逗號(hào)分開(kāi)。間用逗號(hào)分開(kāi)。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 操作數(shù)可以是常數(shù)、寄存器、標(biāo)號(hào)、變量或由表操作數(shù)可以是常數(shù)、寄存器、標(biāo)號(hào)、變量或由表達(dá)式組成。在這里,將專(zhuān)門(mén)對(duì)表達(dá)式加以說(shuō)明。達(dá)式組成。在這里,將專(zhuān)門(mén)對(duì)表達(dá)式加以說(shuō)明。表達(dá)式是常數(shù)、標(biāo)號(hào)、變量、寄存器與一些操作表達(dá)式是常數(shù)、標(biāo)號(hào)、變量、寄存器與一些操作符相組合的序列,可以有數(shù)字表達(dá)式和地址表達(dá)符相組合的序列,可
15、以有數(shù)字表達(dá)式和地址表達(dá)式兩種。數(shù)字表達(dá)式由匯編程序根據(jù)優(yōu)先級(jí)規(guī)則式兩種。數(shù)字表達(dá)式由匯編程序根據(jù)優(yōu)先級(jí)規(guī)則計(jì)算得到一個(gè)常數(shù)值。地址表達(dá)式由匯編程序計(jì)計(jì)算得到一個(gè)常數(shù)值。地址表達(dá)式由匯編程序計(jì)算得到一個(gè)地址或一個(gè)常數(shù)值(地址間的距離長(zhǎng)算得到一個(gè)地址或一個(gè)常數(shù)值(地址間的距離長(zhǎng)度)。度)。組成表達(dá)式的操作符有算術(shù)、邏輯、關(guān)系、數(shù)值組成表達(dá)式的操作符有算術(shù)、邏輯、關(guān)系、數(shù)值返回、屬性操作符。返回、屬性操作符。 第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 常用的操作符常用的操作符 算術(shù)操作符算術(shù)操作符邏輯與移位運(yùn)算符邏輯與移位運(yùn)算符關(guān)系運(yùn)算符關(guān)系運(yùn)算符 數(shù)值返回運(yùn)算符數(shù)值返回運(yùn)算符 屬性運(yùn)算符
16、屬性運(yùn)算符 第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 算術(shù)操作符算術(shù)操作符算術(shù)運(yùn)算符包括:算術(shù)運(yùn)算符包括:+、*、/、MOD(取余)。(取余)。運(yùn)算符運(yùn)算符MOD是作除法操作,取余數(shù),如是作除法操作,取余數(shù),如10 MOD 3 = 1。算術(shù)運(yùn)算符可以用于數(shù)字表達(dá)式或地址表達(dá)式中。但當(dāng)算術(shù)運(yùn)算符可以用于數(shù)字表達(dá)式或地址表達(dá)式中。但當(dāng)它用于地址表達(dá)式時(shí),只有當(dāng)其結(jié)果有明確的物理意它用于地址表達(dá)式時(shí),只有當(dāng)其結(jié)果有明確的物理意義時(shí)才是有效的結(jié)果,例如,兩個(gè)地址相乘或相除是義時(shí)才是有效的結(jié)果,例如,兩個(gè)地址相乘或相除是無(wú)意義的。在地址表達(dá)式中,可以用無(wú)意義的。在地址表達(dá)式中,可以用+或或-,但
17、也必須,但也必須注意其物理意義,例如把兩個(gè)不同段的地址相加也是注意其物理意義,例如把兩個(gè)不同段的地址相加也是無(wú)意義的。經(jīng)常使用的方法是無(wú)意義的。經(jīng)常使用的方法是“地址地址常量常量”來(lái)描述來(lái)描述指針的移動(dòng),例如,指針的移動(dòng),例如,SUM+1是指是指SUM字節(jié)單元的下字節(jié)單元的下一個(gè)字節(jié)單元的地址(注意:不是指一個(gè)字節(jié)單元的地址(注意:不是指SUM單元的內(nèi)單元的內(nèi)容加容加1),而),而SUM-1則是指則是指SUM字節(jié)單元的前一個(gè)字字節(jié)單元的前一個(gè)字節(jié)單元的地址。節(jié)單元的地址。 第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 【例例2.1】將首地址為將首地址為ARRAY的字?jǐn)?shù)組的第的字?jǐn)?shù)組的第6個(gè)
18、字傳送到個(gè)字傳送到DX寄存器中。寄存器中。MOV DX,ARRAY+(6-1)*2【例例2.2】數(shù)組數(shù)組ARR定義如下,試寫(xiě)出把數(shù)組長(zhǎng)度定義如下,試寫(xiě)出把數(shù)組長(zhǎng)度(字?jǐn)?shù)字?jǐn)?shù))存入存入CX寄存器的指令。寄存器的指令。ARR DW 1,2,3,4,5,6,7ARREND DW ?其中,其中,ARREND是為計(jì)算數(shù)組長(zhǎng)度而建立的符號(hào)地址,是為計(jì)算數(shù)組長(zhǎng)度而建立的符號(hào)地址,則指令如下:則指令如下:MOV CX,(ARREND-ARR)/2匯編程序在匯編期間將計(jì)算出表達(dá)式的值而形成指令:匯編程序在匯編期間將計(jì)算出表達(dá)式的值而形成指令:MOV CX,7第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 (2
19、)邏輯與移位運(yùn)算符邏輯與移位運(yùn)算符邏輯運(yùn)算符邏輯運(yùn)算符邏輯運(yùn)算符包括:邏輯運(yùn)算符包括:AND(邏輯與)、(邏輯與)、OR(邏輯或)、(邏輯或)、XOR(邏輯異或)、(邏輯異或)、NOT(邏輯非)。(邏輯非)。邏輯運(yùn)算符是按位操作的,它的操作數(shù)只能是數(shù)字,且邏輯運(yùn)算符是按位操作的,它的操作數(shù)只能是數(shù)字,且結(jié)果也為數(shù)字。邏輯運(yùn)算符只能用在數(shù)字表達(dá)式中,不結(jié)果也為數(shù)字。邏輯運(yùn)算符只能用在數(shù)字表達(dá)式中,不能用在地址表達(dá)式中。邏輯運(yùn)算符和邏輯運(yùn)算指令是有能用在地址表達(dá)式中。邏輯運(yùn)算符和邏輯運(yùn)算指令是有區(qū)別的,邏輯運(yùn)算符的功能在匯編階段完成,邏輯運(yùn)算區(qū)別的,邏輯運(yùn)算符的功能在匯編階段完成,邏輯運(yùn)算指令的功
20、能是在程序執(zhí)行階段完成。要注意指令的功能是在程序執(zhí)行階段完成。要注意AND、OR、XOR、NOT不是助記符,而是運(yùn)算符。不是助記符,而是運(yùn)算符。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 【例例2.3】AND AL,78H AND 0FH等價(jià)于:等價(jià)于: AND AL,08H【例例2.4】設(shè)設(shè)VALUE是字節(jié)型變量,分析下面這條語(yǔ)句執(zhí)是字節(jié)型變量,分析下面這條語(yǔ)句執(zhí)行完行完AL寄存器的內(nèi)容。寄存器的內(nèi)容。MOV AL,VALUE AND 01H在匯編后,該語(yǔ)句的源操作數(shù)(在匯編后,該語(yǔ)句的源操作數(shù)(VALUE AND 01H)可能)可能產(chǎn)生兩個(gè)結(jié)果之一:當(dāng)產(chǎn)生兩個(gè)結(jié)果之一:當(dāng)VALUE值
21、的值的D0位為位為1時(shí),時(shí),VALUE和和01與操作的結(jié)果為與操作的結(jié)果為01H,則該語(yǔ)句變成,則該語(yǔ)句變成MOV AL,01H;當(dāng);當(dāng)VALUE值的值的D0位為位為0時(shí),時(shí),VALUE和和01與操作的與操作的結(jié)果為結(jié)果為00H,則該語(yǔ)句變成,則該語(yǔ)句變成MOV AL,00H。因此,執(zhí)行。因此,執(zhí)行后后AL寄存器的內(nèi)容為寄存器的內(nèi)容為01H或或00H。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 移位運(yùn)算符移位運(yùn)算符移位運(yùn)算符有:移位運(yùn)算符有:SHL(邏輯左移)、(邏輯左移)、SHR(邏輯右移)(邏輯右移)格式:格式: 表達(dá)式表達(dá)式 SHL(或(或SHR) n(移位次數(shù))(移位次數(shù))匯編程
22、序?qū)⒈磉_(dá)式左移或右移匯編程序?qū)⒈磉_(dá)式左移或右移n位,高位或低位補(bǔ)位,高位或低位補(bǔ)0,若移,若移位次數(shù)大于位次數(shù)大于15,則結(jié)果為,則結(jié)果為0。【例例2.5】VAL EQU 5H ;符號(hào)常量;符號(hào)常量VAL值值=5H MOV AL,VAL SHR 1;VAL=00000101B邏輯邏輯 右移右移1位為位為00000010=2注意:移位運(yùn)算符注意:移位運(yùn)算符SHL/SHR在操作數(shù)中,匯編時(shí)對(duì)常量進(jìn)在操作數(shù)中,匯編時(shí)對(duì)常量進(jìn)行移位;而移位指令行移位;而移位指令SHL/SHR是在指令的操作碼位置,執(zhí)是在指令的操作碼位置,執(zhí)行時(shí)對(duì)寄存器或存儲(chǔ)器單元中的操作數(shù)移位。行時(shí)對(duì)寄存器或存儲(chǔ)器單元中的操作數(shù)移位。
23、 第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 (3)關(guān)系運(yùn)算符關(guān)系運(yùn)算符關(guān)系運(yùn)算符包括:關(guān)系運(yùn)算符包括:EQ(等于)、(等于)、NE(不等)、(不等)、LT(小于)、(小于)、GT(大于)、(大于)、LE(小于等于)、(小于等于)、GE(大于等于)(大于等于)6種。種。格式:格式:表達(dá)式表達(dá)式1 關(guān)系運(yùn)算符關(guān)系運(yùn)算符 表達(dá)式表達(dá)式2計(jì)算結(jié)果,若關(guān)系成立,則為全計(jì)算結(jié)果,若關(guān)系成立,則為全1,即,即0FFFFH;關(guān)系不成立,則為全關(guān)系不成立,則為全0。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 【例例2.6】MOV BX,32 EQ 45 等價(jià)于:等價(jià)于: MOV BX,0【例例2.
24、7】MOV BX,56 GT 30 等價(jià)于:等價(jià)于: MOV BX,0FFFFH【例例2.8】MOV BX,(VAL LT 5) AND 20) OR (VAL GE 5) AND 30) 當(dāng)當(dāng)VAL5時(shí),匯編結(jié)果應(yīng)該是:時(shí),匯編結(jié)果應(yīng)該是: MOV BX,20 當(dāng)當(dāng)VAL5時(shí),匯編結(jié)果應(yīng)該是:時(shí),匯編結(jié)果應(yīng)該是: MOV BX,30第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 (4)數(shù)值返回運(yùn)算符數(shù)值返回運(yùn)算符數(shù)值返回運(yùn)算符包括:數(shù)值返回運(yùn)算符包括:SEG(取段地址取段地址)、OFFSET(取偏移地址取偏移地址)、TYPE(取類(lèi)型值取類(lèi)型值)、LENGTH(取長(zhǎng)度取長(zhǎng)度)、SIZE(取總
25、字節(jié)數(shù)取總字節(jié)數(shù))這些操作符把一些特征或存儲(chǔ)器地址的一部分作這些操作符把一些特征或存儲(chǔ)器地址的一部分作為數(shù)值回送,但不改變?cè)床僮鲾?shù)的屬性。為數(shù)值回送,但不改變?cè)床僮鲾?shù)的屬性。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 SEG格式:格式:SEG 變量名變量名/標(biāo)號(hào)標(biāo)號(hào)匯編程序?qū)⒒厮妥兞炕驑?biāo)號(hào)的段地址值。匯編程序?qū)⒒厮妥兞炕驑?biāo)號(hào)的段地址值。【例例2.9】如果如果DATA_SEG是從存儲(chǔ)器的是從存儲(chǔ)器的05000H開(kāi)始的開(kāi)始的一個(gè)數(shù)據(jù)段的段名,一個(gè)數(shù)據(jù)段的段名,OPER1是該段中的一個(gè)變量名,則是該段中的一個(gè)變量名,則MOV BX,SEG OPER1將把將把05000H作為立即數(shù)插入指令。實(shí)際
26、上,由于段地址作為立即數(shù)插入指令。實(shí)際上,由于段地址是由連接程序分配的,所以該立即數(shù)是連接時(shí)插入的。是由連接程序分配的,所以該立即數(shù)是連接時(shí)插入的。執(zhí)行期間則使執(zhí)行期間則使BX寄存器的內(nèi)容變成為寄存器的內(nèi)容變成為05000H第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 OFFSET格式:格式:OFFSET 變量名變量名/標(biāo)號(hào)標(biāo)號(hào) 匯編程序?qū)⒒厮妥兞炕驑?biāo)號(hào)的偏移地址。匯編程序?qū)⒒厮妥兞炕驑?biāo)號(hào)的偏移地址。【例例2.10】MOV BX,OFFSET OPER_2匯編程序?qū)R編程序?qū)PER_2的偏移地址作為立即數(shù)回送的偏移地址作為立即數(shù)回送給指令,而在執(zhí)行時(shí)則將該偏移地址裝入給指令,而在執(zhí)行時(shí)則
27、將該偏移地址裝入BX寄寄存器中,所以這條指令與存器中,所以這條指令與LEA BX,OPER_2是等價(jià)的。是等價(jià)的。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 TYPE格式:格式:TYPE 變量名變量名/標(biāo)號(hào)標(biāo)號(hào) 如果該表達(dá)式是變量,則匯編程序?qū)⒒厮妥兞康囊宰止?jié)如果該表達(dá)式是變量,則匯編程序?qū)⒒厮妥兞康囊宰止?jié)數(shù)表示的類(lèi)型:數(shù)表示的類(lèi)型:DB為為1,DW為為2,DD為為4。如果該表達(dá)。如果該表達(dá)式是標(biāo)號(hào),則匯編程序?qū)⒒厮痛碓摌?biāo)號(hào)類(lèi)型數(shù)值:式是標(biāo)號(hào),則匯編程序?qū)⒒厮痛碓摌?biāo)號(hào)類(lèi)型數(shù)值:NEAR為為-1,F(xiàn)AR為為-2。如果表達(dá)式為常數(shù),則應(yīng)回送。如果表達(dá)式為常數(shù),則應(yīng)回送0。【例例2.11】
28、ARRAY DW 1,2,3則對(duì)于指令:則對(duì)于指令:ADD SI,TYPE ARRAY匯編程序?qū)⑵湫纬蔀椋簠R編程序?qū)⑵湫纬蔀椋篈DD SI,2第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 LENGTH格式:格式:LENGTH 變量名變量名對(duì)于變量中使用對(duì)于變量中使用DUP的情況,匯編程序?qū)⒒厮头值那闆r,匯編程序?qū)⒒厮头峙浣o該變量的單元數(shù),對(duì)于其他情況則送配給該變量的單元數(shù),對(duì)于其他情況則送1。【例例2.12】FEES DW 100 DUP(0)對(duì)于指令:對(duì)于指令:MOV CX,LENGTH FEES匯編程序?qū)⑵湫纬蔀椋簠R編程序?qū)⑵湫纬蔀椋?MOV CX,100第第2 2章章 匯編語(yǔ)言程序格
29、式匯編語(yǔ)言程序格式 SIZE格式:格式:SIZE 變量名變量名匯編程序應(yīng)回送分配給該變量的總字節(jié)數(shù),也就匯編程序應(yīng)回送分配給該變量的總字節(jié)數(shù),也就是是LENGTH和和TYPE的乘積,即:的乘積,即:SIZE=LENGTHTYPE【例例2.13】FEES DW 100 DUP(0)對(duì)于指令:對(duì)于指令:MOV CX,SIZE FEES匯編程序?qū)⑵湫纬蔀椋簠R編程序?qū)⑵湫纬蔀椋?MOV CX,200第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 (5)屬性運(yùn)算符屬性運(yùn)算符屬性運(yùn)算符包括:屬性運(yùn)算符包括:PTR(屬性修改運(yùn)算符屬性修改運(yùn)算符)、“:”(段跨越前綴符)和(段跨越前綴符)和SHORT(短取
30、代運(yùn)算符)。(短取代運(yùn)算符)。PTR格式:格式:類(lèi)型類(lèi)型 PTR 表達(dá)式表達(dá)式是屬性修改運(yùn)算符,用是屬性修改運(yùn)算符,用PTR來(lái)建立符號(hào)地址,但來(lái)建立符號(hào)地址,但它本身并不分配存儲(chǔ)器,只是用來(lái)給已分配的存它本身并不分配存儲(chǔ)器,只是用來(lái)給已分配的存儲(chǔ)地址賦予另一種屬性,使該地址具有另一種類(lèi)儲(chǔ)地址賦予另一種屬性,使該地址具有另一種類(lèi)型,僅在本語(yǔ)句有效。格式中的類(lèi)型字段表示所型,僅在本語(yǔ)句有效。格式中的類(lèi)型字段表示所賦予的新的類(lèi)型屬性,而表達(dá)式字段則是被取代賦予的新的類(lèi)型屬性,而表達(dá)式字段則是被取代類(lèi)型的符號(hào)地址。類(lèi)型的符號(hào)地址。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 【例例2.16】已有數(shù)
31、據(jù)定義如下:已有數(shù)據(jù)定義如下:ARRAY DW ?可以用以下語(yǔ)句對(duì)這兩個(gè)字節(jié)賦予另一種類(lèi)型定義:可以用以下語(yǔ)句對(duì)這兩個(gè)字節(jié)賦予另一種類(lèi)型定義:ARRAY1 EQU BYTE PTR ARRAYARRAY2 EQU BYTE PTR (ARRAY+1)這里,這里,ARRAY和和ARRAY1兩個(gè)符號(hào)地址具有相同的段地兩個(gè)符號(hào)地址具有相同的段地址和偏移地址,但是它們的屬性類(lèi)型不同,前者為址和偏移地址,但是它們的屬性類(lèi)型不同,前者為1,后,后者為者為2。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 此外,有時(shí)指令中也要求使用此外,有時(shí)指令中也要求使用PTR運(yùn)算符。例如,運(yùn)算符。例如,當(dāng)匯編程序遇到
32、當(dāng)匯編程序遇到“MOV BX,5”指令時(shí),指令指令時(shí),指令要求把立即數(shù)要求把立即數(shù)5存入存入BX寄存器內(nèi)容所指定的存儲(chǔ)寄存器內(nèi)容所指定的存儲(chǔ)單元中,但是,匯編程序不能分清是存入字單元單元中,但是,匯編程序不能分清是存入字單元還是字節(jié)單元,此時(shí)必須用還是字節(jié)單元,此時(shí)必須用PTR運(yùn)算符來(lái)說(shuō)明屬運(yùn)算符來(lái)說(shuō)明屬性,應(yīng)該寫(xiě)明:性,應(yīng)該寫(xiě)明:MOV BYTE PTR BX,5或或MOV WORD PTR BX,5第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 :格式:格式:段寄存器:地址表達(dá)式段寄存器:地址表達(dá)式“:”稱(chēng)為段運(yùn)算符,又稱(chēng)為段跨越前綴符。用稱(chēng)為段運(yùn)算符,又稱(chēng)為段跨越前綴符。用于臨時(shí)給變量
33、、標(biāo)號(hào)或地址表達(dá)式指定一個(gè)段屬于臨時(shí)給變量、標(biāo)號(hào)或地址表達(dá)式指定一個(gè)段屬性,地址表達(dá)式的性,地址表達(dá)式的EA和類(lèi)型屬性不變。在指令和類(lèi)型屬性不變。在指令中代替默認(rèn)的段以形成物理地址。中代替默認(rèn)的段以形成物理地址。【例例2.17】MOV AX,ES:BX+SI;PA=ES*16+EA,臨時(shí)替換默認(rèn)的,臨時(shí)替換默認(rèn)的DS第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 SHORT短取代運(yùn)算符,用來(lái)修飾短取代運(yùn)算符,用來(lái)修飾JMP指令中轉(zhuǎn)向地址的指令中轉(zhuǎn)向地址的屬性,指出轉(zhuǎn)向地址是在下一條指令地址的屬性,指出轉(zhuǎn)向地址是在下一條指令地址的-128+127個(gè)字節(jié)范圍內(nèi)。個(gè)字節(jié)范圍內(nèi)。【例例2.18】JM
34、P SHORT NEXTNEXT:MOV AX,BX第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 (6)運(yùn)算符的優(yōu)先級(jí)運(yùn)算符的優(yōu)先級(jí)以上說(shuō)明了以上說(shuō)明了5類(lèi)常用的運(yùn)算符,在計(jì)算表達(dá)式時(shí),應(yīng)該首先計(jì)算優(yōu)先類(lèi)常用的運(yùn)算符,在計(jì)算表達(dá)式時(shí),應(yīng)該首先計(jì)算優(yōu)先級(jí)高的運(yùn)算符,同級(jí)運(yùn)算符從自左向右進(jìn)行計(jì)算。下面給出運(yùn)算符級(jí)高的運(yùn)算符,同級(jí)運(yùn)算符從自左向右進(jìn)行計(jì)算。下面給出運(yùn)算符的優(yōu)先級(jí)別,從高到低排列如下:的優(yōu)先級(jí)別,從高到低排列如下:( )、 、LENGTH、SIZE,然后是段跨越前綴符,然后是段跨越前綴符“:”P(pán)TR、OFFSET、SEG、TYPE、THIS以及段運(yùn)算符以及段運(yùn)算符HIGH、LOW*
35、、/、MOD、SHL、SHR+、-EQ、NE、LT、LE、GT、GENOTANDOR、XORSHORT第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 4注釋項(xiàng)注釋項(xiàng)注釋項(xiàng)由分號(hào)注釋項(xiàng)由分號(hào)“;”開(kāi)始,用來(lái)說(shuō)明一條指令或開(kāi)始,用來(lái)說(shuō)明一條指令或一段程序的功能,它不屬于程序本身,在匯編過(guò)一段程序的功能,它不屬于程序本身,在匯編過(guò)程中,匯編程序不會(huì)對(duì)注釋作任何加工,這部分程中,匯編程序不會(huì)對(duì)注釋作任何加工,這部分不產(chǎn)生機(jī)器代碼,注釋只是為了增加程序的可讀不產(chǎn)生機(jī)器代碼,注釋只是為了增加程序的可讀性,便于閱讀、理解和修改程序。對(duì)于匯編語(yǔ)言性,便于閱讀、理解和修改程序。對(duì)于匯編語(yǔ)言程序來(lái)說(shuō),注釋項(xiàng)的作
36、用是很明顯的,讀者應(yīng)該程序來(lái)說(shuō),注釋項(xiàng)的作用是很明顯的,讀者應(yīng)該在編寫(xiě)匯編程序的過(guò)程中,注意學(xué)會(huì)寫(xiě)好注釋。在編寫(xiě)匯編程序的過(guò)程中,注意學(xué)會(huì)寫(xiě)好注釋。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 2.2 偽指令偽指令第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 由于由于80 x86的所有處理器都支持的所有處理器都支持8086/8088指令系統(tǒng),但每一指令系統(tǒng),但每一種高檔的機(jī)型又都增加一些新的指令,因此,在編寫(xiě)程序種高檔的機(jī)型又都增加一些新的指令,因此,在編寫(xiě)程序時(shí)要對(duì)所用處理器有一個(gè)明確的選擇。此類(lèi)偽指令格式為:時(shí)要對(duì)所用處理器有一個(gè)明確的選擇。此類(lèi)偽指令格式為: 8086;選擇;選擇
37、8086指令系統(tǒng)指令系統(tǒng) 286;選擇;選擇80286指令系統(tǒng)指令系統(tǒng) 286P;選擇保護(hù)模式下;選擇保護(hù)模式下80286指令系統(tǒng)指令系統(tǒng) 386;選擇;選擇80386指令系統(tǒng)指令系統(tǒng)需要注意的問(wèn)題:需要注意的問(wèn)題: (1)處理器選擇偽指令在完整和簡(jiǎn)化兩種程序框架中均可使處理器選擇偽指令在完整和簡(jiǎn)化兩種程序框架中均可使 用。用。(2) 缺省時(shí)為選擇缺省時(shí)為選擇8088/8086微處理器指令系統(tǒng)。微處理器指令系統(tǒng)。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 程序中所涉及到的大量初始數(shù)據(jù)、中間數(shù)據(jù)和結(jié)果數(shù)據(jù),程序中所涉及到的大量初始數(shù)據(jù)、中間數(shù)據(jù)和結(jié)果數(shù)據(jù),一般都要在程序設(shè)計(jì)時(shí)進(jìn)行預(yù)置和分配
38、存儲(chǔ)空間,可以一般都要在程序設(shè)計(jì)時(shí)進(jìn)行預(yù)置和分配存儲(chǔ)空間,可以通過(guò)數(shù)據(jù)定義偽指令實(shí)現(xiàn),其格式為:通過(guò)數(shù)據(jù)定義偽指令實(shí)現(xiàn),其格式為:變量名變量名 DB 表達(dá)式表達(dá)式;定義字節(jié)型變量,每個(gè)操;定義字節(jié)型變量,每個(gè)操 作數(shù)占作數(shù)占1個(gè)字節(jié)的內(nèi)存?zhèn)€字節(jié)的內(nèi)存單元單元變量名變量名 DW 表達(dá)式表達(dá)式;定義字型變量,每個(gè)操作;定義字型變量,每個(gè)操作 數(shù)占數(shù)占2個(gè)字節(jié)的內(nèi)存單個(gè)字節(jié)的內(nèi)存單元元變量名變量名 DD 表達(dá)式表達(dá)式;定義雙字型變量,每個(gè)操;定義雙字型變量,每個(gè)操 作數(shù)占作數(shù)占4個(gè)字節(jié)的內(nèi)存?zhèn)€字節(jié)的內(nèi)存單元單元 第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 其中,其中,DB、DW、DD稱(chēng)為偽指令
39、助記符,分別用來(lái)定義稱(chēng)為偽指令助記符,分別用來(lái)定義字節(jié)型、字型、雙字型變量。數(shù)據(jù)定義偽指令可用于除字節(jié)型、字型、雙字型變量。數(shù)據(jù)定義偽指令可用于除代碼段以外的任何段中,但主要用于數(shù)據(jù)段和附加數(shù)據(jù)代碼段以外的任何段中,但主要用于數(shù)據(jù)段和附加數(shù)據(jù)段中,用來(lái)按名字存取其對(duì)應(yīng)的內(nèi)存單元。數(shù)據(jù)定義偽段中,用來(lái)按名字存取其對(duì)應(yīng)的內(nèi)存單元。數(shù)據(jù)定義偽指令可以為一個(gè)或連續(xù)的存儲(chǔ)單元設(shè)置數(shù)值初值。其中指令可以為一個(gè)或連續(xù)的存儲(chǔ)單元設(shè)置數(shù)值初值。其中變量名、助記符和操作數(shù)之間以空格隔開(kāi),且方括號(hào)中變量名、助記符和操作數(shù)之間以空格隔開(kāi),且方括號(hào)中內(nèi)容為可選項(xiàng)。表達(dá)式可為如下幾種情況:常數(shù)表達(dá)式、內(nèi)容為可選項(xiàng)。表達(dá)式
40、可為如下幾種情況:常數(shù)表達(dá)式、問(wèn)號(hào)(?)、地址表達(dá)式(適用問(wèn)號(hào)(?)、地址表達(dá)式(適用DW和和DD)、字符及字)、字符及字符串(適用于符串(適用于DB)、重復(fù)子句)、重復(fù)子句DUP(表達(dá)式)、用逗號(hào)(表達(dá)式)、用逗號(hào)分開(kāi)的上述各項(xiàng)。分開(kāi)的上述各項(xiàng)。 第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 需要說(shuō)明的是:(1)若是字符串且是DB類(lèi)型時(shí),必須以單引號(hào)括起來(lái),括起來(lái)的字符個(gè)數(shù)不能超過(guò)255個(gè),字符串以ASCII碼的形式按地址遞增的順序依次存放在以變量名開(kāi)始的內(nèi)存單元中;(2)若是?時(shí),表示為變量預(yù)留內(nèi)存單元。例如: X1 DB ? ;為變量X1預(yù)留1個(gè)字節(jié)單元;(3)若是帶DUP的表達(dá)式表
41、示定義多個(gè)相同的操作數(shù)和要預(yù)留多個(gè)內(nèi)存單元。DUP的使用格式如下:表達(dá)式 DUP(操作數(shù)項(xiàng))表達(dá)式為要重復(fù)的次數(shù);操作數(shù)表示要重復(fù)的內(nèi)容,可以是常數(shù)或表達(dá)式、字符串、?和帶DUP的表達(dá)式。 第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 【例例2.19】操作數(shù)可以是常數(shù),或者是表達(dá)式。操作數(shù)可以是常數(shù),或者是表達(dá)式。DATA1 DB 12,4,10H;每個(gè)操作數(shù)占用一個(gè)字節(jié)單元;每個(gè)操作數(shù)占用一個(gè)字節(jié)單元DATA2 DW 100,100H,-5;每個(gè)操作數(shù)占用一個(gè)字單元;每個(gè)操作數(shù)占用一個(gè)字單元DATA3 DD 3*20,0FFFDH;每個(gè)操作數(shù)占用一個(gè)雙字單元;每個(gè)操作數(shù)占用一個(gè)雙字單元匯
42、編程序可以在匯編期間在存儲(chǔ)器中存入數(shù)據(jù),匯編程序可以在匯編期間在存儲(chǔ)器中存入數(shù)據(jù),如圖如圖2.1所示。所示。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 0CFB010000640A04FF00FFFD0000003C0012d4d10h100d100h-560d0FFFDHDATA1DATA3DATA2圖2.1 例2.19的匯編結(jié)果第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 【例例2.20】操作數(shù)也可以是字符操作數(shù)也可以是字符串。下面串。下面3個(gè)定義語(yǔ)句是等價(jià)的。個(gè)定義語(yǔ)句是等價(jià)的。存儲(chǔ)器存儲(chǔ)情況如圖存儲(chǔ)器存儲(chǔ)情況如圖2.2所示。所示。STR1 DB ABCD ;存放地;存放地址由
43、低到高分別為:址由低到高分別為:41H、42H、43H、44HSTR1 DB A,B,C,DSTR1 DB 41H,42H,43H,44H 41H44H43H42HABCDSTR1圖2.2 例2.20的匯編結(jié)果 第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 1模塊命名偽指令模塊命名偽指令(NAME)格式:格式:NAME 模塊名模塊名該命令表示一個(gè)模塊的開(kāi)始,并給出該模塊名。如果程該命令表示一個(gè)模塊的開(kāi)始,并給出該模塊名。如果程序中沒(méi)有使用序中沒(méi)有使用NAME偽指令,也可以使用偽指令,也可以使用TITLE偽指令來(lái)偽指令來(lái)給源程序設(shè)置標(biāo)題,以后每頁(yè)的第一行都列出該標(biāo)題。給源程序設(shè)置標(biāo)題,以后每
44、頁(yè)的第一行都列出該標(biāo)題。2標(biāo)題偽指令標(biāo)題偽指令(TITLE)格式:格式:TITLE TEXT這里這里TEXT為標(biāo)題,即為不加引號(hào)的字符串,最長(zhǎng)為為標(biāo)題,即為不加引號(hào)的字符串,最長(zhǎng)為60個(gè)個(gè)字符。一個(gè)程序模塊中只允許一個(gè)字符。一個(gè)程序模塊中只允許一個(gè)TITLE命令,否則會(huì)引命令,否則會(huì)引起誤會(huì)。在無(wú)起誤會(huì)。在無(wú)NAME命令情況下,命令情況下,TEXT的前的前6個(gè)字符一個(gè)字符一般用作模塊名。般用作模塊名。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 格式:格式:END 標(biāo)號(hào)標(biāo)號(hào)其中:標(biāo)號(hào)可以是過(guò)程名或帶其中:標(biāo)號(hào)可以是過(guò)程名或帶“:”的標(biāo)號(hào),標(biāo)號(hào)表示的標(biāo)號(hào),標(biāo)號(hào)表示為程序開(kāi)始執(zhí)行的起始地址,即
45、主程序中的第一條可執(zhí)為程序開(kāi)始執(zhí)行的起始地址,即主程序中的第一條可執(zhí)行指令的地址。當(dāng)標(biāo)號(hào)缺省時(shí)表示該程序是一個(gè)子程序,行指令的地址。當(dāng)標(biāo)號(hào)缺省時(shí)表示該程序是一個(gè)子程序,不能單獨(dú)運(yùn)行,只能被其他程序調(diào)用。不能單獨(dú)運(yùn)行,只能被其他程序調(diào)用。模塊的一般形式為:模塊的一般形式為:NAME 模塊名模塊名所有的語(yǔ)句所有的語(yǔ)句END 啟動(dòng)標(biāo)號(hào)或過(guò)程啟動(dòng)標(biāo)號(hào)或過(guò)程第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 8086按照邏輯段組織程序,具有代碼段、數(shù)據(jù)段、按照邏輯段組織程序,具有代碼段、數(shù)據(jù)段、附加段和堆棧段。因此,一個(gè)匯編語(yǔ)言源程序可附加段和堆棧段。因此,一個(gè)匯編語(yǔ)言源程序可以包括若干個(gè)代碼段、數(shù)據(jù)段或
46、堆棧段,段與段以包括若干個(gè)代碼段、數(shù)據(jù)段或堆棧段,段與段之間的順序可以隨意排列。邏輯段用匯編語(yǔ)言源之間的順序可以隨意排列。邏輯段用匯編語(yǔ)言源程序中的段定義偽指令來(lái)定義。程序中的段定義偽指令來(lái)定義。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 1完整段定義偽指令(完整段定義偽指令(SEGMENT、ENDS)采用完整段定義偽指令可具體控制匯編程序和連接程序采用完整段定義偽指令可具體控制匯編程序和連接程序在內(nèi)存中組織代碼和數(shù)據(jù)的方式。為此,需要用段定義在內(nèi)存中組織代碼和數(shù)據(jù)的方式。為此,需要用段定義偽操作,其格式如下:偽操作,其格式如下:段名段名 SEGMENT 定位類(lèi)型定位類(lèi)型 組合類(lèi)型組合類(lèi)
47、型 類(lèi)別名類(lèi)別名段名段名 ENDS第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 定義了一個(gè)以定義了一個(gè)以SEGMENT偽指令開(kāi)始,以偽指令開(kāi)始,以ENDS偽指令結(jié)偽指令結(jié)束的存儲(chǔ)段,二者總是成對(duì)出現(xiàn),缺一不可。中間省略束的存儲(chǔ)段,二者總是成對(duì)出現(xiàn),缺一不可。中間省略的部分稱(chēng)為段體。對(duì)數(shù)據(jù)段、附加段、堆棧段來(lái)說(shuō),一的部分稱(chēng)為段體。對(duì)數(shù)據(jù)段、附加段、堆棧段來(lái)說(shuō),一般為變量、符號(hào)定義等偽指令;對(duì)代碼段來(lái)說(shuō),則主要般為變量、符號(hào)定義等偽指令;對(duì)代碼段來(lái)說(shuō),則主要是程序代碼。方括號(hào)中的為可選項(xiàng),當(dāng)有可選項(xiàng)時(shí)各項(xiàng)是程序代碼。方括號(hào)中的為可選項(xiàng),當(dāng)有可選項(xiàng)時(shí)各項(xiàng)順序不能錯(cuò),可選項(xiàng)之間用空格隔開(kāi)。下面分別
48、介紹這順序不能錯(cuò),可選項(xiàng)之間用空格隔開(kāi)。下面分別介紹這些部分的作用。些部分的作用。(1) 段名段名段名是用戶自定義的,但不要與指令助記符或偽指令重段名是用戶自定義的,但不要與指令助記符或偽指令重名,用來(lái)指示匯編程序?yàn)樵摱畏峙涞拇鎯?chǔ)區(qū)的首地址,名,用來(lái)指示匯編程序?yàn)樵摱畏峙涞拇鎯?chǔ)區(qū)的首地址,它有段地址和偏移地址兩個(gè)屬性。段開(kāi)始和段結(jié)束的段它有段地址和偏移地址兩個(gè)屬性。段開(kāi)始和段結(jié)束的段名必須相同。名必須相同。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 (2) 定位類(lèi)型定位類(lèi)型說(shuō)明段的起始地址的邊界要求,指示連接程序按定位類(lèi)說(shuō)明段的起始地址的邊界要求,指示連接程序按定位類(lèi)型提出的要求,安排各
49、段在內(nèi)存的相互銜接方式。它型提出的要求,安排各段在內(nèi)存的相互銜接方式。它有有5種可選擇類(lèi)型:種可選擇類(lèi)型: BYTE:段的起始地址可以從任何地址開(kāi)始。:段的起始地址可以從任何地址開(kāi)始。 段起始地址段起始地址(20位位): B WORD:段的起始地址必須以偶地址開(kāi)始,即該地:段的起始地址必須以偶地址開(kāi)始,即該地 址的址的D0位應(yīng)為位應(yīng)為0。 段起始地址段起始地址(20位位): 0 B第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 DWORD:段的起始地址必須為:段的起始地址必須為4的倍數(shù),即該地址的倍數(shù),即該地址的的D1和和D0位應(yīng)為位應(yīng)為0。 段起始地址段起始地址(20位位): 00 B P
50、ARA:段的起始地址必須從小段邊界開(kāi)始,即該地:段的起始地址必須從小段邊界開(kāi)始,即該地址的址的D3D0位應(yīng)為位應(yīng)為0。 段起始地址段起始地址(20位位): 0000 BPAGE:段的起始地址必須從頁(yè)的邊界開(kāi)始,即該地:段的起始地址必須從頁(yè)的邊界開(kāi)始,即該地址的址的D7D0位應(yīng)為位應(yīng)為0。 段起始地址段起始地址(20位位): 0000 0000 B 如未指定定位類(lèi)型,則匯編程序默認(rèn)為如未指定定位類(lèi)型,則匯編程序默認(rèn)為PARA。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 (3) 組合類(lèi)型組合類(lèi)型當(dāng)程序有多個(gè)段時(shí),組合類(lèi)型用來(lái)說(shuō)明段與段之間是怎當(dāng)程序有多個(gè)段時(shí),組合類(lèi)型用來(lái)說(shuō)明段與段之間是怎樣
51、連接和定位的,共有樣連接和定位的,共有6種組合類(lèi)型:種組合類(lèi)型: 不指定或稱(chēng)隱含方式:表示本段與其他模塊中的同不指定或稱(chēng)隱含方式:表示本段與其他模塊中的同 名段無(wú)連接關(guān)系,它將作為一個(gè)獨(dú)立的段運(yùn)行。名段無(wú)連接關(guān)系,它將作為一個(gè)獨(dú)立的段運(yùn)行。 PUBLIC:本段與其他模塊中說(shuō)明為:本段與其他模塊中說(shuō)明為PUBLIC方式的方式的 同名段順序連接,組成一個(gè)大的邏輯段,它們共同名段順序連接,組成一個(gè)大的邏輯段,它們共用用 同一個(gè)段起始地址。同一個(gè)段起始地址。 COMMON:本段與其他模塊中說(shuō)明為:本段與其他模塊中說(shuō)明為COMMON方方 式的同名段從同一地址開(kāi)始重疊連接,段長(zhǎng)是同式的同名段從同一地址開(kāi)始
52、重疊連接,段長(zhǎng)是同名名 段中最長(zhǎng)的段的長(zhǎng)度。段中最長(zhǎng)的段的長(zhǎng)度。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 STACK:表示該段是堆棧段的一部分。把所有相同:表示該段是堆棧段的一部分。把所有相同 類(lèi)別名類(lèi)別名的具有的具有STACK組合類(lèi)型的段連接成一組合類(lèi)型的段連接成一個(gè)連個(gè)連 續(xù)段,該段長(zhǎng)度為各原有段的總和。將連續(xù)段首續(xù)段,該段長(zhǎng)度為各原有段的總和。將連續(xù)段首地地 址送址送SS,段內(nèi)最大偏移地址送,段內(nèi)最大偏移地址送SP(SP指向棧指向棧頂)。頂)。 當(dāng)定義了當(dāng)定義了STACK屬性后,在主程序中可省略對(duì)屬性后,在主程序中可省略對(duì)SS和和 SP的初始化。的初始化。 MEMORY:與:與P
53、UBLIC同義。同義。 AT表達(dá)式:表示本段的段地址由表達(dá)式的值得到。表達(dá)式:表示本段的段地址由表達(dá)式的值得到。 該段的偏移地址為該段的偏移地址為“零零”。這種方式用戶可直接。這種方式用戶可直接規(guī)定該規(guī)定該 段的起始地址。例如,段的起始地址。例如,AT 1000H,定位的段首,定位的段首地址地址 為(為(1000H:0000H),但這種方式不能用于代),但這種方式不能用于代碼段。碼段。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 (4) 類(lèi)別名類(lèi)別名類(lèi)別名必須用單引號(hào)括起來(lái)。連接時(shí)對(duì)不同模塊、不同類(lèi)別名必須用單引號(hào)括起來(lái)。連接時(shí)對(duì)不同模塊、不同名的程序段只要名的程序段只要類(lèi)別名類(lèi)別名相同,
54、則放在一個(gè)連續(xù)的物相同,則放在一個(gè)連續(xù)的物理空間,但每段之間是獨(dú)立的,不進(jìn)行組合。理空間,但每段之間是獨(dú)立的,不進(jìn)行組合。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 2指定段寄存器偽指令(指定段寄存器偽指令(ASSUME)在程序中,必須明確段和段寄存器之間的關(guān)系,這可用在程序中,必須明確段和段寄存器之間的關(guān)系,這可用ASSUME偽指令來(lái)實(shí)現(xiàn),其格式為:偽指令來(lái)實(shí)現(xiàn),其格式為:ASSUME 段寄存器名:段名段寄存器名:段名,段寄存器名:段名,段寄存器名:段名ASSUME偽指令告訴匯編程序,在運(yùn)行期間通過(guò)哪個(gè)段偽指令告訴匯編程序,在運(yùn)行期間通過(guò)哪個(gè)段寄存器才能找到所要的指令和數(shù)據(jù)。該指令放在
55、程序的寄存器才能找到所要的指令和數(shù)據(jù)。該指令放在程序的代碼段中。代碼段中。如:如:ASSUME CS:CODE,ES:EXTRA,DS:DATA,SS:STACK第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 3段寄存器的裝入段寄存器的裝入 ASSUME偽指令只是指出各段和段寄存器之間的關(guān)偽指令只是指出各段和段寄存器之間的關(guān)系,但并未真正將段基地址裝入相應(yīng)的段寄存器中,所系,但并未真正將段基地址裝入相應(yīng)的段寄存器中,所以在程序的代碼段開(kāi)始處就應(yīng)該先進(jìn)行數(shù)據(jù)段以在程序的代碼段開(kāi)始處就應(yīng)該先進(jìn)行數(shù)據(jù)段DS、附加、附加段段ES和堆棧段和堆棧段SS的段基址的裝入,否則無(wú)法正確對(duì)數(shù)據(jù)的段基址的裝入,否
56、則無(wú)法正確對(duì)數(shù)據(jù)進(jìn)行尋址操作。而代碼段進(jìn)行尋址操作。而代碼段CS則在加載程序后由系統(tǒng)自動(dòng)則在加載程序后由系統(tǒng)自動(dòng)裝入。裝入。 DS和和ES的裝填方法可以使用相同的方法,直接由的裝填方法可以使用相同的方法,直接由用戶程序進(jìn)行加載。用戶程序進(jìn)行加載。第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 (1) DS、ES的裝入的裝入 MOV AX,DATA ;數(shù)據(jù)段段基地址送;數(shù)據(jù)段段基地址送AX寄存器寄存器 MOV DS,AX ;AX寄存器的內(nèi)容送數(shù)據(jù)段寄寄存器的內(nèi)容送數(shù)據(jù)段寄存器存器DS或或 MOV AX,SEG X ;變量;變量X所在數(shù)據(jù)段的段基址送所在數(shù)據(jù)段的段基址送AX寄存器寄存器 MOV
57、DS,AX第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 (2) CS的裝入的裝入對(duì)對(duì)CS和和IP的裝入方法是利用的裝入方法是利用END后的標(biāo)號(hào)來(lái)完成的。因后的標(biāo)號(hào)來(lái)完成的。因?yàn)樵摌?biāo)號(hào)是可執(zhí)行程序的起始地址。如:為該標(biāo)號(hào)是可執(zhí)行程序的起始地址。如:START:END START系統(tǒng)自動(dòng)將系統(tǒng)自動(dòng)將START所在段的段地址送所在段的段地址送CS寄存器,將寄存器,將START所在段內(nèi)的偏移地址送所在段內(nèi)的偏移地址送IP寄存器。寄存器。 第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 (3) SS的裝入的裝入方法方法1:堆棧段:堆棧段SS也可以不用用戶裝入,而由系統(tǒng)自動(dòng)裝填。但是也可以不用用戶裝
58、入,而由系統(tǒng)自動(dòng)裝填。但是在定義堆棧段時(shí),必須把參數(shù)寫(xiě)全。這時(shí),將程序裝入內(nèi)存,系統(tǒng)在定義堆棧段時(shí),必須把參數(shù)寫(xiě)全。這時(shí),將程序裝入內(nèi)存,系統(tǒng)會(huì)自動(dòng)地把堆棧段地址和堆棧指針置入會(huì)自動(dòng)地把堆棧段地址和堆棧指針置入SS和和SP中,因而可以不在代中,因而可以不在代碼段中裝入碼段中裝入SS和和SP的值。的值。STACK1 SEGMENT PARA STACK STACKDB 50H DUP(?)STACK1 ENDSCODE SEGMENTASSUME CS:CODE, SS:STACK1CODE ENDS當(dāng)目標(biāo)代碼裝入存儲(chǔ)器后,當(dāng)目標(biāo)代碼裝入存儲(chǔ)器后,SS中已自動(dòng)裝入中已自動(dòng)裝入STACK段的段基值
59、,堆段的段基值,堆棧指針棧指針SP指向堆棧的底部指向堆棧的底部+1的存儲(chǔ)單元。的存儲(chǔ)單元。 第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 方法方法2:STACK1 SEGMENT PARADW 50H DUP(?)TOP LABEL WORD;TOP屬性為屬性為WORDSTACK1 ENDSCODE SEGMENTASSUME CS:CODE,SS:STACK1START:MOV AX,STACK1MOV SS,AX;堆棧段的段地址送;堆棧段的段地址送SSMOV SP,OFFSET TOP;堆棧段的棧頂?shù)刂匪停欢褩6蔚臈m數(shù)刂匪蚐PTOP是該堆棧的初始棧頂部地址。是該堆棧的初始棧頂部地址。
60、第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 4操作系統(tǒng)下匯編程序的正常結(jié)束操作系統(tǒng)下匯編程序的正常結(jié)束對(duì)于可執(zhí)行文件(對(duì)于可執(zhí)行文件(.EXE)在)在DOS提示符下正常結(jié)束可以用兩種方法:提示符下正常結(jié)束可以用兩種方法:方法方法1: MOV AX,4C00H;INT 21H方法方法2: MAIN PROC FARPUSH DS;保存原來(lái)的數(shù)據(jù)段段地址;保存原來(lái)的數(shù)據(jù)段段地址MOV AX,0H ;0送送AX PUSH AX;0壓棧壓棧RET;返回;返回DOSMAIN ENDP第第2 2章章 匯編語(yǔ)言程序格式匯編語(yǔ)言程序格式 簡(jiǎn)化的段定義書(shū)寫(xiě)簡(jiǎn)單,有利于實(shí)現(xiàn)匯編語(yǔ)言程簡(jiǎn)化的段定義書(shū)寫(xiě)簡(jiǎn)單,有
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 肝性腦病發(fā)病機(jī)制研究進(jìn)展
- 2025年幼兒園親子餐飲活動(dòng)計(jì)劃
- 校園安全與文明行為管理措施
- 2025春季小學(xué)三年級(jí)下冊(cè)語(yǔ)文閱讀推廣計(jì)劃
- 人音版小學(xué)音樂(lè)教學(xué)實(shí)施計(jì)劃
- FPGA設(shè)計(jì)與實(shí)戰(zhàn)演練課件:GPRS通信實(shí)驗(yàn)電路搭建與驅(qū)動(dòng)程序設(shè)計(jì)
- 2025年度江蘇省環(huán)保行業(yè)安全教育培訓(xùn)計(jì)劃
- 2025年內(nèi)科急診響應(yīng)機(jī)制完善計(jì)劃
- 中小企業(yè)財(cái)務(wù)工作回顧與計(jì)劃展望
- 2025年語(yǔ)文興趣班線上學(xué)習(xí)計(jì)劃
- 公務(wù)出國(guó)在職證明-英文版(因公簽證)
- 故都的秋課文原文
- 【上市公司應(yīng)收賬款審計(jì)失敗原因及應(yīng)對(duì)措施探究:以立信所審計(jì)風(fēng)華高科公司為例(論文)10000字】
- 《長(zhǎng)征勝利萬(wàn)歲》教學(xué)設(shè)計(jì) 2024-2025學(xué)年統(tǒng)編版高中語(yǔ)文選擇性必修上冊(cè)
- 2024年上海高考數(shù)學(xué)真題試題(原卷版+含解析)
- 2024年個(gè)人勞務(wù)承包合同書(shū)
- 人工智能原理及MATLAB實(shí)現(xiàn) 課件 第2章 機(jī)器學(xué)習(xí)
- 宣傳費(fèi)用結(jié)算合同
- 蘋(píng)果行業(yè)競(jìng)爭(zhēng)對(duì)手分析分析
- 公安局指揮中心工作總結(jié)
- 林業(yè)創(chuàng)業(yè)計(jì)劃書(shū)
評(píng)論
0/150
提交評(píng)論