第3章8086指令系統(tǒng)及匯編語言程序設(shè)計(jì)_第1頁
第3章8086指令系統(tǒng)及匯編語言程序設(shè)計(jì)_第2頁
第3章8086指令系統(tǒng)及匯編語言程序設(shè)計(jì)_第3頁
第3章8086指令系統(tǒng)及匯編語言程序設(shè)計(jì)_第4頁
第3章8086指令系統(tǒng)及匯編語言程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩209頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)第3章 8086/8088指令系統(tǒng)及匯編語言程序設(shè)計(jì)第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)3.1 指令格式與尋址方式 3.1.1 項(xiàng)目1:認(rèn)識(shí)8086尋址方式 3.1.2 知識(shí)講解3.2 數(shù)據(jù)傳送指令與串操作指令 3.2.1 項(xiàng)目2:內(nèi)存數(shù)據(jù)的移動(dòng) 3.2.2 知識(shí)講解3.3算術(shù)運(yùn)算指令與位操作指令 3.3.1 項(xiàng)目3:多字節(jié)的乘法 3.3.2 知識(shí)講解3.4 控制轉(zhuǎn)移指令與處理器控制指令 3.4.1 項(xiàng)目4:計(jì)算|X-Y| 3.4.2 知識(shí)講解3.5匯編語言程序格

2、式 3.5.1 項(xiàng)目5:把字符串顯示到屏幕上 3.5.2 知識(shí)講解3.6 程序的基本結(jié)構(gòu) 3.6.1 項(xiàng)目6:折半查找 3.6.2 知識(shí)講解3.7 BIOS和DOS中斷 3.7.1 項(xiàng)目7:從鍵盤中接收字符 3.7.2 知識(shí)講解3.8 子程序結(jié)構(gòu) 3.8.1 項(xiàng)目8:排序 3.8.2 知識(shí)講解第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì) 3.1 指令格式與尋址方式指令格式與尋址方式3.1.1項(xiàng)目項(xiàng)目1:認(rèn)識(shí):認(rèn)識(shí)8086尋址方式尋址方式1項(xiàng)目要求與目的項(xiàng)目要求與目的(1)項(xiàng)目要求:通過各種尋址方式操作,了解8086尋址方式。(2)項(xiàng)目目的:通過項(xiàng)目了解8

3、086匯編指令格式以及掌握8086的尋址方式。2項(xiàng)目程序項(xiàng)目程序各種尋址方式的程序代碼如下:第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)3.單步調(diào)試過程單步調(diào)試過程 目前常用的匯編程序有Microsoft公司推出的宏匯編程序MASM(Microsoft Assembler)和Borland公司推出的TASM(Turbo Assembler)兩種。本書采用的是MASM6.11版本。我們不妨把MASM6.11匯編程序安裝在D盤的masm611文件夾下。這里推薦使用Masm Editor編輯器,調(diào)試過程如下所示。第1步:用Notepad+編輯以上源程序,以ad

4、drmode.asm文件名保存在D:MASM611BIN目錄下。需要注意的是匯編的源程序后綴名必須是.asm。第2步:點(diǎn)擊開始菜單運(yùn)行輸入“cmd”回車輸入“D:”回車輸入“cd masm611/bin”回車這時(shí)就進(jìn)入了D:MASM611BIN目錄下。操作示意圖如圖3-1所示。第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)第3步:用masm匯編程序編譯addrmode.asm源文件,用link連接程序連接目標(biāo)文件(.obj)。 在圖3-1中輸入“masm addrmode”回車輸入“l(fā)ink addrmode”回車如果源程序匯編和連接沒有出錯(cuò),則會(huì)生成可執(zhí)

5、行文件(addrmode.exe)。 第4步:在命令行中輸入“cv addrmode.exe” 回車,則出現(xiàn)如下界面。及進(jìn)入單步調(diào)試狀態(tài)。在圖3-2中按F10,執(zhí)行指令MOV AX,DATA ,執(zhí)行后AX=12C3H,結(jié)果如圖3-3所示。第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)繼續(xù)按F10,執(zhí)行指令MOV DS,AX 。執(zhí)行后 。按F10,執(zhí)行指令MOV AX,1234H ,執(zhí)行后。 按F10,執(zhí)行指令MOV BX,AX ,執(zhí)行后。按F10,執(zhí)行指令MOV AX,VALUE (將DS段中VALUE單元的內(nèi)容送給AX),執(zhí)行后。 按F10,執(zhí)行指令MO

6、V BX,2000H (將立即數(shù)2000H送到偏移地址以BX的存儲(chǔ)單元)。執(zhí)行后12C3:1234單元=00H,12C3:1235單元=20H,結(jié)果如下圖所示。按F10,執(zhí)行指令MOV DL,80H ,執(zhí)行后 ,即DL=80H。按F10,執(zhí)行指令MOV SI,0020H 執(zhí)行后。 按F10,執(zhí)行指令MOV BX+SI,DL (將DL的內(nèi)容傳送到偏移地址為BX+SI的存儲(chǔ)單元),執(zhí)行后12C3:1254單元=80H, 結(jié)果如下圖所示。按F10,執(zhí)行指令MOV TABLEBX+SI,AL(將AX的內(nèi)容傳送到偏移地址為BX+SI+TABLE的存儲(chǔ)單元,TABLE的值等于VALUE的值加4),執(zhí)行后1

7、2C3:1258單元=78H, 結(jié)果如下圖所示。 接下來這兩條指令,返回DOS調(diào)用。本程序就調(diào)試到這里,下面介紹匯編語言指令格式與尋址方式。第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)3.1.2 知識(shí)講解知識(shí)講解1指令格式指令格式(1)概述 指令是指計(jì)算機(jī)完成特定操作的命令,指令系統(tǒng)是計(jì)算機(jī)能夠執(zhí)行全部命令的集合,它取決于計(jì)算機(jī)的硬件設(shè)計(jì)。Intel 80 x86/Pentium系列CPU指令系統(tǒng)是向上兼容的,所以,針對(duì)某一型號(hào)CPU編寫的程序,在后續(xù)發(fā)展出現(xiàn)的新型號(hào)CPU上都可以運(yùn)行,本書以8086/8088典型機(jī)為代表,介紹其指令系統(tǒng)。 計(jì)算機(jī)只能識(shí)

8、別二進(jìn)制代碼,所以機(jī)器指令是由二進(jìn)制代碼組成的。為便于人們使用而采用匯編語言來編寫程序。匯編語言是一種符號(hào)語言,它用助記符來表示操作碼,用符號(hào)或符號(hào)地址來表示操作數(shù)或操作數(shù)地址,它與機(jī)器指令是一一對(duì)應(yīng)。第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)(2)匯編指令格式 計(jì)算機(jī)中的指令由操作碼字段和操作數(shù)字段兩部分組成,指令的一般格式如下: 操作碼操作數(shù)操作數(shù) 操作碼部分決定指令的操作類型,指令操作數(shù)部分可以是指令所需的操作數(shù),也可以是操作數(shù)的地址或關(guān)于操作數(shù)地址的其他信息。指令操作數(shù)根據(jù)不同的指令有所區(qū)別,通常一條指令包含一個(gè)或兩個(gè)操作數(shù),前者稱為單操作數(shù)指

9、令,后者稱為雙操作數(shù)指令。雙操作數(shù)分別稱為源操作數(shù)(SRC)和目的操作數(shù)(DST)。第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)28086/8088的尋址方式的尋址方式 指令的尋址方式就是尋找指令操作數(shù)所在地址的方式,以確定數(shù)據(jù)的來源和去處。8086/8088指令中的操作數(shù)有三種可能的存放位置: 操作數(shù)在指令中,即指令的操作數(shù)部分就是操作數(shù)本身,這種操作數(shù)叫立即操作數(shù)。 操作數(shù)包含在CPU的某個(gè)內(nèi)部寄存器中,這時(shí)指令的操作數(shù)部分是CPU內(nèi)部寄存器的一個(gè)編碼。 操作數(shù)在內(nèi)存的數(shù)據(jù)區(qū)中,這時(shí)指令的操作數(shù)部分包含此操作數(shù)所在的內(nèi)存地址。 下面介紹8086/80

10、88的幾種尋址方式。(1)立即數(shù)尋址方式 定義:操作數(shù)直接存放在指令中,緊跟在操作碼之后,與操作碼一起存放在代碼段區(qū)域。立即數(shù)可以是8位、16位。立即數(shù)可以用二進(jìn)制數(shù)、八進(jìn)制數(shù)、十進(jìn)制數(shù)以及十六進(jìn)制數(shù)來表示。 第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)【例3-1】MOV AL,10 ;(AL)立即數(shù)10(十進(jìn)制數(shù))MOV AL,00100101B ;(AL)立即數(shù)00100101B(二進(jìn)制數(shù))MOV AL,0AH ;(AL)立即數(shù)0AH(十六進(jìn)制數(shù))MOV AH,58H ;(AH)立即數(shù)58H(十六進(jìn)制數(shù))MOV BX,1234H ;(BX)立即數(shù)12

11、34H后兩條指令執(zhí)行結(jié)果如圖3-7 所示。圖3-7 立即數(shù)尋址注意:立即數(shù)尋址方式只能用于源操作數(shù),不能用于目的操作數(shù),且原操作數(shù)長度與目的操作數(shù)長度一致。主要用于給寄存器賦值。 立即數(shù)尋址方式不執(zhí)行總線周期,執(zhí)行速度快。 立即數(shù)為16位時(shí),低位字節(jié)存放在存儲(chǔ)器低地址單元,高位字節(jié)存放在存儲(chǔ)器高地址單元。第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)(2)寄存器尋址方式 定義:操作數(shù)放在寄存器內(nèi),由指令直接給出某個(gè)寄存器的名字,以寄存器的內(nèi)容作為操作數(shù)。寄存器可以是16位的AX、BX、CX、DX、SI、DI、SP、BP寄存器,也可以是8位的AH、AL、BH

12、、BL、CH、CL、DH、DL寄存器。 【例3-2】 MOV AX,CX ;(AX)(CX) INC AL ;(AL)(AL)+1 指令執(zhí)行結(jié)果如圖3-8 所示圖3-8 寄存器尋址注意: 寄存器尋址方式的指令操作在CPU內(nèi)部執(zhí)行,不需要執(zhí)行總線周期,執(zhí)行速度快。 寄存器尋址方式既適用于指令的源操作數(shù),也適用于目的操作數(shù),并且可同時(shí)用于源操作數(shù)和目的操作數(shù)。 第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)(3)直接尋址方式 定義:操作數(shù)在存儲(chǔ)器中,指令中直接給出操作數(shù)所在存儲(chǔ)單元的有效地址。有效地址(EA)也稱為偏移地址,它代表操作數(shù)所在存儲(chǔ)單元距離段首址的

13、字節(jié)數(shù)。有效地址是一個(gè)無符號(hào)的16位二進(jìn)制數(shù)?!纠?-3】MOV AH,1234H ;將DS段中1234H單元的內(nèi)容送給AHMOV AH,VALUE ;將DS段中VALUE單元的內(nèi)容送給AHMOV AX, 2100H;將DS段中2100H單元的內(nèi)容送給AL, 2101H單元的內(nèi)容送給AHMOV BX,ES:【2000H】 ;段超越,操作數(shù)在附加段。即 物理地址(ES)*16+2000H注意: 直接尋址方式的操作數(shù)所在存儲(chǔ)單元的段地址一般在數(shù)據(jù)段寄存器DS中。 如果操作數(shù)在其他段,則需要在指令中用段超越前綴指出相應(yīng)的段寄存器名。 VALUE是一種符號(hào)表示法,此內(nèi)容將在偽指令中給予講解。 在實(shí)地址

14、方式下,物理地址16*段地址(DS)+偏移地址(EA)第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)【例3-4】 MOV AX,DS:2000H 解:當(dāng)(DS)=3000H時(shí),物理地址16*3000H+2000H32000H,指令的執(zhí)行結(jié)果是: (AL)(32000H),(AH)(32001H) 即內(nèi)存32000H和32001H單元的內(nèi)容已傳送到寄存器AX中。指令的執(zhí)行情況如圖3-9 所示。 圖3-9直接尋址指令執(zhí)行示意圖第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)(4)寄存器間接尋址方式 定義:操作數(shù)在存儲(chǔ)器中,指

15、令中寄存器的內(nèi)容作為操作數(shù)所在存儲(chǔ)單元的有效地址。寄存器可以是某個(gè)基址寄存器BX、BP,或某個(gè)變址寄存器SI、DI。操作數(shù)有效地址EA為: 可以分成兩種情況: 以SI、DI、BX間接尋址,則通常操作數(shù)在現(xiàn)行數(shù)據(jù)段DS區(qū)域中,物理地址的計(jì)算方法為:物理地址=16(DS)+(BX)(寄存器SI、DI類同) 當(dāng)使用寄存器BP時(shí),操作數(shù)所在存儲(chǔ)單元的段地址在堆棧段寄存器SS中。物理地址的計(jì)算方法為: 物理地址=16(SS)+(BP)第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)【例3-5】 已知:(DS)3000H,(SI)2000H指令:MOV AX,SI ;(

16、AX)(SI)有效地址EA2000H物理地址16(DS)+(SI)163000H+2000H=30000H+2000H32000H 指令執(zhí)行結(jié)果是將32000H和32001H單元的內(nèi)容送入寄存器AX中。若在指令中規(guī)定是段超越的,則BP的內(nèi)容也可以與其它的段寄存器相加,形成物理地址。指令的執(zhí)行情況如圖3-10 所示。圖3-10 MOV AX,SI 指令的執(zhí)行示意圖【例3-6】 已知:(DS)3000H,(BP)2000H 指令:MOV AX,DS:BP ;(AX)(BP) 有效地址EA2000H 物理地址(DS)16+(BP)163000H+2000H32000H 這種尋址方式通常用于表格處理,

17、執(zhí)行完一條指令后,只需修改寄存器內(nèi)容就可以取出表格的下一項(xiàng)。 第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)(5)寄存器相對(duì)尋址方式(或稱直接變址尋址方式) 定義:操作數(shù)在存儲(chǔ)器內(nèi),指令中寄存器的內(nèi)容與指令指定的位移量(DISP)之和作為操作數(shù)所在存儲(chǔ)單元的有效地址。寄存器可以是基址寄存器BX、BP,也可以是變址寄存器SI、DI。位移量是一個(gè)8位(DISP8)或16位(DISP16)的帶符號(hào)二進(jìn)制數(shù)。有效地址EA的計(jì)算方法為: 使用寄存器BX、SI、DI時(shí)與數(shù)據(jù)段寄存器DS有關(guān),使用寄存器BP時(shí)與堆棧段寄存器SS有關(guān)。以寄存器SI、8位位移量為例,物理地址

18、為:物理地址=16(DS)+(SI)+DISP8(使用寄存器BX、DI類同)以寄存器BP、16位位移量為例,物理地址為:物理地址= 16(SS)+(BP)+DISP16第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)【例3-7】 已知:(DS)2000H,(SI)1000H,ARRAY2000H(16位位移量)指令:MOVBX,ARRATSI或 MOVBX,ARRAY+SI有效地址EA(SI)+(ARRAY)1000H+2000H3000H。物理地址16(DS)+(SI)+DISP1620000H+1000H+2000H23000H。指令執(zhí)行結(jié)果是將2300

19、0H和23001H單元的內(nèi)容送入寄存器BX中。指令執(zhí)行情況如圖3-11 所示。圖3-11 MOVBX,ARRATSI 指令執(zhí)行示意圖 這種尋址方式同樣可用于表格處理,表格的首地址可設(shè)置為位移量,利用修改基址或變址寄存器的內(nèi)容來取得表格中的值。第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)(6)基址變址尋址方式 定義:操作數(shù)在存儲(chǔ)器內(nèi),指令將基址寄存器(BX或BP)與變址寄存器(SI或DI)內(nèi)容之和作為操作數(shù)所在存儲(chǔ)單元的有效地址EA。有效地址EA的計(jì)算方法為:EA(BX)/(BP)+(SI)/(DI)。當(dāng)使用基址寄存器BX時(shí),段寄存器為DS,物理地址計(jì)算方

20、法為:物理地址16(DS)+(BX)+(SI)(使用寄存器DI類同)。當(dāng)使用基址寄存器BP時(shí),段寄存器為SS,物理地址計(jì)算方法為:物理地址16(SS)+(BP)+(SI)(使用寄存器DI類同)?!纠?-8】 已知:(DS)2000H,(BX)1234H,(SI)5678H指令:MOV AL,BX SI或 MOVAL,BX+SI有效地址EA(BX)+(SI)1234H+5678H68ACH。物理地址16(DS)+ EA20000H+68ACH268ACH。指令執(zhí)行結(jié)果是將268ACH單元的內(nèi)容送入寄存器AL中。 注意如下是錯(cuò)誤書寫:MOV AX,BX+BP ;不允許同時(shí)使用BX和BPMOV AX

21、,SI+DI ;不允許同時(shí)使用SI和DI 基址變址尋址方式中,可以使用段跨越前綴標(biāo)識(shí)操作數(shù)所在的段。MOV AX, ES:BX+DI物理地址16(ES)+(BX)+(DI) 這種尋址方式同樣適用于數(shù)組或表格處理,首地址可存放在基址寄存器中,而用變址寄存器來訪問數(shù)組中的某個(gè)元素。第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)(7)相對(duì)基址變址尋址方式 定義:操作數(shù)在存儲(chǔ)器內(nèi)。指令將基址寄存器(BX或BP)與變址寄存器(SI或DI)的內(nèi)容之和再加上位移量(8位或16位),得到操作數(shù)所在存儲(chǔ)單元的有效地址。有效地址EA的計(jì)算方法為:EA(BX)/(BP)+(SI

22、)/(DI)+DISP8 / DISP16 當(dāng)使用基址寄存器BX時(shí),段寄存器為DS,物理地址計(jì)算方法:物理地址16(DS)+(BX)+(SI)/(DI)+ DISP8/ DISP16當(dāng)使用基址寄存器BP時(shí),段寄存器為SS,物理地址計(jì)算方法:物理地址16(SS)+(BP)+(SI)/(DI)+ DISP8/ DISP16【例3-9】 已知:(DS)2000H,(BX)1000H,(SI)0500H,DA11220H指令:MOVAX,DA1BXSI或MOV AX,DA1 BX+SI或MOV AX,DA1+BX+SI有效地址EA(BX)+(SI)+DISP161000H+0500H+1220H282

23、0H物理地址16(DS)+EA20000H+1000H+0500H+1220H22820H指令執(zhí)行結(jié)果是將22820H、22821H單元的內(nèi)容送入寄存器AX中。指令執(zhí)行情況如圖3-12所示。 注意如下是錯(cuò)誤書寫:MOV AX,DATBX+BP ;不允許同時(shí)使用BX和BPMOV AX,DATSI+DI ;不允許同時(shí)使用SI和DI這種尋址方式通常用于對(duì)二維數(shù)組的尋址。例如,存儲(chǔ)器中存放著由多個(gè)記錄組成的文件,則位移量可指向文件之首,基址寄存器指向某個(gè)記錄,變址寄存器則指向該記錄中的一個(gè)元素。 第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)(8)轉(zhuǎn)移地址有關(guān)的尋

24、址方式控制轉(zhuǎn)移指令在段內(nèi)、段間轉(zhuǎn)移時(shí),使用直接(相對(duì))尋址或間接尋址方式。 直接尋址方式段內(nèi)直接尋址方式是目標(biāo)程序和源程序在同一個(gè)程序段內(nèi),只給出源地址和目標(biāo)地址的差值,此差值是偏移量,它是一個(gè)以IP為基準(zhǔn)的8位或16位的帶符號(hào)補(bǔ)碼數(shù)。段間直接尋址方式直接給出轉(zhuǎn)移目標(biāo)地址的段地址和段內(nèi)位移量,用前者取代CS寄存器當(dāng)前的值,用后者取代IP中當(dāng)前的值,使程序從一個(gè)代碼段轉(zhuǎn)移到另一個(gè)代碼段。間接尋址方式 段內(nèi)間接尋址方式,指令轉(zhuǎn)移的有效地址存在一個(gè)寄存器或存儲(chǔ)器單元中,用它取代當(dāng)前IP的值,實(shí)現(xiàn)程序轉(zhuǎn)移。段間間接尋址方式,指令給出一個(gè)存儲(chǔ)器地址,從該地址開始的4個(gè)字節(jié)單元中存放轉(zhuǎn)移目標(biāo)地址的段內(nèi)偏移

25、量和段地址,這兩個(gè)地址在指令執(zhí)行時(shí)用于取代當(dāng)前的IP和CS的內(nèi)容,使程序從一個(gè)代碼段轉(zhuǎn)移到另一個(gè)代碼段。第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)3.2數(shù)據(jù)傳送與串操作類指令數(shù)據(jù)傳送與串操作類指令3.2.1項(xiàng)目項(xiàng)目2:內(nèi)存數(shù)據(jù)的移動(dòng):內(nèi)存數(shù)據(jù)的移動(dòng)1項(xiàng)目要求與目的項(xiàng)目要求與目的(1)項(xiàng)目要求:編寫程序?qū)崿F(xiàn)把數(shù)據(jù)段的字符串?dāng)?shù)據(jù)移動(dòng)到附加段中。具體要求是把數(shù)據(jù)段中以dstring地址標(biāo)號(hào)為開始地址的“hello world!”字符串移動(dòng)到附加段以sstring地址標(biāo)號(hào)為開始地址中去。(2)項(xiàng)目目的:通過項(xiàng)目學(xué)習(xí)匯編的數(shù)據(jù)傳送指令和串處理類指令,鞏固上一節(jié)尋

26、址方式,學(xué)習(xí)匯編程序設(shè)計(jì)。2項(xiàng)目程序設(shè)計(jì)項(xiàng)目程序設(shè)計(jì)(1)程序流程圖設(shè)計(jì)思想:從源串中取一個(gè)字符到AL中,然后把剛?cè)〉降淖址诺侥康拇付ㄎ恢?,重?fù)這樣的過程,把源串的字符取完為止。程序流程如圖3-13所示。(2)程序清單實(shí)現(xiàn)這樣功能的程序方法很多,下面給出了實(shí)現(xiàn)這一功能的完整程序清單。其中16行22行是本程序的核心代碼。 第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)(3)調(diào)試過程第1步:編譯過程請(qǐng)參照項(xiàng)目1的調(diào)試指導(dǎo)。第2步:進(jìn)入程序調(diào)試界面,如圖3-14所示。 第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)第3步

27、:按F10,執(zhí)行到MOV CX,000C時(shí),這時(shí)程序狀態(tài)如圖3-15所示。 第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)第4步:接著繼續(xù)按F10執(zhí)行程序,最終結(jié)果如圖3-16所示。從圖3-16中可以看出,程序確實(shí)把數(shù)據(jù)段的“hello,world!”移動(dòng)到附加段中去了。第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)3.2.2 知識(shí)講解知識(shí)講解1概述概述Intel 8086/8088指令系統(tǒng)共有117條基本指令,按照指令功能,可分位6類指令: 數(shù)據(jù)傳送類指令。 算術(shù)指令。 邏輯移位指令。 串操作指令。 控制轉(zhuǎn)移指令。

28、處理機(jī)控制類指令。 本書只介紹8086/8088的指令系統(tǒng)。在這一節(jié)中,主要講解數(shù)據(jù)傳送類指令和串處理類指令。數(shù)據(jù)傳送類指令分為通用數(shù)據(jù)傳送指令、累加器專用傳送指令、地址傳送指令、標(biāo)志寄存器傳送指令和類型轉(zhuǎn)換指令。數(shù)據(jù)傳送是計(jì)算機(jī)中最基本、最重要的一種操作,也是最常用的一類指令。傳送指令是把數(shù)據(jù)從一個(gè)位置傳送到另一個(gè)位置,除了標(biāo)志寄存器傳送指令外,其余傳送類指令均不影響標(biāo)志位。串操作類指令通常用于處理存放在存儲(chǔ)器里的數(shù)據(jù)串(String),即在連續(xù)的主存區(qū)域中,字節(jié)或字的序列。串操作指令的操作對(duì)象是以字(W)為單位的字串,或是以字節(jié)(B)為單位的字節(jié)串。第第3 3章章 80868086指令系統(tǒng)

29、及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)2數(shù)據(jù)傳送類指令數(shù)據(jù)傳送類指令 數(shù)據(jù)傳送類指令實(shí)現(xiàn)CPU內(nèi)部寄存器之間、CPU與存儲(chǔ)器之間、CPU與I/O端口之間的數(shù)據(jù)傳送。 (1)通用數(shù)據(jù)傳送指令 通用傳送指令包括:傳送指令MOV(move)、進(jìn)棧指令PUSH(push onto the stack、出棧指令POP(pop from the stack)和交換指令XCHG(exchange)。指令格式及操作如下: MOV 傳送指令:把一個(gè)字節(jié)或字的操作數(shù)從源地址傳送至目的地址。指令格式:MOV DST,SRC指令執(zhí)行操作:(DST)(SRC)其中DST表示目的操作數(shù),SRC表示源操作數(shù)。MOV

30、指令傳送示意圖如圖3-17所示。 MOV指令傳送信息可以從通用寄存器到通用寄存器,立即數(shù)到通用寄存器,立即數(shù)到 存儲(chǔ)器,存儲(chǔ)器到通用寄存器,通用寄存器到存儲(chǔ)器,通用寄存器或存儲(chǔ)器到除CS外的段寄存器(立即數(shù)不能直接送到段寄存器),段寄存器到通用寄存器或存儲(chǔ)器。第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)【例3-10】 MOV 指令的各種格式傳送MOV AL,55H ;(AL)立即數(shù)55HMOV AX,1234H ;(AX)立即數(shù)1234HMOV BL,AL ;(BL)(AL)MOV BX,AX ;(BX)(AX)MOV 2000H,AX ;(2000H)

31、(AL), (2001H)(AH)MOV AX,3000H ;(AL)(3000H), (AH)(3001H)MOV DS,AX ;(DS)(AX)MOV AX,DS ;(AX)(DS)MOV TABLE,DS ;(TABLE)(DS)本例展示了MOV 指令傳送功能。第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)【例3-11】下列MOV指令都是錯(cuò)誤的MOV 1234H,AX ;立即數(shù)不能用于目標(biāo)操作數(shù)MOV CS,AX ;CS不能用于目標(biāo)操作數(shù)MOV IP,AX ;IP不能用于目標(biāo)操作數(shù)MOV DS,1234H ;立即數(shù)不能直接傳送給段寄存器MOV AL,

32、BX ;原操作數(shù)與目標(biāo)操作數(shù)的位數(shù)必須一致MOV BUF1,BUF2 ;不能在兩個(gè)存儲(chǔ)器單元之間傳送數(shù)據(jù)MOV DS,ES ;不能在兩個(gè)段寄存器單元之間傳送數(shù)據(jù)注意:MOV指令的兩個(gè)操作數(shù)(源、目的)均可采用不同的尋址方式,但是必須有一個(gè)為寄存器。MOV指令可以傳送8位或16位的數(shù)據(jù),但是必須與8位或16位寄存器相對(duì)應(yīng)。MOV指令不允許把立即數(shù)作目的操作數(shù),也不允許向段寄存器送立即數(shù)。MOV指令不允許在段寄存器之間、存儲(chǔ)器單元之間傳送數(shù)據(jù)。MOV指令不影響標(biāo)志位。第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)堆棧操作指令PUSH 進(jìn)棧指令:把一個(gè)字的操作數(shù)

33、從源地址壓入到堆棧中。POP出棧指令:把一個(gè)字的操作數(shù)從棧中彈出到目的操作數(shù)中。堆棧是一個(gè)“后進(jìn)先出FILO”(或說“先進(jìn)后出FILO”)的主存區(qū)域,位于堆棧段中;SS段寄存器記錄其段地址;堆棧只有一個(gè)出口,即當(dāng)前棧頂;用堆棧指針寄存器SP指定;棧頂是地址較小的一端(低端),棧底不變,如圖3-18所示。 PUSH指令的格式:PUSH SRC指令執(zhí)行操作:(SP)(SP)-2 (SP)+1,(SP)(SRC) 功能解釋:先將SP的內(nèi)容減2,再將源操作數(shù)的內(nèi)容(一個(gè)字)“壓入”到堆棧棧頂?shù)囊粋€(gè)字中。POP指令的格式:POP DST指令執(zhí)行操作:(SCR)(SP)+1,(SP) (SP)(SP)+2

34、功能解釋:先將堆棧棧頂?shù)囊粋€(gè)字“彈出”到目的操作數(shù)的一個(gè)字中,再將SP的內(nèi)容加2。這兩條指令只能進(jìn)行“字”操作,不能進(jìn)行“字節(jié)” 操作,傳送時(shí)仍遵循高字節(jié)放在高地址單元、低字節(jié)放在低地址單元的原則。PUSH指令和POP指令允許的操作數(shù)及數(shù)據(jù)傳送方向如圖3-19所示。圖3-18 堆棧結(jié)構(gòu)示意圖 第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)【例3-12】 已知:(AX)=1122H,(BX)=3344H,(SP)=1010H執(zhí)行指令:PUSH AX ;(SP)100EH,(100FH)11H,(100EH)22HPUSH BX ;(SP)100CH,(100

35、DH)33H,(100CH)44HPOP AX ;(AX)(100DH,100CH),(SP)100EHPOP BX ;(BX)(100FH,100EH),(SP)1010H執(zhí)行結(jié)果:(AX)=3344H,(BX)=1122H,(SP)=1010H【例3-13】堆棧指令錯(cuò)誤書寫如下:PUSH AL ;字節(jié)不能進(jìn)棧PUSH 1000H ;立即數(shù)不能進(jìn)棧POP AL ;字節(jié)不能出棧對(duì)象POP CS ;CS不能作為出棧對(duì)象POP 1234H ;立即數(shù)不能出棧對(duì)象注意: 8086堆棧操作必須是字?jǐn)?shù)據(jù)。(操作數(shù)不能是立即數(shù)) 源操作數(shù)SRC、目的操作數(shù)DST,可以是存儲(chǔ)器、通用寄存器和段寄存器,但是不能

36、將數(shù)據(jù)彈至段寄存器CS,可以將段寄存器CS的內(nèi)容壓入到堆棧中。 堆棧操作可以用于數(shù)據(jù)的暫存與恢復(fù)、子程序返回地址及中斷斷點(diǎn)地址的保護(hù)與返回。 堆棧操作指令不影響狀態(tài)標(biāo)志位。第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)XCHG交換指令 XCHG交換指令能將源操作數(shù)的內(nèi)容與目的操作數(shù)的內(nèi)容進(jìn)行交換,可以進(jìn)行字節(jié)交換,也可以進(jìn)行字交換。 XCHG交換指令格式:XCHG OPR1,OPR2 指令執(zhí)行操作:(OPR1) (OPR2) XCHG交換指令允許的操作數(shù)及數(shù)據(jù)傳送方向如圖3-20所示。圖3-20 交換指令數(shù)據(jù)傳送方向如圖第第3 3章章 80868086指令

37、系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)【例3-14】 已知:(BX)=1100H,(BP)=3344H,(DI)=0055H,(SS)=2000H,(23399H)=1234H指令: XCHG BX ,BP+DI源操作數(shù)的物理地址=16(SS)+(BP)+(DI)=20000H+3344H+0055H=23399H指令執(zhí)行結(jié)果為:(BX)=1234H,(2219BH)=1100H。【例3-15】以下XCHG交換指令都是錯(cuò)誤的。XCHG AL,BX ;字節(jié)與字不能交換XCHG AX,1000H ;寄存器與立即數(shù)不能交換XCHG DS,SS ;段寄存器之間不能不能交換XCHG CS,IP

38、 ;CS與IP不能交換注意: XCHG指令實(shí)現(xiàn)兩個(gè)操作數(shù)內(nèi)容(8位或16位)的互換。 兩個(gè)操作數(shù)不能為段寄存器或立即數(shù),并且不能同時(shí)為存儲(chǔ)器操作數(shù)(則兩個(gè)操作數(shù)至少有一個(gè)在寄存器中)。 CS、IP寄存器的內(nèi)容不能交換。XCHG指令不影響狀態(tài)標(biāo)志位。第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)(2)累加器專用傳送指令累加器專用傳送指令包括:IN(input)輸入、OUT(output)輸出、XLAT(translate) 查表。本組指令以累加器為中心,實(shí)現(xiàn)數(shù)據(jù)的輸入/輸出和換碼操作。指令格式及操作如下: IN /OUT (輸入/輸出)指令8086/8088

39、采用的是I/O端口與存儲(chǔ)器是單獨(dú)編址的,因此訪問I/O端口只能用IN/OUT兩條指令(不能使用任何其他指令),IN/OUT指令按長度分為長格式和短格式。長格式指令代碼為2個(gè)字節(jié),第二字節(jié)用PORT表示端口號(hào),它指定的端口地址范圍是00FFH。短格式指令代碼為1個(gè)字節(jié),它指定的端口地址范圍是0000FFFFH。 第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)用IN指令完成從輸入端口到CPU的數(shù)據(jù)傳送。 長格式:IN AL,PORT(字節(jié)) IN AX,PORT(字)執(zhí)行的操作: (AL)(PORT)(字節(jié)) (AX)(PORT+1,PORT)(字)短格式:I

40、N AL,DX (字節(jié)) IN AX,DX(字)執(zhí)行的操作:AL(DX)(字節(jié)) AX(DX)+1,DX)(字)用OUT指令完成從CPU到輸出端口的數(shù)據(jù)傳送。長格式:OUT PORT,AL(字節(jié)) OUT PORT,AX(字)執(zhí)行的操作:(PORT)(AL)(字節(jié)) (PORT+1,PORT)(AX)(字)短格式:OUT DX,AL(字節(jié)) OUT DX,AX(字)執(zhí)行的操作:(DX)(AL)(字節(jié)) (DX)+1,(DX)AX(字)第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)【例3-16】 要完成下列輸入/輸出操作:(a)從60H端口輸入一個(gè)字節(jié)數(shù)據(jù);

41、(b)從61H端口輸出一個(gè)字節(jié)數(shù)據(jù)32H;(c)從2160H端口輸入一個(gè)字節(jié)數(shù)據(jù);(d)從2161H端口輸出一個(gè)字節(jié)數(shù)據(jù)64H;解:(a)題可用兩種方法:方法1:IN AL,60H 方法2: MOV DX,60H IN AL,DX(b)題可用兩種方法:方法1:MOV AL,32H 方法2: MOV AL,32H OUT 61H,AL MOV DX,61H OUT DX ,AL(c)題只能用一種方法:MOV DX,2160H IN AL,DX(d)題只能用一種方法:MOV DX,2161H MOV AL,64H OUT DX,AL第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)

42、及匯編語言程序設(shè)計(jì) 需要注意的是在(a)和(b)中,方法1為直接尋址,端口地址在指令中,是 8位無符號(hào)數(shù)(0255);方法2為間接尋址,端口地址在DX中,是 16位無符號(hào)數(shù)(065535)。在(c)和(d)中,I/O指令均為間接尋址,端口地址在DX中,是 16位無符號(hào)數(shù)(065535)。在IBM-PC機(jī)里,外部設(shè)備最多可有65536個(gè)I/O端口,端口(即外設(shè)的端口地址)為0000FFFFH。其中前256個(gè)端口(0FFH)可以直接在指令中指定,這就是長格式中的PORT, 此時(shí)機(jī)器指令用二個(gè)字節(jié)表示,第二個(gè)字節(jié)就是端口號(hào)。所以用長格式時(shí)可以在指定中直接指定端口號(hào),但只限于前256個(gè)端口。當(dāng)端口號(hào)=

43、256時(shí),只能使用短格式,此時(shí),必須先把端口號(hào)放到DX寄存器中(端口號(hào)可以從0000到0FFFFH),然后再用IN或OUT指令來 傳送信息。第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)XLAT查表指令指令格式:XLAT OPR或者 XLAT執(zhí)行的操作:(AL)(BX)+(AL) 指令功能:完成一個(gè)字節(jié)的查表轉(zhuǎn)換。它將數(shù)據(jù)段中偏移地址為BX與AL寄存器之和的存儲(chǔ)單元的內(nèi)容送入AL寄存器。在使用該指令時(shí),應(yīng)首先在數(shù)據(jù)段中建立一個(gè)長度小于256B的表格,表的首地址置于BX中,再將代碼(相對(duì)于表格首地址的位移量)存入寄存器AL中。指令執(zhí)行后,所查找的對(duì)象存于AL

44、中, BX內(nèi)容保持不變?!纠?-17】 已知:(DS)=3000H,(BX)=0030H,(AL)=01數(shù)據(jù)表: (30030H)=30H (30031H)=31H (30032H)=32H指令: XLAT指令執(zhí)行結(jié)果:(AL)=31H,即將地址30031H單元的內(nèi)容31H送入寄存器AL中。即執(zhí)行指令后,AL寄存器的內(nèi)容01換成了31H。第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)地址傳送指令地址傳送指令包括:LEA(load effective address)有效地址送寄存器、LDS(load DS with pointer)指針?biāo)图拇嫫骱虳S、LE

45、S(load ES with pointer)指針?biāo)图拇嫫骱虴S。這組指令的功能是完成把地址送到指定通用寄存器(用REG表示)中。地址傳送指令不影響狀態(tài)標(biāo)志位。REG 不能為段寄存器,SRC 必須為存儲(chǔ)器尋址方式。LEA 有效地址送寄存器指令格式: LEA REG,SRC執(zhí)行的操作:(REG)SRC指令把源操作數(shù)(存儲(chǔ)器)的有效地址送到指定的16位通用寄存器中,REG 不能為段寄存器。源操作數(shù)可使用除立即數(shù)和寄存器外的任一種存儲(chǔ)器尋址方式。LDS 指針?biāo)图拇嫫骱虳S指令格式:LDS REG,SRC執(zhí)行的操作:(REG)(SRC) (DS)(SRC+2) 把源操作數(shù)(雙字存儲(chǔ)器)中的低字送入16

46、位通用寄存器中,高字送入DS中。LES 指針?biāo)图拇嫫骱虴S指令格式: LES REG,SRC執(zhí)行的操作:(REG)(SRC) (ES)(SRC+2)把源操作數(shù)(雙字存儲(chǔ)器)中的低字送入16位通用寄存器中,高字送入ES中。第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)【例3-18】 LEA 有效地址送寄存器指令LEA AX,5678H;(AX) 5678H與MOV AX,5678H等價(jià)【例3-19】 LDS指令與LES指令已知:(DS)=8000H (81480H)=33CCH (81482H)=2468H。指令:LDS SI,1480H物理地址=16(DS

47、)+1480H=81480H。指令執(zhí)行結(jié)果:(SI)=33CCH,(DS)=2468H(物理地址加后地址中的內(nèi)容傳給)。第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)標(biāo)志寄存器傳送指令 標(biāo)志寄存器傳送指令包括:LAHF(load AH with flags)標(biāo)志送AH、SAHF(store AH into flags)AH送標(biāo)志寄存器、PUSHF(push the flags)標(biāo)志進(jìn)棧、POPF(pop the flags) 標(biāo)志出棧。 本組指令用來保存標(biāo)志寄存器和恢復(fù)標(biāo)志寄存器。這組指令中的LAHF和PUSHF不影響標(biāo)志位,SAHF和POPF由裝入值來確

48、定標(biāo)志位的值。LAHF指令指令格式:LAHF執(zhí)行的操作:(AH)(PSW的低字節(jié))SAHF指令 指令格式:SAHF 執(zhí)行的操作:(PSW的低字節(jié))(AH)PUSHF 標(biāo)志進(jìn)棧指令 指令格式:PUSHF 執(zhí)行的操作:(SP)(SP)-2 (SP)+1,(SP)(PSW)POPF 標(biāo)志出棧指令指令格式:POPF 執(zhí)行的操作:(SP)(SP)-2(PSW)(SP)+1,(SP)第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)符號(hào)擴(kuò)展指令 符號(hào)擴(kuò)展指令包括:CBW(convert byte to word)字節(jié)擴(kuò)展為字、CWD(convert word to dou

49、ble word)字?jǐn)U展為雙字。指令格式及操作如下:CBW 字節(jié)轉(zhuǎn)換為字指令 指令格式:CBW 執(zhí)行的操作:將AL中的8位帶符號(hào)數(shù)擴(kuò)展為16位并送入AX中,也就是將AL的最高位送入AH的所有各位,即如果(AL)的最高有效位位0,則(AH)=00H;如果(AL)的最高有效位為1,則(AH)=0FFH。CWD 字轉(zhuǎn)換為雙字指令指令格式:CWD 執(zhí)行的操作:AX的內(nèi)容符號(hào)擴(kuò)展到DX,形成DX:AX中的雙字。即如果(AX)的最高有效位位0,則(DX)=0000H;如果(AX)的最高有效位為1,則(DX)=0FFFFH?!纠?-20】已知:(AX)= 0BA45H 指令:CBW ;(AX)=0045H

50、指令:CWD ;(DX)=0FFFFH (AX)=0BA45H第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)3串操作類指令串操作類指令串操作類指令包括:MOVS(move string)串傳送、CMPS(compare string)串比較、SCAS(scan string)串搜索、LODS(load from string)串取、STOS(store in to string)串存;與上述串操作基本指令配合使用的前綴有:REP(repeat)重復(fù)、REPE/REPZ(repeat while equal / zero)相等/為零重復(fù)、REPNE/REPN

51、Z(repeat while not equal / not zero)不相等/不為零重復(fù)。指令格式及操作如下:MOVS 串傳送指令指令格式:MOVSB 執(zhí)行的操作:字節(jié)操作,當(dāng)DF=0時(shí),則(DI)(SI)(SI)(SI)+1,(DI)(DI)+1當(dāng)DF=1時(shí),則(DI)(SI)(SI)(SI)-1,(DI)(DI)-1指令格式:MOVSW 執(zhí)行的操作:字操作,當(dāng)DF=0時(shí),則(DI)(SI)(SI)(SI)+2,(DI)(DI)+2當(dāng) DF=1時(shí),則(DI)(SI)(SI)(SI)-2,(DI)(DI-2)第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)

52、 串傳送指令的功能是將位于DS段以SI為指針的源串中的一個(gè)字節(jié)(或字)存儲(chǔ)單元中的數(shù)據(jù)傳送至ES段以DI為指針的目的地址中去,并自動(dòng)修改指針,使之指向下一個(gè)字節(jié)(或字)存儲(chǔ)單元。當(dāng)DF=0時(shí),(SI)和(DI)增量;當(dāng)DF=1時(shí),(SI)和(DI)減量。指令不影響狀態(tài)標(biāo)志位。 CMPS 串比較指令指令格式:CMPSB 執(zhí)行的操作:字節(jié)操作,(SI)-(DI),(SI)(SI)1,(DI)(DI)1指令格式:CMPSW 執(zhí)行的操作:字操作,(SI)-(DI),(SI)(SI)2,(DI)(DI)2 串比較指令的功能是把位于DS段由SI指定的字節(jié)數(shù)據(jù)或字?jǐn)?shù)據(jù)與ES段由DI指定的字節(jié)數(shù)據(jù)或字?jǐn)?shù)據(jù)進(jìn)行

53、比較,結(jié)果不保存,但影響狀態(tài)標(biāo)志位。當(dāng)DF=0時(shí),(SI)和(DI)增量;當(dāng)DF=1時(shí),(SI)和(DI)減量。第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)SCAS串搜索指令指令格式:SCASB執(zhí)行的操作:字節(jié)操作,(AL)-(DI),(DI)(DI)1指令格式:SCASW執(zhí)行的操作:字操作,(AX)-(DI),(DI)(DI)2 串搜索指令的功能是把AL或AX中的內(nèi)容與ES段由DI指定的一個(gè)字節(jié)數(shù)據(jù)或字?jǐn)?shù)據(jù)進(jìn)行比較,結(jié)果不保存,但影響狀態(tài)標(biāo)志位。當(dāng)DF=0時(shí),(SI)和(DI)增量;當(dāng)DF=1時(shí),(SI)和(DI)減量。LODS串取指令指令格式:LOD

54、SB執(zhí)行的操作:字節(jié)操作,(AL)(DI),(DI)(DI)1指令格式:LODSW執(zhí)行的操作:字操作,(AX)(DI),(DI)(DI)2 串取指令的功能是把位于DS段由SI指定內(nèi)存單元的內(nèi)容取到寄存器AL或AX中,指令不影響狀態(tài)標(biāo)志位。當(dāng)DF=0時(shí),(SI)和(DI)增量;當(dāng)DF=1時(shí),(SI)和(DI)減量。第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)STOS串存指令指令格式:STOSB執(zhí)行的操作:字節(jié)操作,(DI)(AL),(DI)(DI)1指令格式:STOSW執(zhí)行的操作:字操作,(DI)(AX),(DI)(DI)2串存指令的功能是把寄存器AL或A

55、X中的內(nèi)容存到ES段由DI指定的內(nèi)存單元,指令不影響狀態(tài)標(biāo)志位。當(dāng)DF=0時(shí),(SI)和(DI)增量;當(dāng)DF=1時(shí),(SI)和(DI)減量。需要注意: 串指令可以對(duì)字節(jié)或字串進(jìn)行操作。所有串操作指令都對(duì)數(shù)據(jù)段中用SI指定的源操作數(shù)及附加段中用DI指定的目的操作數(shù)進(jìn)行間接尋址。如果數(shù)據(jù)串在同一段中,則需要將DS和ES置為同樣的地址,或源操作數(shù)用段超越前綴指出。串操作指令執(zhí)行時(shí),由標(biāo)志位DF決定地址指針的修改方向。當(dāng)DF=1,SI和DI作減量修改;當(dāng)DF=0,SI和DI作增量修改。因此,在串操作指令執(zhí)行前,需對(duì)SI,DI和DF進(jìn)行設(shè)置。串操作指令是唯一的一類源操作數(shù)和目的操作數(shù)都在存儲(chǔ)器單元的指令

56、。第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)REP重復(fù)指令格式:REP執(zhí)行的操作:當(dāng)(CX)=0退出重復(fù);當(dāng)(CX)0,(CX)(CX)-1執(zhí)行其后串操作指令該指令功能是每執(zhí)行一次串指令(CX)1,直到(CX)=0,重復(fù)執(zhí)行結(jié)束。REP前綴用在MOVS、STOS 、LODS指令前,流程圖如圖3-21(a)所示。REPE/REPZ相等/為零重復(fù)指令指令格式:REPE/REPZ執(zhí)行的操作:當(dāng)(CX)=0或零標(biāo)志ZF=0退出重復(fù)否則(CX)(CX)-1執(zhí)行其后串操作指令該指令功能是每執(zhí)行一次串指令(CX)1,并判斷ZF標(biāo)志是否為0,只要(CX)=0或ZF=0

57、,退出重復(fù)。該指令一般用在CMPS、SCAS指令前,流程圖如圖3-21(b)所示。圖3-21 流程圖第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)REPNE/REPNZ不相等/不為零重復(fù)指令指令格式:REPNE/REPNZ執(zhí)行的操作:當(dāng)(CX)=0或零標(biāo)志ZF=1退出重復(fù)否則(CX)(CX)-1執(zhí)行其后串操作指令 該指令功能是每執(zhí)行一次串指令(CX)1,并判斷ZF標(biāo)志是否為1,只要(CX)=0或ZF=1,則退出重復(fù)。該指令一般用在CMPS、SCAS 指令前。圖3-22 CMPS/SCAS串操作執(zhí)行過程流程圖 注意: 重復(fù)前綴指令不能單獨(dú)使用,其后必須緊跟串

58、操作指令,控制串操作指令重復(fù)執(zhí)行。其執(zhí)行過程相當(dāng)于一個(gè)循環(huán)程序的運(yùn)行,如圖3-22所示。在每次重復(fù)之后,地址指針SI和DI都被修改,但指令指針I(yè)P仍保持指向帶有前綴的串操作指令的地址。重復(fù)執(zhí)行次數(shù)由數(shù)據(jù)串長度決定,數(shù)據(jù)串長度應(yīng)預(yù)置在寄存器CX中。執(zhí)行重復(fù)前綴指令不影響標(biāo)志位。第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)【例3-21】在數(shù)據(jù)段中有一個(gè)字符串,其長度為20,要求把他們轉(zhuǎn)送到附加段的一個(gè)緩沖區(qū)中。程序代碼如下所示:第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)【例3-22】把附加段中的10個(gè)字節(jié)緩沖區(qū)置為3

59、0H。部分代碼如下所示: 方法1:以字節(jié)為單位 方法2:以字為單位 第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)3.3算術(shù)運(yùn)算指令與位操作指令算術(shù)運(yùn)算指令與位操作指令3.3.1項(xiàng)目項(xiàng)目3:多字節(jié)的乘法:多字節(jié)的乘法1項(xiàng)目要求與目的項(xiàng)目要求與目的(1)項(xiàng)目要求:編寫程序?qū)崿F(xiàn)無符號(hào)數(shù)相乘,把緩沖區(qū)里存放的一個(gè)24位被乘數(shù)和一個(gè)8位乘數(shù)相乘,結(jié)果保存在32位的存儲(chǔ)空間中(24位的數(shù)與8位的數(shù)的乘積不會(huì)超過32位)。 (2)項(xiàng)目目的:通過項(xiàng)目學(xué)習(xí)算術(shù)運(yùn)算指令和邏輯指令。第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)2項(xiàng)目程序

60、設(shè)計(jì)項(xiàng)目程序設(shè)計(jì)設(shè)計(jì)思路如圖3-23所示。圖3-23 設(shè)計(jì)思路圖第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)(1)程序流程圖如圖3-24所示。被乘數(shù)低16位BAX乘數(shù)8位CBL乘數(shù)BL開展到BX記為DB*D=部分積1轉(zhuǎn)存到DI,SI被乘數(shù)高8位AALA*C=部分積2部分積2+DI結(jié)果存入緩沖區(qū)程序結(jié)束程序開始圖3-24程序流程圖第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)(2)程序清單如下所示。第第3 3章章 80868086指令系統(tǒng)及匯編語言程序設(shè)計(jì)指令系統(tǒng)及匯編語言程序設(shè)計(jì)(3)調(diào)試過程第1步:編譯過程請(qǐng)參照項(xiàng)

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論