第二章80X86指令系統(tǒng)1_第1頁
第二章80X86指令系統(tǒng)1_第2頁
第二章80X86指令系統(tǒng)1_第3頁
第二章80X86指令系統(tǒng)1_第4頁
第二章80X86指令系統(tǒng)1_第5頁
已閱讀5頁,還剩80頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、 第二章第二章 80X86指令系統(tǒng)指令系統(tǒng)2.2.1 2.2.1 指令格式指令格式匯編語言程序由若干匯編語言程序由若干“語句語句”組成,每個(gè)組成,每個(gè)“語句語句”占用一占用一行。行。三種類型語句:三種類型語句:指令語句:包含一條符號(hào)指令,與一條機(jī)器指令相對應(yīng),指令語句:包含一條符號(hào)指令,與一條機(jī)器指令相對應(yīng), 匯編以后成為這條機(jī)器指令的二進(jìn)制代碼,這匯編以后成為這條機(jī)器指令的二進(jìn)制代碼,這 個(gè)代碼被稱為個(gè)代碼被稱為“目標(biāo)目標(biāo)(Object)”;偽指令語句:一條說明性的語句。有的偽指令語句匯編后偽指令語句:一條說明性的語句。有的偽指令語句匯編后 沒有沒有“結(jié)果結(jié)果”,有的偽指令匯編后產(chǎn)生,有的偽

2、指令匯編后產(chǎn)生“目標(biāo)目標(biāo)” 。注釋行:注釋行: 書寫說明性文字,不進(jìn)行書寫說明性文字,不進(jìn)行“匯編匯編”,也不產(chǎn)生,也不產(chǎn)生“目標(biāo)目標(biāo)”。80X8680X86指令格式指令格式標(biāo)號(hào)標(biāo)號(hào): 程序員給這一行起的名字,后面跟上冒號(hào),代表這一行的程序員給這一行起的名字,后面跟上冒號(hào),代表這一行的地址。標(biāo)號(hào)用字母開始,不要使用保留字作為標(biāo)號(hào)。地址。標(biāo)號(hào)用字母開始,不要使用保留字作為標(biāo)號(hào)。操作碼是這條指令需要完成的操作,用指令助記符表示。操作碼是這條指令需要完成的操作,用指令助記符表示。操作數(shù)操作數(shù) 是指令的操作對象,指令的操作數(shù)可以有是指令的操作對象,指令的操作數(shù)可以有03個(gè)。個(gè)。兩個(gè)操作數(shù)時(shí),右面的操作

3、數(shù)稱為兩個(gè)操作數(shù)時(shí),右面的操作數(shù)稱為“源操作數(shù)源操作數(shù)”,左面的操作數(shù)稱,左面的操作數(shù)稱為為“目的操作數(shù)目的操作數(shù)”。;注釋;注釋 用來添加一些說明,例如說明本行指令的功能。用來添加一些說明,例如說明本行指令的功能。 標(biāo)號(hào)標(biāo)號(hào): 操作碼操作碼 操作數(shù)操作數(shù) ;注釋注釋 8086的指令系統(tǒng)的指令系統(tǒng) 我們已經(jīng)知道計(jì)算機(jī)是通過執(zhí)行指令序列我們已經(jīng)知道計(jì)算機(jī)是通過執(zhí)行指令序列來解決問題的,因而每種計(jì)算機(jī)都有一組指令來解決問題的,因而每種計(jì)算機(jī)都有一組指令集供給用戶使用,這組指令集就稱為計(jì)算機(jī)的集供給用戶使用,這組指令集就稱為計(jì)算機(jī)的指令系統(tǒng)。本章說明指令系統(tǒng)。本章說明8086的指令系統(tǒng)以及在指的指令

4、系統(tǒng)以及在指令中為取得操作數(shù)地址所使用的尋址方式令中為取得操作數(shù)地址所使用的尋址方式(Addressing mode)。)。指令的組成指令的組成 計(jì)算機(jī)中的指令由操作碼字段和計(jì)算機(jī)中的指令由操作碼字段和操作數(shù)字段兩部分組成。操作碼字段指操作數(shù)字段兩部分組成。操作碼字段指示計(jì)算機(jī)所要執(zhí)行的操作,比如加、減示計(jì)算機(jī)所要執(zhí)行的操作,比如加、減運(yùn)算;操作數(shù)字段指示指令執(zhí)行過程中運(yùn)算;操作數(shù)字段指示指令執(zhí)行過程中所需要的操作數(shù),它既可以是操作數(shù)本所需要的操作數(shù),它既可以是操作數(shù)本身,也可以是操作數(shù)地址或地址的一部身,也可以是操作數(shù)地址或地址的一部分,還可以是指向操作數(shù)地址的指針或分,還可以是指向操作數(shù)地

5、址的指針或其他有關(guān)操作數(shù)的信息。其他有關(guān)操作數(shù)的信息。 操作數(shù)字段可以有一個(gè)、二個(gè)或操作數(shù)字段可以有一個(gè)、二個(gè)或三個(gè),通常稱為一地址、二地址或三三個(gè),通常稱為一地址、二地址或三地址指令。地址指令。 例如,單操作數(shù)指令就是一地址指令,例如,單操作數(shù)指令就是一地址指令,它只需要指定一個(gè)操作數(shù),如加它只需要指定一個(gè)操作數(shù),如加1指令只需要指令只需要指出需要加指出需要加1 的操作數(shù)。大多數(shù)運(yùn)算型指令可的操作數(shù)。大多數(shù)運(yùn)算型指令可使用三地址指令:除給出參加運(yùn)算的兩個(gè)操作使用三地址指令:除給出參加運(yùn)算的兩個(gè)操作數(shù)外,還指出運(yùn)算結(jié)果的存放地址。也可使用數(shù)外,還指出運(yùn)算結(jié)果的存放地址。也可使用二地址指令,此時(shí)

6、分別稱兩個(gè)操作數(shù)為源操作二地址指令,此時(shí)分別稱兩個(gè)操作數(shù)為源操作數(shù)(數(shù)(source)和目的操作數(shù)()和目的操作數(shù)(destination)。)。盡管在指令執(zhí)行前這兩個(gè)操作數(shù)都是輸入操作盡管在指令執(zhí)行前這兩個(gè)操作數(shù)都是輸入操作數(shù),但指令執(zhí)行后將把運(yùn)算結(jié)果存放到目的操數(shù),但指令執(zhí)行后將把運(yùn)算結(jié)果存放到目的操作數(shù)的地址之中。作數(shù)的地址之中。8086的大多數(shù)運(yùn)算型指令的大多數(shù)運(yùn)算型指令就采用這種二地址指令。就采用這種二地址指令。 8086的尋址方式包括與數(shù)據(jù)的尋址方式包括與數(shù)據(jù)有關(guān)的尋址方式和與轉(zhuǎn)移地址有有關(guān)的尋址方式和與轉(zhuǎn)移地址有關(guān)的尋址方式,關(guān)的尋址方式,CPU根據(jù)這些根據(jù)這些尋址方式以不同的方

7、法取得操作尋址方式以不同的方法取得操作數(shù)。數(shù)。與數(shù)據(jù)有關(guān)的尋址方式與數(shù)據(jù)有關(guān)的尋址方式 此類尋址方式用來確定操作數(shù)地址從而此類尋址方式用來確定操作數(shù)地址從而找到操作數(shù)。找到操作數(shù)。操作數(shù)尋址方式的討論均以操作數(shù)尋址方式的討論均以 MOV destination, source 為例,這是一條數(shù)據(jù)傳送指令,第一操作數(shù)為為例,這是一條數(shù)據(jù)傳送指令,第一操作數(shù)為目的操作數(shù)目的操作數(shù)destination,第二操作數(shù)為源操,第二操作數(shù)為源操作數(shù)作數(shù)source,指令執(zhí)行的結(jié)果是把,指令執(zhí)行的結(jié)果是把source送送到到destination中去。中去。1 立即尋址方式(立即尋址方式(Immediate

8、 addressing) 操作數(shù)直接存放在指令中,緊跟在操作操作數(shù)直接存放在指令中,緊跟在操作碼之后,它作為指令的一部分存放在代碼段碼之后,它作為指令的一部分存放在代碼段里,這種操作數(shù)稱為立即數(shù)里,這種操作數(shù)稱為立即數(shù). 立即數(shù)可以是立即數(shù)可以是8位的或位的或16位的。如果是位的。如果是16 位數(shù),則高位字節(jié)存放在高地址中,低位數(shù),則高位字節(jié)存放在高地址中,低位字節(jié)存放在低地址中。位字節(jié)存放在低地址中。立即尋址方式常用于給寄存器賦初值,立即尋址方式常用于給寄存器賦初值,并且只能用于源操作數(shù)字段,不能用于目的并且只能用于源操作數(shù)字段,不能用于目的操作數(shù)字段。操作數(shù)字段。例例 MOV AL, 9H

9、指令執(zhí)行后,(指令執(zhí)行后,(AL)= 09H例例 MOV AX, 3064H指令執(zhí)行后,(指令執(zhí)行后,(AX)= 3064H下圖表示了它的執(zhí)行情況,圖中指令存放下圖表示了它的執(zhí)行情況,圖中指令存放在代碼段中,在代碼段中,OP表示該指令的操作碼部分,表示該指令的操作碼部分,3064H為立即數(shù),它是指令的一個(gè)組成部分。為立即數(shù),它是指令的一個(gè)組成部分。注意:不能直接給段寄存器和標(biāo)志寄存注意:不能直接給段寄存器和標(biāo)志寄存器賦予立即數(shù)。器賦予立即數(shù)。顯然,下面的指令是錯(cuò)誤的:顯然,下面的指令是錯(cuò)誤的:MOV DS, 1250H 2 存器尋址方式(存器尋址方式(Register addressing)它

10、使用寄存器來存放要處理的操作數(shù),它使用寄存器來存放要處理的操作數(shù),寄存器號(hào)由指令指定。寄存器號(hào)由指令指定。 對于對于16位操作數(shù),寄存器可以是位操作數(shù),寄存器可以是AX、BX、CX、DX、SI、DI、SP、BP、CS、DS、ES和和SS;對于;對于8位操作數(shù),寄存器可位操作數(shù),寄存器可以是以是AL、AH、BL、BH、CL、CH、DL、DH。由于操作數(shù)就在寄存器中,指令執(zhí)行。由于操作數(shù)就在寄存器中,指令執(zhí)行時(shí)不需要訪問存儲(chǔ)器,因此這是一種快速時(shí)不需要訪問存儲(chǔ)器,因此這是一種快速的尋址方式。的尋址方式。 例例 MOV AX, BX 如指令執(zhí)行前(如指令執(zhí)行前(AX)= 1234H,(,(BX)=

11、5678H;則指令執(zhí)行后(則指令執(zhí)行后(AX)= 5678H,(,(BX)保)保持不變。持不變。注意:源寄存器和目的寄存器的位數(shù)必注意:源寄存器和目的寄存器的位數(shù)必須一致。須一致。例如:例如:MOV CL, BX是一條錯(cuò)誤指令。是一條錯(cuò)誤指令。除上述兩種尋址方式外,下面五除上述兩種尋址方式外,下面五種尋址方式的操作數(shù)都在除代碼段種尋址方式的操作數(shù)都在除代碼段以外的存儲(chǔ)區(qū)中。以外的存儲(chǔ)區(qū)中。這里先引入有效地址這里先引入有效地址EA(Effective Address)的概念:在)的概念:在8086里,把操作數(shù)的偏移地址稱為里,把操作數(shù)的偏移地址稱為有效地址,下面五種計(jì)算有效地址,下面五種計(jì)算EA

12、的方法的方法體現(xiàn)了五種尋址方式。體現(xiàn)了五種尋址方式。 3 存儲(chǔ)器尋址方式存儲(chǔ)器尋址方式 (1)直接尋址方式(直接尋址方式(Direct addressing) 在這種尋址方式中,操作數(shù)存放在在這種尋址方式中,操作數(shù)存放在存儲(chǔ)單元中,而這個(gè)存儲(chǔ)單元的有效地存儲(chǔ)單元中,而這個(gè)存儲(chǔ)單元的有效地址就在指令的操作碼之后,操作數(shù)的物址就在指令的操作碼之后,操作數(shù)的物理地址可通過(理地址可通過((DS)16)再加上這個(gè))再加上這個(gè)有效地址形成。有效地址形成。 例例 MOV AX, 2000H如果(如果(DS)= 3000H,則執(zhí)行情況如圖所示。,則執(zhí)行情況如圖所示。最后的執(zhí)行結(jié)果為(最后的執(zhí)行結(jié)果為(AX)

13、= 3050H。 在匯編語言指令中,可以用符在匯編語言指令中,可以用符號(hào)地址(變量名或標(biāo)號(hào))代替數(shù)值號(hào)地址(變量名或標(biāo)號(hào))代替數(shù)值地址。地址。例如:例如: MOV AX, DATA或或 MOV AX, DATA這里這里DATA是存放操作數(shù)單是存放操作數(shù)單元的符號(hào)地址。元的符號(hào)地址。 直接尋址方式默認(rèn)操作數(shù)在數(shù)據(jù)段中,如直接尋址方式默認(rèn)操作數(shù)在數(shù)據(jù)段中,如果操作數(shù)定義在其它段中,則應(yīng)在指令中指定段果操作數(shù)定義在其它段中,則應(yīng)在指令中指定段跨越前綴。跨越前綴。例如:例如: MOV AX, ES:NUMBER或或 MOV AX, ES:NUMBER這里這里NUMBER是附加段中的字變量。是附加段中的

14、字變量。直接尋址方式適合于處理單個(gè)變量。直接尋址方式適合于處理單個(gè)變量。 (2) 寄存器間接尋址方式(寄存器間接尋址方式(Register indirect addressing) 這種尋址方式通過基址寄存器這種尋址方式通過基址寄存器BX、BP或變址寄存器或變址寄存器SI、DI來保存操作數(shù)的有效地來保存操作數(shù)的有效地址。如果指令中使用的寄存器是址。如果指令中使用的寄存器是SI、DI和和BX,則操作數(shù)在數(shù)據(jù)段中,(則操作數(shù)在數(shù)據(jù)段中,((DS)16)再加上)再加上寄寄存器中的有效地址形成存器中的有效地址形成20位物理地址;如位物理地址;如果指令中使用的寄存器是果指令中使用的寄存器是BP,則操作數(shù)

15、在堆,則操作數(shù)在堆棧段中,(棧段中,((SS)16)再加上)再加上BP中的有效地中的有效地址形成址形成20位物理地址。位物理地址。 指令中也可以指定段跨越前綴來取指令中也可以指定段跨越前綴來取得其他段中的數(shù)據(jù)。得其他段中的數(shù)據(jù)。例如:例如:MOV AX, ES:BX 這種尋址方式可以用于表格處理。這種尋址方式可以用于表格處理?;坊蜃冎芳拇嫫鞒跏蓟癁楸砀竦幕坊蜃冎芳拇嫫鞒跏蓟癁楸砀竦氖椎刂罚咳∫粋€(gè)數(shù)據(jù)就修改寄存器的首地址,每取一個(gè)數(shù)據(jù)就修改寄存器的值,使之指向下一個(gè)數(shù)據(jù)。值,使之指向下一個(gè)數(shù)據(jù)。 例例 MOV AX, BX 如果(如果(DS)= 2000H, (BX)= 1000H,則物理

16、地址則物理地址 = 20000H + 1000H = 21000H執(zhí)行情況如圖所示,最后的執(zhí)行結(jié)果為執(zhí)行情況如圖所示,最后的執(zhí)行結(jié)果為(AX)= 50A0H。 (3) 寄存器相對尋址方式(寄存器相對尋址方式(Register relative addressing)(也稱直接變址尋址方式(也稱直接變址尋址方式) 這種尋址方式通過基址寄存器這種尋址方式通過基址寄存器BX、BP或變址寄存器或變址寄存器SI、DI與一個(gè)位移量相與一個(gè)位移量相加形成有效地址,計(jì)算物理地址的缺省加形成有效地址,計(jì)算物理地址的缺省段仍然是段仍然是SI、DI和和BX為為DS,BP為為SS。 這種尋址方式同樣可用于表格處理。這

17、種尋址方式同樣可用于表格處理。表格的首地址可設(shè)置為位移量,修改表格的首地址可設(shè)置為位移量,修改基址或變址寄存器的內(nèi)容取得表格中的值?;坊蜃冎芳拇嫫鞯膬?nèi)容取得表格中的值。 例例 MOV AX, COUNTSI(也可表示為(也可表示為 MOV AX, COUNT+SI) 其中其中COUNT為為16位位移量的符號(hào)地址。位位移量的符號(hào)地址。如果如果 (DS)= 3000H,(,(SI)= 2000H,COUNT = 3000H則物理地址則物理地址 = 30000H + 2000H + 3000H = 35000H指令執(zhí)行情況如圖所示,最后的執(zhí)行結(jié)果是(指令執(zhí)行情況如圖所示,最后的執(zhí)行結(jié)果是(AX)=

18、 1234H。 (4) 基址變址尋址方式基址變址尋址方式 (Based indexed addressing)這是一種基址加變址來定位操作數(shù)這是一種基址加變址來定位操作數(shù)地址的方式,也就是說,操作數(shù)的有效地址的方式,也就是說,操作數(shù)的有效地址是一個(gè)基址寄存器(地址是一個(gè)基址寄存器(BP或或BX)和)和一個(gè)變址寄存器(一個(gè)變址寄存器(SI或或DI)的內(nèi)容之和。)的內(nèi)容之和。如基址寄存器為如基址寄存器為BX時(shí),與時(shí),與DS形成的物形成的物理地址指向數(shù)據(jù)段;如基址寄存器為理地址指向數(shù)據(jù)段;如基址寄存器為BP時(shí),與時(shí),與SS形成的物理地址指向堆棧段。形成的物理地址指向堆棧段。 注意:一條指令中同時(shí)使用

19、基址寄注意:一條指令中同時(shí)使用基址寄存器或變址寄存器是錯(cuò)誤的。存器或變址寄存器是錯(cuò)誤的。例如:例如:MOV CL, BX+BP 或或 MOV AX, SI+DI 均為非法指令。均為非法指令。 這種尋址方式同樣適用于數(shù)組或表這種尋址方式同樣適用于數(shù)組或表格處理。格處理。首地址可存放在基址寄存器中,而首地址可存放在基址寄存器中,而用變址寄存器來訪問數(shù)組中的各個(gè)元素。用變址寄存器來訪問數(shù)組中的各個(gè)元素。由于兩個(gè)寄存器的值都可以修改,所以由于兩個(gè)寄存器的值都可以修改,所以它比寄存器相對尋址方式更加靈活。它比寄存器相對尋址方式更加靈活。 例例 MOV AX, BXDI (或?qū)憺椋ɑ驅(qū)憺?MOV AX,

20、BX+DI)如)如 (DS ) = 2100H,(,(BX)= 0158H,(,(DI)= 10A5H則則 EA = 0158H +10A5H = 11FDH物理地址物理地址 = 21000H +11FDH = 221FDH指令執(zhí)行情況如圖所示,最后的執(zhí)行結(jié)果是指令執(zhí)行情況如圖所示,最后的執(zhí)行結(jié)果是(AX)= 1234H。 (5) 相對基址變址尋址方式(相對基址變址尋址方式(Relative based indexed addressing) 這種尋址方式與基址變址尋址方式類這種尋址方式與基址變址尋址方式類似,不同的是基址加變址再加上一個(gè)位移量似,不同的是基址加變址再加上一個(gè)位移量形成操作數(shù)的

21、有效地址。缺省段的使用仍然形成操作數(shù)的有效地址。缺省段的使用仍然是是DS與與BX組合,組合,SS與與BP組合。組合。 綜上所述,有效地址可以由以下三種成綜上所述,有效地址可以由以下三種成分組成:分組成: 位移量(位移量(Displacement)是存放在指令)是存放在指令中的一個(gè)中的一個(gè)8位或位或16位數(shù),但它不是立即數(shù),而位數(shù),但它不是立即數(shù),而是一個(gè)地址。是一個(gè)地址。 基址(基址(Base)是存放在基址寄存器)是存放在基址寄存器(BX或或BP)中的內(nèi)容。它是有效地址中的基)中的內(nèi)容。它是有效地址中的基址部分,通常用來指向數(shù)據(jù)段中數(shù)組或字符串址部分,通常用來指向數(shù)據(jù)段中數(shù)組或字符串的首地址。

22、的首地址。 變址(變址(Index)是存放在變址寄存器()是存放在變址寄存器(SI或或DI)中的內(nèi)容。它通常用來訪問數(shù)組中的某)中的內(nèi)容。它通常用來訪問數(shù)組中的某個(gè)元素或字符串中的某個(gè)字符。個(gè)元素或字符串中的某個(gè)字符。 有效地址的計(jì)算可用下式表示:有效地址的計(jì)算可用下式表示:EA = 基址基址 + 變址變址 + 位移量位移量這三種成分都可正可負(fù),以保證指針移這三種成分都可正可負(fù),以保證指針移動(dòng)的靈活性。它們?nèi)我饨M合使用,可得到動(dòng)的靈活性。它們?nèi)我饨M合使用,可得到不同的尋址方式。不同的尋址方式。例例 MOV AX, MASKBXSI(或(或 MOV AX, MASKBX+SI,或,或 MOV A

23、X, MASK+BX+SI) 如(如(DS)= 3000H,(,(BX)= 2000H,(,(SI)= 1000H,MASK = 0250H,則物理地址則物理地址 = 30000H + 2000H + 1000H + 0250H = 33250H指令執(zhí)行情況如圖所示,最后的執(zhí)行結(jié)果是(指令執(zhí)行情況如圖所示,最后的執(zhí)行結(jié)果是(AX)= 1234H。 8086的指令系統(tǒng)的指令系統(tǒng) 匯編語言的指令系統(tǒng)是程序設(shè)計(jì)的匯編語言的指令系統(tǒng)是程序設(shè)計(jì)的基礎(chǔ),這里主要介紹基礎(chǔ),這里主要介紹8086的指令系統(tǒng)。的指令系統(tǒng)。8086指令系統(tǒng)分為以下指令系統(tǒng)分為以下6組:組: 數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令 算術(shù)指令算術(shù)指

24、令 邏輯指令邏輯指令 串處理指令串處理指令 控制轉(zhuǎn)移指令控制轉(zhuǎn)移指令 處理機(jī)控制指令處理機(jī)控制指令2.2 數(shù)據(jù)傳送類指令數(shù)據(jù)傳送類指令數(shù)據(jù)傳送指令的功能是把數(shù)據(jù)、地?cái)?shù)據(jù)傳送指令的功能是把數(shù)據(jù)、地址傳送到寄存器或存儲(chǔ)器單元中。它分址傳送到寄存器或存儲(chǔ)器單元中。它分為為4類。類。 通用數(shù)據(jù)傳送指令通用數(shù)據(jù)傳送指令 累加器專用傳送指令累加器專用傳送指令 MOV 傳送傳送 IN 輸入輸入 PUSH進(jìn)棧進(jìn)棧 OUT 輸出輸出 POP 出棧出棧 XLAT換碼換碼 XCHG交換交換 地址傳送指令地址傳送指令 標(biāo)志寄存器傳送指令標(biāo)志寄存器傳送指令 LEA 有效地址送寄存器有效地址送寄存器 LAHF標(biāo)志送標(biāo)志送

25、AH LDS 指針?biāo)图拇嫫骱椭羔標(biāo)图拇嫫骱虳SSAHFAH送標(biāo)志寄存器送標(biāo)志寄存器 LES 指針?biāo)图拇嫫骱椭羔標(biāo)图拇嫫骱虴S PUSHF 標(biāo)志進(jìn)棧標(biāo)志進(jìn)棧 POPF標(biāo)志出棧標(biāo)志出棧2.2.1 通用數(shù)據(jù)傳送指令通用數(shù)據(jù)傳送指令MOVdst, src;傳送指令(傳送指令(move)執(zhí)行操作:執(zhí)行操作:(dst) (src)功能:功能: 將源操作數(shù)(字節(jié)或字)傳送將源操作數(shù)(字節(jié)或字)傳送到目的地址。到目的地址。P40例例 MOV AX,DATA_SEG MOV DS,AX 例例 MOV AL,E例例 MOV BX,OFFSET TABLE例例 MOV AX,YBPSI注意:注意: 目的操作數(shù)目的操

26、作數(shù)dst和源操作數(shù)和源操作數(shù)src不能同時(shí)用存儲(chǔ)器尋址方式,這個(gè)限制不能同時(shí)用存儲(chǔ)器尋址方式,這個(gè)限制適用于所有指令;適用于所有指令; 目的操作數(shù)目的操作數(shù)dst不能是不能是CS,也,也不能用立即數(shù)方式;不能用立即數(shù)方式; 目的操作數(shù)目的操作數(shù)dst和源操作數(shù)和源操作數(shù)src不允許同時(shí)為段寄存器;不允許同時(shí)為段寄存器; MOV指令不影響標(biāo)志位。指令不影響標(biāo)志位。源操作數(shù)可以是:寄存器、存儲(chǔ)器、立即數(shù);源操作數(shù)可以是:寄存器、存儲(chǔ)器、立即數(shù);目的操作數(shù)可以是:寄存器、存儲(chǔ)器。目的操作數(shù)可以是:寄存器、存儲(chǔ)器。IMRIMR(a)正確的數(shù)據(jù)傳送操作(b)錯(cuò)誤的數(shù)據(jù)傳送操作SS數(shù)據(jù)的定義數(shù)據(jù)的定義

27、程序取得所需空間的方法有兩種,一種是在加載程程序取得所需空間的方法有兩種,一種是在加載程序的時(shí)候?yàn)槌绦蚍峙?,再就是程序在?zhí)行的過程中向系統(tǒng)序的時(shí)候?yàn)槌绦蚍峙洌倬褪浅绦蛟趫?zhí)行的過程中向系統(tǒng)申請。課程中不討論第二種方法。申請。課程中不討論第二種方法。 若要一個(gè)程序在被加載的時(shí)候取得所需的空間,則若要一個(gè)程序在被加載的時(shí)候取得所需的空間,則必須要在源程序中做出說明。通過在源程序中定義段來進(jìn)必須要在源程序中做出說明。通過在源程序中定義段來進(jìn)行內(nèi)存空間的獲取。行內(nèi)存空間的獲取。 為了程序設(shè)計(jì)上的清晰和方便,一般也都定義不同為了程序設(shè)計(jì)上的清晰和方便,一般也都定義不同的段來存放他們。的段來存放他們。 在

28、程序中定義要處理的數(shù)據(jù),這些數(shù)據(jù)會(huì)被編譯、在程序中定義要處理的數(shù)據(jù),這些數(shù)據(jù)會(huì)被編譯、連接程序作為程序的一部分寫到可執(zhí)行文件中。當(dāng)可執(zhí)行連接程序作為程序的一部分寫到可執(zhí)行文件中。當(dāng)可執(zhí)行文件中的程序被加載入內(nèi)存時(shí),這些數(shù)據(jù)也同時(shí)被加載入文件中的程序被加載入內(nèi)存時(shí),這些數(shù)據(jù)也同時(shí)被加載入內(nèi)存。與此同時(shí),要處理的數(shù)據(jù)也就自然而然地獲得了存內(nèi)存。與此同時(shí),要處理的數(shù)據(jù)也就自然而然地獲得了存儲(chǔ)空間。儲(chǔ)空間。 數(shù)據(jù)段數(shù)據(jù)段 數(shù)據(jù)定義數(shù)據(jù)定義 匯編語言程序定義的匯編語言程序定義的“數(shù)據(jù)數(shù)據(jù)” :(1) 變量(變量(Varible):有一個(gè)名字,運(yùn)行過程中值可能發(fā)生變有一個(gè)名字,運(yùn)行過程中值可能發(fā)生變化,可

29、以有化,可以有“初始值初始值”。(2) 常數(shù)(常數(shù)(Constant):常數(shù)可以直接寫在指令內(nèi),也可以):常數(shù)可以直接寫在指令內(nèi),也可以存放在數(shù)據(jù)段內(nèi)。存放在數(shù)據(jù)段內(nèi)。(3) 緩沖區(qū)(緩沖區(qū)(Buffer):從輸入設(shè)備輸入若干數(shù)據(jù)時(shí),在數(shù)據(jù)):從輸入設(shè)備輸入若干數(shù)據(jù)時(shí),在數(shù)據(jù)段里事先留出必要的存儲(chǔ)單元,稱為段里事先留出必要的存儲(chǔ)單元,稱為“輸入緩沖區(qū)輸入緩沖區(qū)”。輸出一。輸出一批數(shù)據(jù)時(shí),把輸出內(nèi)容事先存放在若干內(nèi)存單元中,稱為批數(shù)據(jù)時(shí),把輸出內(nèi)容事先存放在若干內(nèi)存單元中,稱為“輸輸出緩沖區(qū)出緩沖區(qū)”。數(shù)據(jù)段數(shù)據(jù)段DATA SEGMENT ; 在這里定義數(shù)據(jù);在這里定義數(shù)據(jù); ; DATA EN

30、DSDATA:程序員給這個(gè)段起的名字。程序員給這個(gè)段起的名字。SEGMENT:保留字,說明一個(gè)段從這里開始。:保留字,說明一個(gè)段從這里開始。ENDS:保留字,說明一個(gè)段到此結(jié)束。保留字,說明一個(gè)段到此結(jié)束。 ;分號(hào)后面的文字是分號(hào)后面的文字是“注釋注釋”,不參加匯編,不參加匯編語句語句” : 由一行文字構(gòu)成,由一行文字構(gòu)成, 是一條指令,是一條指令, 或者定義一組數(shù)據(jù),或者定義一組數(shù)據(jù), 或者是一條或者是一條“偽指令偽指令”。偽指令偽指令:說明性的語句:說明性的語句數(shù)據(jù)定義數(shù)據(jù)定義數(shù)據(jù)定義偽指令數(shù)據(jù)定義偽指令:變量名變量名 數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作 數(shù)據(jù)數(shù)據(jù) ,數(shù)據(jù),數(shù)據(jù)數(shù)據(jù)定義偽操作:數(shù)

31、據(jù)定義偽操作: DB(Define Byte):每個(gè)數(shù)據(jù)占用一個(gè)字節(jié)():每個(gè)數(shù)據(jù)占用一個(gè)字節(jié)(8b) DW(Define Word):每個(gè)數(shù)據(jù)占用一個(gè)字():每個(gè)數(shù)據(jù)占用一個(gè)字(16b) DD(Define Double Word):每個(gè)數(shù)據(jù)占用一個(gè)雙字):每個(gè)數(shù)據(jù)占用一個(gè)雙字(32b) DQ(Define QuartWord):每個(gè)數(shù)據(jù)占用):每個(gè)數(shù)據(jù)占用8個(gè)字節(jié)個(gè)字節(jié)(64b) DT(Define TenByte):每個(gè)數(shù)據(jù)占用):每個(gè)數(shù)據(jù)占用10個(gè)字節(jié)(個(gè)字節(jié)(80b)數(shù)據(jù)定義舉例(數(shù)據(jù)定義舉例(1): 有符號(hào)數(shù)用它的補(bǔ)碼存儲(chǔ)有符號(hào)數(shù)用它的補(bǔ)碼存儲(chǔ) 字符用它的字符用它的ASCII代碼存

32、儲(chǔ)代碼存儲(chǔ) db定義的數(shù)據(jù)在定義的數(shù)據(jù)在 -128255 之內(nèi)之內(nèi) 變量名代表這個(gè)單元的地址變量名代表這個(gè)單元的地址 ?表示一個(gè)尚未確定的值,用表示一個(gè)尚未確定的值,用0先行填充先行填充 DUP表示重復(fù)定義表示重復(fù)定義DATA SEGMENTXdb-1, 255, A, 3+2, ? db“ABC”, 0FFH, 11001010BYdb3 dup (?)DATA ENDS DATA SEGMENT X DB -1,255,A,3+2,? DB ABC,0FFH,11001010B Y DB 3 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:D

33、ATA START: MOV AX,DATA MOV ds,ax MOV AL,X MOV AH,4CH INT 21H CODE ENDS END START例例 Hello Worlddata segment STRING DB 0AH, 0DH, Hello Word!, 0AH, 0DH, $data endsCODE SEGMENTASSUME CS: CODE, DS: DATA START: MOVAX, DATA MOVDS, AX LEADX, STRING MOVAH, 9 INT 21H MOVAX, 4C00H INT 21HCODE ENDSENDSTART數(shù)據(jù)定義舉

34、例(數(shù)據(jù)定義舉例(2): DW定義的數(shù)據(jù)在(定義的數(shù)據(jù)在(-32768,+65535)內(nèi))內(nèi) 出現(xiàn)在數(shù)據(jù)部分的變量名代表這個(gè)變量的偏出現(xiàn)在數(shù)據(jù)部分的變量名代表這個(gè)變量的偏 移地址移地址 多字節(jié)數(shù)據(jù)的高位存放在較高地址單元中多字節(jié)數(shù)據(jù)的高位存放在較高地址單元中DSEG SEGMENTZDW -2, -32768, 65535, ABWDD 12345678H, -400000DW Z, W-ZDSEG ENDS 變量變量X,Y,Z,W的屬性的屬性變量變量名名段屬性段屬性SEG偏移地址偏移地址OFFSET類類 型型TYPE長長 度度LENGTH大大 小小SIZEXDATA0000H111YDATA

35、000AH133ZDSEG0000H212WDSEG0008H212例例 編寫程序,把編寫程序,把4個(gè)元素的字節(jié)數(shù)組個(gè)元素的字節(jié)數(shù)組ARRAY清零。清零。DATASEGMENTARRAYDB4 DUP (?)DATAENDSCODESEGMENTASSUMECS: CODE, DS: DATASTART:MOVAX, DATAMOVDS, AXMOVARRAY, 0;第一個(gè)元素清零;第一個(gè)元素清零MOVARRAY+1, 0;第二個(gè)元素清零;第二個(gè)元素清零MOVARRAY+2, 0;第三個(gè)元素清零;第三個(gè)元素清零MOVARRAY+3, 0;第四個(gè)元素清零;第四個(gè)元素清零MOVAX, 4C00HI

36、NT21HCODEENDSENDSTARTMOV AX, 0LEA BX, ARRAY ;數(shù)組;數(shù)組ARRAY首地址裝入首地址裝入BXMOV WORD PTR BX, AX ;第一、第二個(gè)元素清零;第一、第二個(gè)元素清零MOV WORD PTR BX+2, AX ;第三、第四個(gè)元素清零;第三、第四個(gè)元素清零一次將兩個(gè)元素同時(shí)清零:一次將兩個(gè)元素同時(shí)清零:MOV WORD PTR ARRAY, 0 ;第一、第二個(gè)元素清零;第一、第二個(gè)元素清零MOV WORD PTR ARRAY+2, 0 ;第三、第四個(gè)元素清零;第三、第四個(gè)元素清零使用立即數(shù)指令代碼較長。把這個(gè)立即數(shù)事先存放在寄存器中:使用立即數(shù)

37、指令代碼較長。把這個(gè)立即數(shù)事先存放在寄存器中:MOV AX, 0MOV WORD PTR ARRAY, AX ;第一、第二個(gè)元素清零;第一、第二個(gè)元素清零MOV WORD PTR ARRAY+2, AX ;第三、第四個(gè)元素清零;第三、第四個(gè)元素清零把數(shù)組把數(shù)組ARRAY的首地址事先裝入地址寄存器,程序更簡捷:的首地址事先裝入地址寄存器,程序更簡捷:例例 字?jǐn)?shù)組字?jǐn)?shù)組X的最后的最后2個(gè)元素值送入個(gè)元素值送入Y數(shù)組對應(yīng)單元數(shù)組對應(yīng)單元DATASEGMENTXDW 55, 112, 37, 82YDW 4 DUP (?)DATAENDSCODESEGMENTASSUMECS: CODE, DS: D

38、ATASTART:MOV AX, DATAMOVDS, AXMOVDI, 4;第三個(gè)元素在數(shù)組內(nèi)的位移;第三個(gè)元素在數(shù)組內(nèi)的位移MOVAX, XDI;取出;取出X數(shù)組第三個(gè)元素?cái)?shù)組第三個(gè)元素MOVYDI, AX;送入;送入Y數(shù)組第三個(gè)元素中數(shù)組第三個(gè)元素中MOVAX, XDI+2;取出;取出X數(shù)組第四個(gè)元素?cái)?shù)組第四個(gè)元素MOVYDI+2, AX;送入;送入Y數(shù)組第四個(gè)元素中數(shù)組第四個(gè)元素中MOVAX, 4C00HINT 21HCODEENDSENDSTART2.2.2 交換指令交換指令 xchg dst, src2.2.3 2.2.3 堆棧堆棧 堆棧(堆棧(STACK)是用戶使用的存儲(chǔ)器的一部

39、分,用來存放臨時(shí)性的)是用戶使用的存儲(chǔ)器的一部分,用來存放臨時(shí)性的數(shù)據(jù)和其他信息,例如函數(shù)使用的局部變量、調(diào)用子程序的入口參數(shù)、數(shù)據(jù)和其他信息,例如函數(shù)使用的局部變量、調(diào)用子程序的入口參數(shù)、返回地址等。返回地址等。 堆棧的段基址必須放在堆棧的段基址必須放在SS中。中。堆棧段的堆棧段的“棧頂棧頂”地址(偏移地址)地址(偏移地址)放在放在SP寄存器中。寄存器中。SSSP堆棧段(棧 頂)棧 底已使用已使用 在在SEGMENT偽指令中增加偽指令中增加“STACK”表示該段是表示該段是“堆棧堆?!薄_@。這個(gè)程序裝入時(shí),操作系統(tǒng)把個(gè)程序裝入時(shí),操作系統(tǒng)把SSEG的段基址置入的段基址置入SS,堆棧段的字節(jié),

40、堆棧段的字節(jié)數(shù)(數(shù)(“棧底棧底”位置,本例中為位置,本例中為200= 0C8H)置入)置入SP。1. 堆棧段結(jié)構(gòu)堆棧段結(jié)構(gòu) SSEG SEGMENT STACK ;堆棧段開始;堆棧段開始 DW100 DUP(?);大小為;大小為100個(gè)字個(gè)字 SSEG ENDS;堆棧段結(jié)束;堆棧段結(jié)束堆棧段的定義:堆棧段的定義: 從較大地址開始分配和使用(數(shù)據(jù)段、代碼段從較小地址開從較大地址開始分配和使用(數(shù)據(jù)段、代碼段從較小地址開 始分配和使用);始分配和使用); 由由SP中地址指出的存儲(chǔ)單元稱為中地址指出的存儲(chǔ)單元稱為“棧頂棧頂”,數(shù)據(jù)總是在,數(shù)據(jù)總是在“棧頂棧頂” 位置存入(稱為位置存入(稱為“壓入壓入

41、”)、取出(稱為)、取出(稱為“彈出彈出”);); 最先進(jìn)入的數(shù)據(jù)最后被彈出(最先進(jìn)入的數(shù)據(jù)最后被彈出(First In Last Out, FILO),), 最后進(jìn)入的數(shù)據(jù)最先被彈出(最后進(jìn)入的數(shù)據(jù)最先被彈出(Last In First Out, LIFO)堆棧段的特點(diǎn)堆棧段的特點(diǎn):壓入壓入2B數(shù)據(jù)的操作數(shù)據(jù)的操作 SP(SP)2 SS: SP 數(shù)據(jù)數(shù)據(jù) 彈出彈出2B數(shù)據(jù)的操作數(shù)據(jù)的操作 目的操作數(shù)目的操作數(shù)SS: SP SP(SP) + 2 PUSH src ; 進(jìn)棧指令(進(jìn)棧指令(push onto the stack) 執(zhí)行操作:執(zhí)行操作: (SP) (SP)2 (SP+1)(SP)

42、(src)POP dst ; 出棧指令(出棧指令(pop from the stack) 執(zhí)行操作:執(zhí)行操作: (dst) (SP+1)(SP) (SP) (SP)+2 PUSH和和POP指令分別將數(shù)據(jù)存指令分別將數(shù)據(jù)存入堆棧或把堆棧中的數(shù)據(jù)取出。堆棧是入堆?;虬讯褩V械臄?shù)據(jù)取出。堆棧是以以LIFO(后進(jìn)先出)方式工作的一個(gè)存(后進(jìn)先出)方式工作的一個(gè)存儲(chǔ)區(qū),程序中定義的堆棧段就是這樣一儲(chǔ)區(qū),程序中定義的堆棧段就是這樣一個(gè)個(gè)LIFO存儲(chǔ)區(qū)。數(shù)據(jù)存入堆棧單元或從存儲(chǔ)區(qū)。數(shù)據(jù)存入堆棧單元或從堆棧單元中取出都由堆棧指針堆棧單元中取出都由堆棧指針SP指示,指示,而而SP總是指向棧頂總是指向棧頂,所以進(jìn)

43、棧和出棧指,所以進(jìn)棧和出棧指令都會(huì)令都會(huì)自動(dòng)修改自動(dòng)修改SP。 PUSH指令執(zhí)行時(shí),指令執(zhí)行時(shí),SP的內(nèi)容先的內(nèi)容先減減2,然后將數(shù)據(jù)壓入,然后將數(shù)據(jù)壓入SP所指示的字單所指示的字單元,存儲(chǔ)的方法同樣是高元,存儲(chǔ)的方法同樣是高8位存入高地址位存入高地址字節(jié),低字節(jié),低8位存入低地址字節(jié)。位存入低地址字節(jié)。POP指指令執(zhí)行時(shí),將令執(zhí)行時(shí),將SP所指示的棧頂?shù)刂返膬?nèi)所指示的棧頂?shù)刂返膬?nèi)容取出放入目的地址,然后容取出放入目的地址,然后SP增增2,指,指向新的棧頂?shù)刂贰O蛐碌臈m數(shù)刂贰?例例 PUSH AX;();()()()()()例例()()()()()?()?。注意:注意: PUSH和和POP指

44、令只能是字操作,指令只能是字操作,因此存取字?jǐn)?shù)據(jù)后,因此存取字?jǐn)?shù)據(jù)后,SP的修改必須是的修改必須是2或或2; PUSH和和POP指令不能使用立即數(shù)指令不能使用立即數(shù)方式;方式; POP指令的指令的dst不允許是不允許是CS寄存器;寄存器; PUSH和和POP指令都不影響標(biāo)志位。指令都不影響標(biāo)志位。 PUSH指令在程序中常用來暫存某些數(shù)指令在程序中常用來暫存某些數(shù)據(jù),而據(jù),而POP指令又可將這些數(shù)據(jù)恢復(fù)。指令又可將這些數(shù)據(jù)恢復(fù)。 例例 假設(shè)假設(shè)(DS)=1000H, (SS)=4000H, (SP)=100H, (BX)=2100H, (12100)=00A8H, 指出連續(xù)執(zhí)行下列各條指令后,有

45、關(guān)寄存器、指出連續(xù)執(zhí)行下列各條指令后,有關(guān)寄存器、存儲(chǔ)單元以及堆棧的情況。存儲(chǔ)單元以及堆棧的情況。PUSH DSPUSH BXPUSH BX? POP DIPOP WORD PTR DI+2POP DS 執(zhí)行結(jié)果執(zhí)行結(jié)果: (SP)=100H2=0FEH (SP)=0FE2=0FCH (SP)=0FC-2=0FAH (400FEH)=1000H (400FCH)=2100H (400FAH)=00A8H 執(zhí)行結(jié)果執(zhí)行結(jié)果: (SP)=0FA+2=0FCH (SP)=0FC+2=0FEH (SP)=0FE+2=100H (DI)=00A8H (100AAH)=2100H (DS)=1000H2.

46、2.4 有效地址傳送指令有效地址傳送指令 LEA(Load Effective Address, 裝載有效地址裝載有效地址)指令指令 LEA reg, src ; 有效地址送寄存器(有效地址送寄存器(load effective address)執(zhí)行操作執(zhí)行操作:(reg) offset of srcLEA指令把源操作數(shù)的有效地址送到指定的寄指令把源操作數(shù)的有效地址送到指定的寄存器,這個(gè)有效地址是由存器,這個(gè)有效地址是由src選定的一種存儲(chǔ)器尋選定的一種存儲(chǔ)器尋址方式確定的。址方式確定的。其他傳送指令其他傳送指令1. 地址傳送指令地址傳送指令LDS,LESLDS reg, src ; 指針?biāo)图?/p>

47、存器和指針?biāo)图拇嫫骱虳S (load DS with point)執(zhí)行操作執(zhí)行操作: (reg) (src)(DS) (src+2) 把源操作數(shù)指定的把源操作數(shù)指定的4個(gè)相繼字節(jié)送到由指令指定的寄存器及個(gè)相繼字節(jié)送到由指令指定的寄存器及DS寄存器中,該指令常指定寄存器中,該指令常指定SI寄存器。寄存器。 LES reg, src ; 指針?biāo)图拇嫫骱椭羔標(biāo)图拇嫫骱虴S(load ES with point)執(zhí)行操作執(zhí)行操作: (reg) (src)(ES) (src+2) 把源操作數(shù)指定的把源操作數(shù)指定的4個(gè)相繼字節(jié)送到由指令指定的寄存器及個(gè)相繼字節(jié)送到由指令指定的寄存器及ES寄存器中,該指令常

48、指定寄存器中,該指令常指定DI寄存器。寄存器。CBW;將;將AL寄存器內(nèi)容符號(hào)擴(kuò)展成寄存器內(nèi)容符號(hào)擴(kuò)展成16b,送入,送入AXCWD;將;將AX寄存器內(nèi)容符號(hào)擴(kuò)展成寄存器內(nèi)容符號(hào)擴(kuò)展成32b, 送入送入DX(高位高位)和和AXCWDE;將;將AX寄存器內(nèi)容符號(hào)擴(kuò)展成寄存器內(nèi)容符號(hào)擴(kuò)展成32b,送入,送入EAXCDQ;將;將EAX寄存器內(nèi)容符號(hào)擴(kuò)展成寄存器內(nèi)容符號(hào)擴(kuò)展成64b, 送入送入EDX和和EAX2.2. 擴(kuò)展傳送指令擴(kuò)展傳送指令MOVZX,MOVSX,CBW,CWD,CWDE,CDQMOVZX,MOVSX,CBW,CWD,CWDE,CDQ擴(kuò)展傳送指令把擴(kuò)展傳送指令把8位的操作數(shù)擴(kuò)展為位的操作數(shù)擴(kuò)展為16/32位,或者把位,或者把16位的操作位的操作數(shù)擴(kuò)展為數(shù)擴(kuò)展為32位,送入目的寄存器。位,送入目的寄存器。設(shè)有(設(shè)有(EAX)= 0000 8060H CBW ;(;(AX)= 0060H CWD

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論