李繼燦-微機原理與接口技術-第3章)_第1頁
李繼燦-微機原理與接口技術-第3章)_第2頁
李繼燦-微機原理與接口技術-第3章)_第3頁
李繼燦-微機原理與接口技術-第3章)_第4頁
李繼燦-微機原理與接口技術-第3章)_第5頁
已閱讀5頁,還剩105頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第第3章章 微處理器的指令系統(tǒng)微處理器的指令系統(tǒng) 學習目標學習目標8086/8088 CPU的指令系統(tǒng)是Intel80 x86系列CPU共同的基礎,其后續(xù)高型號微處理器的指令系統(tǒng)都是在此基礎上新增了一些指令逐步擴充形成的。本章將重點討論8086/8088 CPU的指令系統(tǒng)。最后,介紹幾種擴展指令集的實用知識。通過本章對80868088 CPU尋址方式和指令系統(tǒng)的學習,應能掌握匯編語言程序設計所需要的匯編語言和編寫程序段的基礎知識。學習要求學習要求在理解與掌握各種尋址方式的基礎上,著重掌握存儲器尋址的各種尋址方式。應熟練掌握4類數(shù)據(jù)傳送指令。難點是XLAT、IN、OUT。學習算術運算類指令中的難

2、點是帶符號乘、除指令與十進制指令。學習邏輯運算和移位循環(huán)類指令時,要著重理解CL的設置以及進位位的處理。學習串操作類指令時,著重理解重復前綴(REP)的使用。學習程序控制類指令時,著重理解條件轉(zhuǎn)移的條件及測試條件。理解指令集的發(fā)展趨勢,了解幾種擴展指令集。3.1 80868088的尋址方式的尋址方式80868088的尋址方式分為兩種不同的類型:數(shù)據(jù)尋址方式和程序存儲器尋址方式。前者是尋址操作數(shù)地址,后者是尋址程序地址(在代碼段中)。 3.1.13.1.1數(shù)據(jù)尋址方式數(shù)據(jù)尋址方式圖3-1給出了各種數(shù)據(jù)尋址方式的類型、指令舉例以及存儲器地址生成方法與數(shù)據(jù)流向。1立即尋址立即尋址立即尋址的操作數(shù)就在

3、指令中,當執(zhí)行指令時,CPU直接從緊跟著指令代碼的后續(xù)地址單元中取得該立即數(shù)。立即數(shù)可以是8位,也可以是16位;并規(guī)定只能是整數(shù)類型的源操作數(shù)。這種尋址主要用來給寄存器賦初值,指令執(zhí)行速度快。立即數(shù)尋址的MOV指令示例。2寄存器尋址寄存器尋址寄存器尋址的操作數(shù)放在寄存器中,寄存器名在指令中指出。在一條指令中,源操作數(shù)或/和目的操作數(shù)都可以采用寄存器尋址方式。這種尋址的指令長度短,操作數(shù)就在CPU內(nèi)部,執(zhí)行速度快。注意,使用時源與目標應有相同的數(shù)據(jù)類型長度。各種寄存器尋址的MOV指令示例。存儲器尋址存儲器尋址存儲器尋址比較復雜,當CPU尋找存儲器操作數(shù)時,應根據(jù)指令給出的尋址方式,由EU先計算出

4、操作數(shù)地址的偏移量(即有效地址EA)。EA的值由匯編程序根據(jù)指令所采用的尋址方式自動計算得出。計算EA的通式為:EA基址值(BX或BP)+變址值(SI或DI)+位移量DISP3直接數(shù)據(jù)尋址直接數(shù)據(jù)尋址直接數(shù)據(jù)尋址有兩種基本形式:直接尋址和位移尋址。1)直接尋址直接尋址簡單、直觀,它是指令中以位移量方式直接給出存儲器操作數(shù)的偏移地址,即有效地址EADISP。這種尋址方式的指令執(zhí)行速度快,用于存儲單元與AL、AX之間的MOV指令。2)位移尋址位移尋址也以位移量方式直接給出存儲器操作數(shù)的偏移地址,但適合于幾乎所有將數(shù)據(jù)從存儲單元傳送到寄存器的指令。使用使用AX、AL的直接尋址指令示例的直接尋址指令示

5、例使用位移量的直接數(shù)據(jù)尋址指令示例使用位移量的直接數(shù)據(jù)尋址指令示例位移尋址與直接尋址的操作相同,只是它的指令為4字節(jié)而不是3字節(jié)【例例3.1】 MOV CL, 2000H指令與MOV AL,2000H指令的操作相同,但MOV CL,2000H指令為4字節(jié)長,而MOV AL,2000H指令為3字節(jié)長。4寄存器間接尋址寄存器間接尋址寄存器間接尋址的操作數(shù)在存儲器中,存儲單元的有效地址EA由寄存器保存,這些寄存器是基址寄存器BX、基址指針寄存器BP、變址寄存器SI和DI之一或它們的某種組合?!纠? 3.2 2】設BX3000H,DS2000H,當執(zhí)行MOV AX,BX指令后,則數(shù)據(jù)段存儲單元為23

6、000H處的字內(nèi)容將被復制AX中,即23000H的內(nèi)容送到AL,23001H的內(nèi)容送到AH。指令中的方括號 在匯編語言中表示間接尋址。尋址儲存器時如何默認段寄存器尋址儲存器時如何默認段寄存器當使用BX、DI和SI尋址存儲器時,寄存器間接尋址或任何其他尋址方式都默認使用數(shù)據(jù)段,而使用基址指針寄存器BP尋址存儲器時,則默認使用堆棧段。在使用寄存器間接尋址時,要注意在某些情況下,要求用指定的類型運算偽指令BYTE PTR、WORD PTR或DWORD PTR來規(guī)定傳送數(shù)據(jù)的長度?!纠? 3.3 3】 MOV AL,SI指令的書寫格式是對的,因為匯編程序能夠清楚地根據(jù)AL來判明SI是指定存儲器數(shù)據(jù)為

7、字節(jié)傳送類型?!纠? 3.4242】MOV SI,6AH指令的書寫格式是模糊的。因為,匯編程序不能根據(jù)立即數(shù)6AH確定SI存儲單元的數(shù)據(jù)類型的長度。如果將此指令書寫成MOV BYTE PYRSI,6AH,則匯編程序就能清楚地判明SI所尋址的存儲單元為字節(jié)類型。5基址加變址尋址基址加變址尋址基址加變址尋址類似于間接尋址,它也是間接地尋址存儲器數(shù)據(jù)。其操作數(shù)的有效地址EA是指令中指定的基址寄存器(BX或BP)和變址寄存器(SI或DI)的內(nèi)容之和。【例例3 3.5 5】MOV BX+SI,CL指令是將寄存器CL中的字節(jié)內(nèi)容復制到數(shù)據(jù)段中由BX加SI尋址的存儲單元中?;芳幼冎穼ぶ房捎糜谔幚頂?shù)組(或

8、表格),通常,用基址寄存器保存數(shù)組(或表格)的起始地址,而變址寄存器保存數(shù)組(或表格)元素的相對位置。如果是用BP寄存器尋址堆棧段存儲器數(shù)組,則由BP寄存器和變址寄存器兩者生成有效地址?!纠? 3.6 6】當執(zhí)行指令MOV DX,BP+SI時,若BP2000H,SI0300H,SS1000H,則指令執(zhí)行后,將把堆棧段中12300H單元的字數(shù)據(jù)傳送到DX寄存器。表3.6給出了基址加變址尋址的指令示例?;芳幼冎穼ぶ返闹噶钍纠芳幼冎穼ぶ返闹噶钍纠?寄存器相對尋址寄存器相對尋址寄存器相對尋址是帶有位移量DISP的基址或變址寄存器(BX、BP或DI、SI)尋址。例如:在MOV AX,SI+400

9、0H指令中,假設SI0500H,DS2000H,則指令執(zhí)行時,CPU按段加偏移尋址機制得到EASI+4000H4500H,再加上DS10H20000H,生成所尋址的存儲器物理地址為24500H,于是,指令執(zhí)行后將把數(shù)據(jù)段存儲單元24500H中的字內(nèi)容送到AX。7相對基址加變址尋址相對基址加變址尋址相對基址加變址尋址是用基址、變址與位移量三個分量之和形成有效地址?!纠? 3.8 8】 在MOV AX,BX+DI+200H指令中,設BX0100H,DI0300H,DS4000H。當CPU指令執(zhí)行時,先計算出EABX+DI+200H0600H,指令運行后,將把數(shù)據(jù)段存儲單元40600H中的字內(nèi)容裝

10、入AX。相對基址加變址尋址的指令示例相對基址加變址尋址的指令示例例如:存儲器中有一個文件FILE包含A、B、C、D 4個記錄,每個記錄又包含10個元素,如果要求將其中存儲在單元RECA中的記錄A的元素0復制到記錄D的元素4,這時,可以用位移量尋址文件,用基址寄存器BX尋址記錄,而用變址寄存器DI尋址記錄中的元素。程序段如下:MOV BX,OFFSET RECA;尋址記錄A的存儲單元RECAMOV DI,0;尋址單元0MOV AL,F(xiàn)ILEBX+DI;取出記錄A的元素0MOV BX,OFFSET RECD;尋址記錄D的存儲單元RECDMOV DI,4;尋址單元4MOV FILEBX+DI,AL;

11、復制到記錄D的元素4中3.1.2 程序存儲器尋址方式程序存儲器尋址方式程序存儲器尋址方式即轉(zhuǎn)移類指令(轉(zhuǎn)移指令JMP和調(diào)用指令CALL)的尋址方式。這種尋址方式最終是要確定一條指令的地址。在8086/8088系統(tǒng)中,由于存儲器采用分段結(jié)構(gòu),所以轉(zhuǎn)移類指令有段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移之分。所有的條件轉(zhuǎn)移指令只允許實現(xiàn)段內(nèi)轉(zhuǎn)移,而且是段內(nèi)短轉(zhuǎn)移,即只允許轉(zhuǎn)移的地址范圍在-128+127字節(jié)內(nèi),由指令中直接給出8位地址位移量。對于無條件轉(zhuǎn)移和調(diào)用指令又可分為段內(nèi)短轉(zhuǎn)移、段內(nèi)直接轉(zhuǎn)移、段內(nèi)間接轉(zhuǎn)移、段間直接轉(zhuǎn)移和段間間接轉(zhuǎn)移等5種不同的尋址方式。3.1.3 堆棧存儲器尋址方式堆棧存儲器尋址方式表3.9列出了可

12、使用的一些PUSH和POP指令的示例。3.1.4其他尋址方式其他尋址方式1 1串操作指令尋址方式串操作指令尋址方式數(shù)據(jù)串(或稱字符串)指令不能使用正常的存儲器尋址方式來存取數(shù)據(jù)串指令中使用的操作數(shù)。執(zhí)行數(shù)據(jù)串指令時,源串操作數(shù)第1個字節(jié)或字的有效地址應存放在源變址寄存器SI中(不允許修改),目標串操作數(shù)第1個字節(jié)或字的有效地址應存放在目標變址寄存器DI中(不允許修改)。在重復串操作時,8086/8088能自動修改SI和DI的內(nèi)容,以使它們能指向后面的字節(jié)或字。因指令中不必給出SI或DI的編碼,故串操作指令采用的是隱含尋址方式。其他尋址方式其他尋址方式2 2I/OI/O端口尋址方式端口尋址方式在

13、8086/8088指令系統(tǒng)中,輸入/輸出指令對I/O端口的尋址可采用直接或間接兩種方式。(1)直接端口尋址:端口地址以8位立即數(shù)方式在指令中直接給出。例如IN AL,n指令是將端口號為8位立即數(shù)n的端口地址中的字節(jié)操作數(shù)輸入到AL,它所尋址的端口號只能在0255范圍內(nèi)。(2)間接端口尋址:這類似于寄存器間接尋址,16位的I/O端口地址在DX寄存器中,即通過DX間接尋址,故可尋址的端口號為065535。例如OUT DX,AL指令是將AL的字節(jié)內(nèi)容輸出到由DX指出的端口中去。3.2 數(shù)據(jù)傳送類指令數(shù)據(jù)傳送類指令數(shù)據(jù)傳送類指令可完成寄存器與寄存器之間、寄存器與存儲器之間以及寄存器與I/O端口之間的字

14、節(jié)或字傳送,除SAHF和POPF指令對標志位有影響外,這類指令所具有的共同特點是不影響標志寄存器的內(nèi)容。3.3 3.3 通用數(shù)據(jù)傳送指令通用數(shù)據(jù)傳送指令通用數(shù)據(jù)傳送指令包括基本的傳送指令MOV,堆棧操作指令PUSH和POP,數(shù)據(jù)交換指令XCHG與字節(jié)翻譯指令XLAT。1 1基本的傳送指令基本的傳送指令MOV d,s;ds指令功能:將由源s指定的源操作數(shù)送到目標d。源操作數(shù)可以是8/16位寄存器、存儲器中的某個字節(jié)/字或者是8/16位立即數(shù);目標操作數(shù)不允許為立即數(shù),其他同源操作數(shù)。且兩者不能同時為存儲器操作數(shù)。MOV指令可實現(xiàn)的數(shù)據(jù)傳送類型指令可實現(xiàn)的數(shù)據(jù)傳送類型(1)MOV mem/reg1

15、,mem/reg2由mem/reg2所指定的存儲單元或寄存器中的8位數(shù)據(jù)或16位數(shù)據(jù)傳送到由mem/reg1所指定的存儲單元或寄存器中,但不允許從存儲器傳送到存儲器。(2)MOV mem/reg,data將8位或16位立即數(shù)data傳送到由mem/reg所指定的存儲單元或寄存器中。(3)MOV reg,data將8位或16位立即數(shù)data傳送到由reg所指定的寄存器中。(4)MOV ac,mem將存儲單元中的8位或16位數(shù)據(jù)傳送到累加器ac中。(5)MOV mem,ac將累加器AL(8位)或AX(16位)中的數(shù)據(jù)傳送到由mem所指定的存儲單元中。(6)MOV mem/reg,segreg將由s

16、egreg所指定的段寄存器(CS、DS、SS、ES之一)的內(nèi)容傳送到由mem/reg所指定的存儲單元或寄存器中。(7)MOV segreg,mem/reg允許將由mem/reg指定的存儲單元或寄存器中的16位數(shù)據(jù)傳送到由segreg所指定的段寄存器(但代碼段寄存器CS除外)中。MOV指令可實現(xiàn)的數(shù)據(jù)傳送舉例指令可實現(xiàn)的數(shù)據(jù)傳送舉例 例:MOV DS,AX指令是對的;MOV CS,AX指令是錯的。注意注意:MOV指令不能直接實現(xiàn)從存儲器到存儲器之間的數(shù)據(jù)傳送,但可以通過寄存器作為中轉(zhuǎn)站來完成這種傳送。例:MOV SI,BX指令是錯的;而用以下兩條指令是對的:MOV AX,BXMOV SI,AX例

17、:要將數(shù)據(jù)段存儲單元ARRAY1中的8位數(shù)據(jù)傳送到存儲單元ARRAY2中,用MOV ARRAY2,ARRAY1指令是錯的;而用以下兩條指令則可以完成:MOV AL,ARRAY1MOV ARRAY2,AL2堆棧操作指令堆棧操作指令(1)PUSH s;字壓入堆棧指令允許將源操作數(shù)(16位)壓入堆棧。(2)POP d;字彈出堆棧指令允許將堆棧中當前棧頂兩相鄰單元的數(shù)據(jù)字彈出到d。這是兩條成對使用的進棧與出棧指令,其中,s和d可以是16位寄存器或存儲器兩相鄰單元,以保證堆棧按字操作。例: 設當前CS1000H,IP0030H,SS2000H,SP0040H,BX2340H,則PUSH BX指令的操作過

18、程如圖3.2所示。POP CX指令執(zhí)行舉例指令執(zhí)行舉例例:設當前CS1000H,IP0020H,SS1600H,SP004CH,則POP CX指令執(zhí)行時,將當前棧頂兩相鄰單元1604CH與1604DH中的數(shù)據(jù)字彈出并傳送到CX中,同時修改堆棧指針,SP+2SP,使之指向新棧頂1604EH。PUSH和POP兩條指令可用來保存并恢復現(xiàn)場數(shù)據(jù)。由于堆棧中的內(nèi)容是按LIFO(后進先出)的次序進行傳送的,因此,保存內(nèi)容和恢復內(nèi)容時,需按照對稱的次序執(zhí)行一系列壓入指令和彈出指令。堆棧段操作時應遵循的幾點原則:堆棧段操作時應遵循的幾點原則:堆棧的存取操作每次必須是一個字(即2個字節(jié)),沒有單字節(jié)的操作指令。

19、執(zhí)行壓棧指令時,總是從高位地址向低位地址存放數(shù)據(jù);執(zhí)行出棧指令時,從堆棧中彈出數(shù)據(jù)則正好相反。堆棧段在內(nèi)存中的物理地址由SS和SP或SS和BP決定,SS是堆棧段寄存器,它是棧區(qū)的最低地址,稱為堆棧的段地址;SP是壓?;虺鰲V噶铍[含使用的堆棧地址指針,它的起始值是堆棧應達到的最大偏移量,即指向棧頂?shù)刂?,因此,堆棧段的范圍是SS16至SS16+SP的起始值。顯然,每執(zhí)行一次壓棧指令,則SP-2,推入堆棧的數(shù)據(jù)放在棧頂;而每執(zhí)行一次彈出指令時,則SP+2。另外,BP寄存器用于對堆棧中的數(shù)據(jù)塊進行隨機存取,例如,MOV AX,BPSI指令執(zhí)行后,將把偏移量為BP+SI的存儲單元的內(nèi)容裝入AX。堆棧指令

20、中的操作數(shù)只能是寄存器或存儲器操作數(shù),而不能是立即數(shù)。對CS段寄存器可以使用壓棧指令PUSH CX,但卻不能使用POP CS這種無效指令,否則,由于它只改變了下一條指令的段地址(CS值),將造成不可預知的結(jié)果。 3數(shù)據(jù)交換指令數(shù)據(jù)交換指令XCHG d,s本指令的功能是將源操作數(shù)與目標操作數(shù)(字節(jié)或字)相互對應交換位置。交換可以在通用寄存器與累加器之間、通用寄存器之間、通用寄存器與存儲器之間進行。但不能在兩個存儲單元之間交換,段寄存器與IP也不能作為源或目標操作數(shù)。例如: XCHG AX,SI+0400H設當前CS1000H,IP0064H,DS2000H,SI3000H,AX1234H,則該指

21、令執(zhí)行后,將把AX寄存器中的1234H與物理地址23400H單元開始的數(shù)據(jù)字(設為ABCDH)相互交換位置,即AXABCDH;(23400H)34H,(23401H)12H。4字節(jié)翻譯指令字節(jié)翻譯指令XLAT 字節(jié)翻譯指令通過查表方式完成代碼轉(zhuǎn)換功能,執(zhí)行操作是:ALBX+AL。執(zhí)行結(jié)果是將待轉(zhuǎn)換的序號轉(zhuǎn)換成對應的代碼,并送回AL寄存器中。代碼轉(zhuǎn)換的操作步驟如下:建立代碼轉(zhuǎn)換表(其最大容量為256字節(jié)),將該表定位到內(nèi)存中某個邏輯段的一片連續(xù)地址中,并將表的首地址的偏移地址置入BX。將待轉(zhuǎn)換的一個十進制數(shù)在表中的序號(又叫索引值)送入AL寄存器中。該值實際上就是表中某一項與表格首地址之間的位移

22、量。執(zhí)行XLAT指令。例如:已知七段顯示碼的編碼規(guī)則為:001000000;101111001;200100100;300110000;400011001;500010010;600000010;701111000;800000000;900010000。設有一個十進制數(shù)09的七段顯示碼表被定位在當前數(shù)據(jù)段中,其起始地址的偏移地址值為0030H。假定當前CS2000H,IP007AH,DS4000H。若欲將AL中待轉(zhuǎn)換的十進制數(shù)5轉(zhuǎn)換成對應的七段碼12H,試分析執(zhí)行XLAT指令的操作過程。執(zhí)行執(zhí)行XLAT指令的操作過程指令的操作過程首先,將數(shù)據(jù)段中該轉(zhuǎn)換表的首地址的偏移地址0030H置入BX;

23、再將待轉(zhuǎn)換的十進制數(shù)在表中的序號05H送入AL;然后,執(zhí)行XLAT指令。字節(jié)翻譯指令字節(jié)翻譯指令XLAT應用舉例應用舉例假設09的七段顯示碼表存放在偏移地址為0030H開始的內(nèi)存中,則取出“5”所對應的七段碼(12H)可以用如下3條指令的程序段完成:MOV BX,0030HMOV AL,5XLAT 3.3.2目標地址傳送指令目標地址傳送指令這是一類專用于傳送地址碼的指令,可傳送存儲器的邏輯地址(即存儲器操作數(shù)的段地址或偏移地址)至指定寄存器中,共包含3條指令:LEA、LDS和LES。1 1LEA dLEA d,s s這是取有效地址指令,其功能是把用于指定源操作數(shù)(它必須是存儲器操作數(shù))的16位

24、偏移地址(即有效地址),傳送到一個指定的16位通用寄存器中。這條指令常用來建立串操作指令所需要的寄存器指針?!纠? 3.1717】LEA BX,SI+100AH設當前CS1500H,IP0200H,DS2000H,SI0030H,源操作數(shù)1234H存放在SI+100AH開始的存儲器內(nèi)存單元中,則該指令的操作過程如圖3.4所示。LEA BX,SI+100AH指令的操作過程如圖3.4所示。注意比較注意比較LEA指令和指令和MOV指令的不同功能指令的不同功能 【例例3 3.1818】 LEA BX,SI指令是將SI指示的偏移地址(SI的內(nèi)容)裝入BX。而MOV BX,SI指令則是將由SI尋址的存儲

25、單元中的數(shù)據(jù)裝入BX。通常,LEA指令用來使某個通用寄存器作為地址指針?!纠? 3.1919】LEA BX,BPDI指令是將內(nèi)存單元的偏移量(BPDI)送BX。LEA SP,3768H指令是使堆棧指針SP為3768H。2LDS d,s這是取某變量的32位地址指針的指令,其功能是從由指令的源s所指定的存儲單元開始,由4個連續(xù)存儲單元中取出某變量的地址指針(共4個字節(jié)),將其前兩個字節(jié)(即變量的偏移地址)傳送到由指令的目標d所指定的某16位通用寄存器,后兩字節(jié)(即變量的段地址)傳送到DS段寄存器中?!纠? 3.2020】LDS SI,DI+100AH設當前CS1000H,IP0604H,DS2

26、000H,DI2400H,待傳送的某變量的地址指針其偏移地址為0180H,段地址為2230H。3LES d,s這條指令與LDS d,s指令的操作基本相同,其區(qū)別僅在于將把由源所指定的某變量的地址指針中后2個字節(jié)(段地址)傳送到ES段寄存器,而不是DS段寄存器。上述3條指令都是裝入地址,但使用時要準確理解它們的不同含義。LEA指令是將16位有效地址裝入任何一個16位通用寄存器;而LDS和LES是將32位地址指針裝入任何一個16位通用寄存器及DS或ES段寄存器。3.2.3標志位傳送指令標志位傳送指令標志位傳送指令共有4條:LAHF、SAHF、PUSHF和POPF。1 1LAHFLAHF指令功能:將

27、標志寄存器F的低字節(jié)(共包含5個狀態(tài)標志位)傳送到AH寄存器中。LSHF指令執(zhí)行后,AH的D7、D6、D4、D2與D0 5位將分別被設置成SF(符號標志)、ZF(零標志)、AF(輔助進位標志)、PF(奇偶標志)與CF(進位標志)5位,而AH的D5、D3、D1 3位沒有意義。2 2SAHFSAHF指令功能:將AH寄存器內(nèi)容傳送到標志寄存器F的低字節(jié)。SAHF與LAHF的功能相反,它常用來通過AH對標志寄存器的SF、ZF、AF、PF與CF標志位分別置1或復0。上述2條指令只涉及到對標志寄存器F的低8位進行操作,這是為了保持8086指令系統(tǒng)對80888085指令系統(tǒng)的兼容性。3.2.3標志位傳送指令

28、標志位傳送指令3 3PUSHFPUSHF指令功能:將16位標志寄存器F內(nèi)容入棧保護。其操作過程與前述的PUSH指令類似。4 4POPFPOPF指令功能:將當前棧頂和次棧頂中的數(shù)據(jù)字彈出送回到標志寄存器F中。PUSHF與POPF 2條指令常成對出現(xiàn),一般用在子程序和中斷處理程序的首尾,用來保護和恢復主程序涉及的標志寄存器內(nèi)容。必要時可用來修改標志寄存器的內(nèi)容。3.2.4 I/O數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令1 1ININ累加器,端口號累加器,端口號IN指令是將指定端口中的內(nèi)容輸入到累加器AL/AX中。其指令如下:IN AL,PORT ;AL(端口PORT),即把端口PORT中的字節(jié)內(nèi)容讀入ALIN A

29、X,PORT ;AX(端口PORT),即把由PORT兩相鄰端口中的字內(nèi)容讀入AXIN AL,DX ;AL(端口(DX),即從DX所指的端口中讀取1個字節(jié)內(nèi)容送ALIN AX,DX ;AX(端口(DX),即從DX和DX1所指的兩個端口中讀取1個字內(nèi)容送AX【例例3 3.2121】IN AL,40H設當前CS1000H,IP0050H;8位端口40H中的內(nèi)容為55H。 3.2.4 I/O數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令2 2OUTOUT端口號,累加器端口號,累加器與IN指令相同,端口號可以由8位立即數(shù)給出,也可由DX寄存器間接給出。OUT指令是把累加器AL/AX中的內(nèi)容輸出到指定的端口。其指令如下:OUT

30、 PORT,AL;端口PORTAL,即把AL中的字節(jié)內(nèi)容輸出到由PORT直接指定的端口OUT PORT,AX;端口PORTAX,即把AX中的字內(nèi)容輸出到由PORT直接指定的端口OUT DX,AL;端口(DX)AL,即把AL中的字節(jié)內(nèi)容輸出到由DX所指定的端口OUT DX,AX;端口(DX)AX,即把AX中的字內(nèi)容輸出到由DX所指定的端口例例 3 3.22 22 OUT DX,AL設當前CS4000H,IP0020H,DX6A10H,AL66H。3.3 算術運算類指令算術運算類指令3.3.13.3.1加法指令加法指令1 1ADD dADD d,s s;dd+sdd+s例例 3 3.23 23 A

31、DD WORD PTRBX+106BH,1234H設當前CS1000H,IP0300H,DS2000H,BX1200H。3.3 算術運算類指令算術運算類指令【例例3 3.2424】 寄存器加法。若將AX、BX、CX和DX的內(nèi)容累加,再將所得的16位的和數(shù)存入AX,則加法程序段如下:ADD AX,BX;AXAX+BXADD AX,CX;AXAX+BX+CXADD AX,DX;AXAX+BX+CX+DX【例例3 3.2525】立即數(shù)加法。當常數(shù)或已知數(shù)相加時總是用立即數(shù)加法。若將立即數(shù)12H取入DL,然后用立即數(shù)加法指令再將34H加到DL中的12H上,所得的結(jié)果(即和數(shù)46H)放在DL中,則程序段

32、如下:MOV DL,12HADD DL,34H程序執(zhí)行后,標志位的改變?yōu)椋篛F0(沒有溢出),SF0(結(jié)果為正),ZF0(結(jié)果不是0),AF0(沒有半進位),PF0(奇偶性為奇),CF0(沒有進位)。3.3 算術運算類指令算術運算類指令【例例3 3.2626】存儲器與寄存器的加法。假定要求將存儲在數(shù)據(jù)段中其偏移地址為NUMB和NUMB+1連續(xù)單元的字節(jié)數(shù)據(jù)累加到AL,則加法程序段如下:MOV DI,OFFSET NUMB;偏移地址NUMB裝入DIMOV AL,0;AL清零ADD AL,DI;將NUMB單元的字節(jié)內(nèi)容加AL,和數(shù)存ALADD AL,DI+1;累加NUMB+1單元中的字節(jié)內(nèi)容,累加

33、和存AL3.3 算術運算類指令算術運算類指令【例例3 3.2727】 數(shù)組加法。存儲器數(shù)組是一個按順序排列的數(shù)據(jù)表。假定數(shù)據(jù)數(shù)組(ARRAY)包括從元素0到元素9共10個字節(jié)數(shù)。現(xiàn)要求累加元素3、元素5和元素7,則加法程序段如下:MOV AL,0;存放和數(shù)的AL清0MOV SI,3;將SI指向元素3ADD AL,ARRAYSI;加元素3ADD AL,ARRAYSI+2;加元素5ADD AL,ARRAYSI+4;加元素7本程序段中首先將AL清0,為求累加和做準備。然后,把3裝入源變址寄存器SI,初始化為尋址數(shù)組元素3。ADD AL,ARRAYSI指令是將數(shù)組元素3加到AL中。接著的兩條加法指令是

34、將元素5和7累加到AL中,指令用SI中原有的3加位移量2來尋址元素5,再用加4尋址元素7。3.3 算術運算類指令算術運算類指令2 2ADC dADC d,s s;dd+s+CFdd+s+CF帶進位加法(ADC)指令的操作過程與ADD指令基本相同,惟一的不同是進位標志位CF的原狀態(tài)也將一起參與加法運算,待運算結(jié)束,CF將重新根據(jù)結(jié)果置成新的狀態(tài)。ADC AX,BX;AXAX+BX+C(進位位)ADC BX,BP+2;由BX+2尋址的堆棧段存儲單元的字內(nèi)容加BX和進位位,結(jié)果存入BX帶進位加法(帶進位加法(ADC)指令使用舉例)指令使用舉例【例例3 3.2828】假定要實現(xiàn)BX和AX中的4字節(jié)數(shù)字

35、與DX和CX中的4字節(jié)數(shù)字相加,其結(jié)果存入BX和AX中,則多字節(jié)加法的程序段如下: ADD AX,CXADC BX,DX上述多字節(jié)相加的程序段中用了ADD與ADC兩條不同的加法指令,由于AX和CX的內(nèi)容相加形成和的低16位時,可能產(chǎn)生也可能不產(chǎn)生進位,而事先又不可能斷定有無進位,因此,在高16位相加時,就必須要采用帶進位位的加法指令ADC。最后,程序把BX、AX的4字節(jié)內(nèi)容加到DX、CX兩個寄存器,而和數(shù)則存入BX、AX兩個寄存器中。3.3 算術運算類指令算術運算類指令3 3INC dINC d;dd+1dd+1指令功能:將目標操作數(shù)當作無符號數(shù),完成加1操作后,結(jié)果仍保留在目標中。例如:IN

36、C SP;SPSP+1INC BYTE PTRBX+1000H;把數(shù)據(jù)段中由BX+1000H尋址的存儲單元的字節(jié)內(nèi)容加1INC WORD PTRSI;把數(shù)據(jù)段中由SI尋址的存儲單元的字內(nèi)容加1INC DATA1;把數(shù)據(jù)段中DATA1存儲單元的內(nèi)容加1注意注意:間接尋址的存儲單元加1指令,數(shù)據(jù)的長度必須用TYPE PTR、WORD PTR或DWORD PTR類型偽指令加以說明,否則,匯編程序不能確定是對字節(jié)、字還是雙字加1。INC指令只影響OF、SF、ZF、AF、PF 5個標志,而不影響進位標志CF,故不能利用INC指令來設置進位位,否則程序會出錯。3.3.2 減法指令減法指令1 1SUB dS

37、UB d,s s;dd-sdd-s 指令功能:將目標操作數(shù)減去源操作數(shù),其結(jié)果送回目標,并根據(jù)運算結(jié)果置標志位。 【例例3 3.2929】SUB AX,BX設當前CS1000H,IP60C0H,DS2000H,BX970EH。SUB AX,BX指令執(zhí)行的結(jié)果指令執(zhí)行的結(jié)果該指令執(zhí)行后,將AX寄存器中的目標操作數(shù)8811H減去物理地址2970EH和2970FH單元中的源操作數(shù)00FFH,并把結(jié)果8712H送回AX中。各標志位的改變?yōu)椋篛0(沒有溢出),S1(結(jié)果為負),Z0(結(jié)果不為0),A1(有半進位),P1(奇偶性為偶),C0(沒有借位)。SUB指令的尋址方式和匯編語句形式也很多,例如:SU

38、B CL,BL;CLCL-BLSUB AX,SP;AXAX-SPSUB BH,6AH;BHBH-6AHSUB AX,0AAAAH;AXAX-0AAAAHSUB DI,TEMPSI;從DI中減去由TEMP+SI尋址的數(shù)據(jù)段存儲單元的字內(nèi)容3.3.2減法指令減法指令2 2SBB dSBB d,s s;dd-s-CFdd-s-CF本指令與SUB指令的功能、執(zhí)行過程基本相同,唯一不同的是完成減法運算時還要再減去進位標志CF的原狀態(tài)。運算結(jié)束時,CF將被置成新狀態(tài)。例如:SBB AX,BX;AXAX-BX-CFSBB WOLD PTRDI,50A0H;從由DI尋址的數(shù)據(jù)段字存儲單元的內(nèi)容減去50A0H及

39、CF的值SBB DI,BP+2;從DI中減去由BP+2尋址的堆棧段字存儲單元的內(nèi)容及借位【例例3.303.30】假定從存于BX和AX中的4字節(jié)數(shù)減去存于SI和DI中的4字節(jié)數(shù),則程序段為:SUB AX,DISBB BX,SI3DEC d;dd-1減1指令功能:將目標操作數(shù)的內(nèi)容減1后送回目標。目標操作數(shù)可以是8/16位通用寄存器和存儲器操作數(shù),但不允許是立即數(shù)。例如:DEC BL;BLBL-1DEC CX;CXCX-1DEC BYTE PTRDI;由DI尋址的數(shù)據(jù)段字節(jié)存儲單元的內(nèi)容減1DEC WORD PTRBP;由BP尋址的數(shù)據(jù)段字存儲單元的內(nèi)容減13.3.2 減法指令減法指令NEG是一條

40、求補碼的指令,簡稱求補指令。指令功能:將目標操作數(shù)取負后送回目標。目標操作數(shù)可以是8/16位通用寄存器或存儲器操作數(shù)。 若AL00000100+4,執(zhí)行NEG AL指令后得11111100-4補;若AL11101110-18補,執(zhí)行NEG AL指令后將變成00010010+18?!纠? 3.3131】NEG BYTE PTRBX設當前CS1000H,IP200AH,DS2000H,BX3000H,且由目標BX所指向的存儲單元(DS16+BX23000H)已定義為字節(jié)變量(假定為FDH),則該指令執(zhí)行后,將物理地址23000H中的的目標操作數(shù)FDH-3補,變成+3送回物理地址23000H單元中

41、。3.3.2減法指令減法指令5 5CMP dCMP d,s s;d-sd-s,只置標志位,只置標志位指令功能:將目標操作數(shù)與源操作數(shù)相減但不送回結(jié)果,只根據(jù)運算結(jié)果置標志位。例如:CMP DI,BL;DI尋址的數(shù)據(jù)段存儲單元的字節(jié)內(nèi)容減BLCMP CL,BP;用CL減由BP尋址的堆棧段存儲單元的字節(jié)內(nèi)容CMP SI,TEMPBX ;由SI減由TEMP+BX尋址的數(shù)據(jù)段存儲單元的字內(nèi)容【例例3 3.3232】假如,要將CL的內(nèi)容與64H作比較,當CL64H時,則程序轉(zhuǎn)向存儲器地址SUBER處繼續(xù)執(zhí)行。其程序段為:CMP CL,64H;CL與64H作比較JAE SUBER;如果等于或高于則跳轉(zhuǎn)以上

42、的JAE為一條等于或高于的條件轉(zhuǎn)移指令。3.3.3乘法指令乘法指令乘法指令用來實現(xiàn)兩個二進制操作數(shù)的相乘運算,包括兩條指令:無符號數(shù)乘法指令MUL和有符號數(shù)乘法指令IMUL。1.MUL s1.MUL sMUL s是無符號乘法指令,完成兩個無符號的8/16位二進制數(shù)相乘的功能。被乘數(shù)隱含在累加器AL/AX中;指令中由s指定的源操作數(shù)作乘數(shù),它可以是8/16位通用寄存器或存儲器操作數(shù)。相乘所得雙倍位長的積,按其高8/16位與低8/16位兩部分分別存放到AH與AL或DX與AX中去,即對8位二進制數(shù)乘法,其16位積的高8位存于AH,低8位存于AL;而對16位二進制數(shù)乘法,其32位積的高16位存于DX,

43、低16位存于AX。若運算結(jié)果的高位字節(jié)或高位字有效,即AH0或DX0,則將CF和OF兩標志位同時置“1”;否則,CFOF0。MUL BYTE PTRBX+2AH指令的操作過程指令的操作過程【例例3 3.3333】 MUL BYTE PTRBX+2AH設當前CS3000H,IP0250H,AL12H,DS2000H,BX0234H,且源操作數(shù)已被定義為字節(jié)變量(66H),則該指令執(zhí)行后,乘積072CH存放于AX中。3.3.3乘法指令乘法指令2 2IMUL sIMUL sIMUL s是有符號乘法指令,完成兩個帶符號的8/16位二進制數(shù)相乘的功能。對于兩個帶符號的數(shù)相乘,不能簡單采用與無符號數(shù)乘法相

44、同的操作過程,否則會產(chǎn)生完全錯誤的結(jié)果。為此,專門設置了IMUL指令。IMUL指令除計算對象是帶符號二進制數(shù)以外,其他都與MUL是一樣的,但結(jié)果不同。IMUL指令對OF和CF的影響是:若乘積的高一半是低一半的符號擴展,則OFCF0;否則均為1。它仍然可用來判斷相乘的結(jié)果中高一半是否含有有效數(shù)值。另外,IMUL指令對其他標志位沒有定義。有關IMUL指令的其他約定都與MUL指令相同。IMUL指令示例指令示例IMUL CL;AX(AL)(CL)IMUL CX;DX、AX(AX)(CX)IMUL BYTE PTRBX;AX(AL)BX,即AL中的和BX所指內(nèi)存單元中的兩個8位有符號數(shù);相乘,結(jié)果送AX

45、中IMUL WORD PTRDI;DX、AX(AX)DI,即AX中的和DI、DI+1所指內(nèi)存單元中的兩個16;位有符號數(shù)相乘,結(jié)果送DX和AX中3.3.4除法指令除法指令除法指令包括無符號二進制數(shù)除法指令DIV和有符號二進制數(shù)除法指令IDIV。1 1DIV sDIV sDIV s指令完成兩個不帶符號的二進制數(shù)相除的功能。被除數(shù)隱含在累加器AX(字節(jié)除)或DX、AX(字除)中。指令中由s給出的源操作數(shù)作除數(shù),可以是8/16位通用寄存器或存儲器操作數(shù)。對于字節(jié)除法,所得的商存于AL,余數(shù)存于AH。對于字除法,所得的商存于AX,余數(shù)存于DX。根據(jù)8086的約定,余數(shù)的符號應與被除數(shù)的符號一致。例如:

46、DIV BYTE PTRBX+SI設當前CS1000H,IP0406H,BX2000H,SI050EH,DS3000H,AX1500H,存儲器中的源操作數(shù)已被定義為字節(jié)變量22H,則該指令執(zhí)行后,所得商數(shù)9EH存于AL中,余數(shù)04H存于AH中。3.3.4除法指令除法指令2 2IDIV sIDIV sIDIV指令完成將兩個帶符號的二進制數(shù)相除的功能。它與DIV指令的主要區(qū)別在于對符號位處理的約定,其他約定相同。例如:IDIV BX ;將DX和AX中的32位數(shù)除以BX中的16位數(shù),商在AX中,余數(shù)在DX中IDIV BYTE PTRSI;將AX中的16位數(shù)除以SI所指內(nèi)存單元的8位數(shù),所得的商在AL

47、中,余數(shù)在AH中3 3CBWCBW和和CWDCWDCBW和CWD是兩條專門為IDIV指令設置的符號擴展指令,用來擴展被除數(shù)字節(jié)/字為字/雙字的符號,所擴充的高位字節(jié)/字部分均為低位的符號位。它們在使用時應安排在IDIV指令之前,執(zhí)行結(jié)果對標志位沒有影響。符號擴展指令常用來獲得除法指令所需要的被除數(shù)。例如AXFF00H,它表示有符號數(shù)-256;執(zhí)行CWD指令后,則DXFFFFH,DX、AX仍表示有符號數(shù)-256。【例例3 3.3535】進行有符號數(shù)除法AXBX的指令如下:CWDIDIV BX對無符號數(shù)除法應該采用直接使高8位或高16位清0的方法,以獲得倍長的被除數(shù)。3.3.5十進制調(diào)整指令十進制

48、調(diào)整指令為方便地進行十進制數(shù)的運算,必須對計算機內(nèi)的二進制運算結(jié)果進行十進制調(diào)整。為此,8086專門為完成十進制數(shù)運算而提供了一組十進制調(diào)整指令。十進制數(shù)是用BCD碼(即二進制編碼的十進制數(shù))表示的。 1 1DAADAADAA是加法的十進制調(diào)整指令,它必須跟在ADD或ADC指令之后使用。功能:將存于AL中的2位BCD碼加法運算的結(jié)果調(diào)整為2位壓縮型十進制數(shù),仍保留在AL中?!纠? 3.3636】 設當前AX6698,BX2877,如果要將這兩個十進制數(shù)相加,結(jié)果保留在AX中,則需要用下列幾條指令來完成。ADD AL,BL;低字節(jié)相加DAA;低字節(jié)調(diào)整MOV CL,ALMOV AL,AHADC

49、 AL,BH;高字節(jié)相加DAA;高字節(jié)調(diào)整MOV AH,ALMOV AL,CL用用BCD碼計算碼計算47+28?【例例3 3.3737】 用BCD碼計算47+28?試寫出程序段。MOV AL,47H ;把壓縮BCD數(shù)47H送ALADD AL,28H ;AL47與28之和75HDAA ;調(diào)整得:AL75H,即(47)BCD+(28)BCD(75)BCD3.3.5十進制調(diào)整指令十進制調(diào)整指令2 2DASDASDAS是減法的十進制調(diào)整指令,它必須跟在SUB或SBB指令之后,將AL寄存器中的減法運算結(jié)果調(diào)整為2位壓縮型十進制數(shù),仍保留在AL中。減法是加法的逆運算,對減法的調(diào)整操作是減6調(diào)整?!纠?.3

50、8】用BCD碼計算4728?試寫出程序段。MOV AL,47H ;把壓縮BCD數(shù)47H送ALSUB AL,28H ;AL47與28之差19HDAS ;調(diào)整得:AL19H,即(47)BCD(28)BCD(19)BCD十進制調(diào)整指令十進制調(diào)整指令3 3AAAAAAAAA是加法的ASCII碼調(diào)整指令,也是只能跟在ADD指令之后使用。功能:是將存于AL寄存器中的1位ASCII碼數(shù)加法運算的結(jié)果調(diào)整為1位非壓縮型十進制數(shù),仍保留在AL中;如果向高位有進位(AF1),則進到AH中。調(diào)整過程與DAA相似。具體算法如下: 若AL的低4位是在09之間,且AF0,則跳過第步,執(zhí)行第步。 若AL的低4位是在0AH0

51、FH之間,或AF1,則AL寄存器需進行加6調(diào)整,AH寄存器加1,且使CF1。 AL的高4位雖參加運算,但不影響運算結(jié)果,無需調(diào)整,且清除之。AAA十進制調(diào)整指令用法舉例十進制調(diào)整指令用法舉例【例例3 3.3939】若AX0835H,BL39H,則執(zhí)行下列指令:ADD AL,BLAAA結(jié)果是AX0904H,AF1,且CF1。其運算與調(diào)整過程如下:例3.40 若有兩個用ASCII碼表示的2位十進制數(shù)分別存放在AX和BX寄存器中,即AX0011011000110111BX0011100100110101現(xiàn)要求將兩數(shù)相加,并把結(jié)果保留在AX中,如果有進位,將進位置入DX中。則完成上述功能的程序段如下:

52、MOV DX,0MOV CX,AX;CX67MOV AH,0ADD AL,BL;AL7+5AAA;AH01H,AL02HMOV CL,AL;CL02HMOV AL,CH;AL6ADD AL,AHAAA;AL07HMOV AH,ADD AL,BHAAA;AH01H,AL06HMOV CH,AL;CH06HADD DL,AH;DL01HMOV AX,CX;AX0602HAX0011011000110111BX0011100100110101AX+ BX 結(jié)果如下:正確的十進制結(jié)果為162,并以非壓縮型BCD碼形式存放在DX、AX中,如下所示。寫出計算寫出計算7+8的程序段的程序段【例例3 3.41

53、41】用BCD碼計算7+8?試寫出程序段。 MOV AL,07H ;把把非壓縮BCD數(shù)07H送ALADD AL,08H ;AL07與08之和15H,即(07)BCD+(08)BCD(15)BCDAAA ;調(diào)整得:AL05H,AH01H十進制調(diào)整指令十進制調(diào)整指令4 4AASAASAAS是減法的ASCII碼調(diào)整指令,它也必須跟在SUB或SBB指令之后,用來將AL寄存器中的減法運算結(jié)果調(diào)整為1位非壓縮型十進制數(shù);如果有借位,則保留在借位標志CF中。【例例3.423.42】用BCD碼計算78?試寫出程序段。MOV AL,07H ;把非壓縮BCD數(shù)07H送ALSUB AL,08H ;AL07與08之差

54、-01HAAS ;調(diào)整得:AL-01H,AHFFH3.3.5十進制調(diào)整指令十進制調(diào)整指令5 5AAMAAMAAM是乘法的ASCII碼調(diào)整指令。用來將AL中的乘法運算結(jié)果調(diào)整為2位非壓縮型十進制數(shù),其高位在AH中,低位在AL中。參加乘法運算的十進制數(shù)必須是非壓縮型,故通常在MUL指令之前安排兩條AND指令。 例例3.43 3.43 完成AL與BL中兩個非壓縮型十進制數(shù)乘法運算,試寫出程序段。AND AL,0FHAND BL,0FH MUL BLAAM:AND AL,0FHAND BL,0FHMUL BL執(zhí)行MUL指令的結(jié)果,會在AL中得到8位二進制數(shù)結(jié)果,用AAM指令可將AL中結(jié)果調(diào)整為2位非壓

55、縮型十進制數(shù),并保留在AX中。其調(diào)整操作是:將AL寄存器中的結(jié)果除以10,所得商數(shù)即為高位十進制數(shù)置入AH中,所得余數(shù)即為低位十進制數(shù)置入AL中。寫出用寫出用BCD碼計算碼計算57的程序段的程序段 例例3.44 3.44 用BCD碼計算57?試寫出程序段。MOV AL,05H ;把非壓縮BCD數(shù)05H送入ALMOV BL,07H ;把非壓縮BCD數(shù)05H送入BLMUL BL ;AL05與07之積23HAAM ;調(diào)整得:AH03H,AL05H;即AX0305H 6AADAAD是除法的ASCII碼調(diào)整指令。它與上述調(diào)整指令的操作不同,它是在除法之前進行調(diào)整操作。AAD指令的調(diào)整操作是將累加器AX中

56、的2位非壓縮型十進制的被除數(shù)調(diào)整為二進制數(shù),保留在AL中。具體做法:將AH中的高位十進制數(shù)乘以10,與AL中的低位十進制數(shù)相加,結(jié)果保留在AL中。例例3.453.45 用BCD碼計算345?試寫出程序段。MOV AX,0304H ;把兩個非壓縮BCD數(shù)0304H送入AXMOV BL,05H ;把一個非壓縮BCD數(shù)05H送入BLAAD ;先把AX中的BCD數(shù)轉(zhuǎn)換成二進制數(shù)0310+0434D22H送ALDIV BL ;調(diào)整后的被除數(shù)22H真正代表34D,再做除法運算,即得AL06H,AH04H3.4 邏輯運算和移位循環(huán)類指令邏輯運算和移位循環(huán)類指令1.1.邏輯運算指令邏輯運算指令(1)AND d

57、,s;dds,按位“與”操作源操作數(shù)可以是8/16位通用寄存器、存儲器操作數(shù)或立即數(shù);目標操作數(shù)只允許是通用寄存器或存儲器操作數(shù)。例如:AND AX,ALPHA設當前CS2000H,IP0400H,DS1000H,AXF0F0H,ALPHA是數(shù)據(jù)段中偏移地址為0500H 和0501H地址中的字變量7788H的名字。則執(zhí)行該指令后,將累加器AX中的F0F0H與物理地址10500H和10501H地址中的數(shù)據(jù)字7788H進行邏輯“與”運算后得結(jié)果為7080H,并把它送回AX寄存器中。(2)OR d,s;dds,按位“或”操作源操作數(shù)與目標操作數(shù)的約定同AND指令。(3)XOR d,s;dds,按位“

58、異或”操作源操作數(shù)與目標操作數(shù)的約定同AND指令。(4)NOT d;d,按位取反操作。(5)TEST d,s;ds,按位“與”操作,不送回結(jié)果3.4邏輯運算和移位循環(huán)類指令邏輯運算和移位循環(huán)類指令2.2.移位與循環(huán)移位指令移位與循環(huán)移位指令移位與循環(huán)移位指令移位與循環(huán)移位指令1) 1) 移位指令移位指令移位指令分為算術移位和邏輯移位,共有4條,即算術左移SAL、算術右移SAR和邏輯左移SHL、邏輯右移SHR。算術移位是對帶符號數(shù)進行移位,SAL指令在左移時,最低位補0;SAR指令在右移時,最高位的符號在移位過程中保持不變;而邏輯移位是對無符號數(shù)移位,總是用“0”來填補已空出的位。SHL指令在邏

59、輯左移時,最低位補0;SHR在右移時,最高位補0。注意注意:根據(jù)移位操作的結(jié)果將置標志寄存器中的狀態(tài)標志(AF標志除外)。若移位位數(shù)是1位,移位結(jié)果使最高位(符號位)發(fā)生變化,則將溢出標志OF置“1”,對有符號數(shù),可由此判斷已產(chǎn)生溢出;若移n位,則OF標志將無效。【例例3.493.49】若欲將BX的內(nèi)容算術左移1位,最低位補0,則使用指令:SAL BX,1?!纠?.503.50】若欲將AX中的內(nèi)容左移4位,則使用下列程序段:MOV CL,4SAL AX,CL循環(huán)移位指令循環(huán)移位指令循環(huán)移位指令是將操作數(shù)首尾相接進行移位,它分為不帶進位位與帶進位位循環(huán)移位,也有4條,即不帶進位位的循環(huán)左、右移

60、指令(又稱小循環(huán))ROL、ROR和帶進位位的循環(huán)左、右移指令(又稱大循環(huán))RCL、RCR。注意,循環(huán)移位指令只影響CF和OF標志。CF標志總是保持移出的最后一位的狀態(tài)。若只循環(huán)移1位,且使最高位發(fā)生變化,則OF標志置“1”;若循環(huán)移多位,則OF標志無效。 所有移位與循環(huán)移位指令的目標操作數(shù)只允許是8/16位通用寄存器或存儲器操作數(shù),指令中的count(計數(shù)值)可以是1,也可以是n(n255)。若移1位,指令的count字段直接寫1;若移n位時,則必須將n事先裝入CL寄存器中,故count字段只能書寫CL而不能用立即數(shù)n。 循環(huán)移位指令應用舉例循環(huán)移位指令應用舉例 例例3.51 3.51 將將D

溫馨提示

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

最新文檔

評論

0/150

提交評論