第四章-指令系統(tǒng)-重慶郵電大學計算機科學與技術學院_第1頁
第四章-指令系統(tǒng)-重慶郵電大學計算機科學與技術學院_第2頁
第四章-指令系統(tǒng)-重慶郵電大學計算機科學與技術學院_第3頁
第四章-指令系統(tǒng)-重慶郵電大學計算機科學與技術學院_第4頁
第四章-指令系統(tǒng)-重慶郵電大學計算機科學與技術學院_第5頁
已閱讀5頁,還剩132頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

《微機原理與接口技術》

第四章主講:方義秋1第四章指令系統(tǒng)

指令系統(tǒng)是微處理器(CPU)所能執(zhí)行的指令的集合,它與微處理器有密切的聯(lián)系,不同的微處理器有不同的指令系統(tǒng)。在本章中我們主要講解INTEL公司生產的80486CPU的尋址方式以及各種指令系統(tǒng),并通過具體實例講述了各條指令的功能和使用方法。通過本章的學習,讀者應該掌握以下內容:

?三種操作數(shù)的尋址方式

?常用指令的格式、功能、以及對標志位的影響2第四章指令系統(tǒng)4.1概述4.280486的尋址方式4.380486的標志寄存器4.480486的基本指令集34.1概述1、指令的書寫格式

(1)指令——計算機可以執(zhí)行的各種操作命令稱為指令。通常一條指令對應一種基本操作,例如加、減、傳送、移位等。計算機所能執(zhí)行的全部命令的集合即為該計算機的指令系統(tǒng)。(2)書寫格式:

機器指令——硬件可識別、可存儲和運行的一串二進制描述符

符號指令——用助記符和規(guī)定的書寫格式書寫的指令。 例

表4.1一個符號指令的機器指令有1~16個字節(jié),在內存中連續(xù)存放。

4(3)指令地址——CPU規(guī)定:存放指令第一字節(jié)的內存地址稱為指令地址。52、符號指令的書寫格式

例:

LAST:MOVAX,CX;將CX的內容送入AX中(1)標號——地表該指令的存放地址,為程序分支、循環(huán)提供了轉移目標。

標號的命名規(guī)則:字母或下劃線開頭,后跟字母、數(shù)字、下劃線≤31個字符。

“系統(tǒng)保留字”不能作為標號使用。

(2)操作碼——規(guī)定指令要執(zhí)行的操作。

(3)操作數(shù)——指令的操作對象;操作數(shù)可以有一個,也可以有兩個,一個源操作數(shù),一個目的操作數(shù)。其長度可以是單字節(jié)、雙字節(jié)或者四字節(jié),內存中連續(xù)存放。

存放規(guī)則:低字節(jié)存放在i單元,高字節(jié)存放在i+1單元。

標號:操作碼操作數(shù);注釋63、匯編源程序——用符號指令編寫的程序。需編輯(EDIT.EXE)、編譯(TASM.EXE)和鏈接(LINK.EXE)生成CPU可執(zhí)行的目標程序。

4、目標程序——機器指令編寫的程序,CPU可執(zhí)行。74.280486的尋址方式

計算機中的指令有些不需要操作數(shù),大多數(shù)指令采用一個或兩個操作數(shù)。操作數(shù)分為三類:(1)立即數(shù)——操作數(shù)可以跟隨在指令操作碼之后;(2)寄存器操作數(shù)——操作數(shù)存放在CPU內部的寄存器中;(3)存儲器操作數(shù)——絕大多數(shù)的操作數(shù)存放在內存儲器中。尋址——指令指定操作數(shù)的位置,即給出地址信息,在執(zhí)行時需要根據(jù)這個地址信息找到需要的操作數(shù)。這種尋找操作數(shù)的過程稱為尋址,而尋找操作數(shù)的方法稱為尋址方式。80486有7種尋址方法,其中訪問存儲器有5種尋址方式。

8立即尋址方式中,指令操作碼和操作數(shù)都在存儲器代碼段中,是指令的一部分,取出指令即得操作數(shù)。(1)立即數(shù)表示形式——可為多種數(shù)制的數(shù),或由+、—、*、/組成的算術表達式。必須以數(shù)字開頭,以字母開頭的十六進制數(shù)前必須以數(shù)字0做前綴。

數(shù)制用后綴表示:B、H、Q、D(可省略)

(2)編譯時,立即數(shù)一律編譯成等值的二進制數(shù),負數(shù)—>補碼,字符’A’—>ASCII。4.2.1立即尋址9下例指令的功能是把源操作數(shù)(立即數(shù))寫入目標寄存器中,其中源操作數(shù)就是立即尋址:MOV

AL,01010101B;8位二進制數(shù)MOV BX,1234H;16位十六進制數(shù)MOV CL,4;8位十進制數(shù)MOV DL,’A’;8位字符MOV BL,0A6H;8位十六進制數(shù)MOV CX,3*5;16位算術表達式MOV EAX,12345678H;32位十六進制數(shù)

104.2.2寄存器尋址

操作數(shù)存放在CPU的某個寄存器中。尋址:寫出寄存器名。例:MOV DS,AX;AX寄存器內容送DSMOV CL,BL;BL寄存器的內容送CLINC SI;SI寄存器的內容加1DEC DI;DI寄存器的內容減1ADD EAX,EBX;EAX,EBX內容相加,結果送→EAX114.2.3存儲器操作數(shù)的尋址方式

操作數(shù)存放(或寫入)某個邏輯段的存儲單元之中,所以須給出用邏輯地址計算物理地址的地址表達式。

(1)完整的地址表達式:

段寄存器:[基址+變址*比例因子+位移量

]段超越前綴有效地址(EA)又稱偏移地址

段超越前綴——通知CPU指令要訪問的是哪一個邏輯段。

偏移地址——在一個邏輯段中,某存儲單元相對于段首址之間的地址偏移量。

12基址——任何通用寄存器(32位)的內容。基址寄存器通常用于編譯程序指向局部變量區(qū)。

變址——除ESP以外的任何通用寄存器(32位)的內容。變址寄存器用于訪問數(shù)組或字符串元素。

位移量——包含在指令中的立即數(shù)。(2)實模式下:把段基址(CS內容)*16+偏移地址==>物理地址(3)保護模式下:段基址寄存器中寫入的不是段基址,而是選擇符,CPU利用段選擇符和段頁管理部件查找出段基址+有效地址···==>物理地址。

32位尋址方式如圖13

符符符符符符145種寄存器尋址方式: 1、直接尋址 2、寄存器間接尋址 3、基址尋址 4、變址尋址 5、基址加變址尋址

15兩種書寫格式:

(1)直接寫出有效地址。例如:

MOV BX,DS:[1234H];取出一個字的內容—>BX

MOV AL,ES:[2CH];取出一個字節(jié)的內容—>AL

(2)用變量名代替存儲單元的有效地址。(因經匯編后,存儲單元的有效地址就賦給了變量名)例如:

MOV AX,DS:BUF;取出數(shù)據(jù)段以BUF命名的字的內容—>AX

或者MOV AX,BUF1、直接尋址

DS:0000H┇

2211

1234H

111235H

22

┇內存BHBL16間址寄存器——事先把存儲單元的有效地址寫入規(guī)定的寄存器中。

指令地址的表達格式:

段寄存器:[間址寄存器]

對于約定的邏輯段,其段超越前綴可省略。例如:

DATA1 DB 11H,55H;定義變量

DATA2 DW3322H

···MOV DS,數(shù)據(jù)段段基址···

MOV

SI,OFFSETDATA1;變量DATA1單元的有效地址

MOV AL,[SI];訪問數(shù)據(jù)段用SI間址取數(shù)—>AL,AL=11HMOV DI,OFFSETDATA2MOVBX,[DI];BX=3322H2、寄存器間接尋址(簡稱間址或間接尋址)

17例如:MOVAX,[BX]若在實模式下(DS)=2000H,(BX)=1000H物理地址=20000H+1000H=21000H。指令執(zhí)行前,(AX)=2030H,(21000H)=0A0H,(21001H)=50H,指令執(zhí)行后,(AX)=50A0H,(21000H)=0A0H,(21001H)=50H。指令執(zhí)行情況如下:寄存器間接尋址示意圖:1111880486哪些寄存器可作為間址寄存器:16位4個:BP(約定訪問堆棧段:SS)BX,SI,DI(約定訪問數(shù)據(jù)段:DS,ES,F(xiàn)S,GS)32位8個:EBP,ESP(約定訪問堆棧段:SS)EAX~EDX,ESI,EDI(約定數(shù)據(jù)段)例如:MOV BP,MESG;MESG單元的有效地址MOV CL,ES:[BP];從ES附加段MESG字節(jié)單元取數(shù)→CLMOV SI,20HMOV EBX,[SI];從數(shù)據(jù)段有效地址20H-23H單元取數(shù)→EBX

19(1)地址表達式:段寄存器:[基址寄存器+位移量]或段寄存器:位移量[基址寄存器]

如:DS:[BP+10]

或者DS:10[BP]

對于約定的邏輯段,其段超越前綴可省略。

(2)尋址——指令中基址寄存器內容與指令指定的位移量之和作為操作數(shù)所在單元的有效地址(3)80486哪些寄存器可作為基址寄存器:16位2個:BP(約定訪問堆棧段:SS)BX(約定訪問數(shù)據(jù)段:DS,ES,F(xiàn)S,GS)32位8個:EBP,ESP(約定訪問堆棧段:SS)EAX~EDX,ESI,EDI(約定數(shù)據(jù)段)3、基址尋址20例如:

MOV BP,BUF

;BUF單元的有效地址MOV DL,DS:[BP+10];從DS附加段BUF+10字節(jié)單元取數(shù);→DL。MOV DL,[BP+10];?MOV EAX,NUMMOV EDX,[EAX+10H];從數(shù)據(jù)段NUM+10H—NUM+13H單元;取數(shù)→EBX21有兩種格式:

(1)有比例因子的變址尋址:存儲單元的有效地址=比例因子*變址寄存器+位移量

指令格式:段寄存器:[比例因子*變址寄存器+位移量]或段寄存器:位移量[比例因子*變址寄存器]

比例因子——是1,2,4,8中的一個數(shù)

可作為變址寄存器的是:32位7個:EBP(約定訪問堆棧段)

EAX~EDX,ESI,EDI(約定訪問數(shù)據(jù)段)。

4、變址尋址

22(2)沒有比例因子的變址尋址:存儲單元的有效地址=變址寄存器+位移量

指令格式:段寄存器:[變址寄存器+位移量]

或段寄存器:位移量[變址寄存器]

可作為變址寄存器的是:2個16位:只能選擇SI,DI,約定訪問數(shù)據(jù)段。

例如:

MOVAL,[2*EBX+10];從數(shù)據(jù)段有效地址為2*EBX+10單元取數(shù)—>ALMOVAH,[SI+5];從數(shù)據(jù)段有效地址為SI+5單元取數(shù)→AL23有兩種格式:(1)有比例因子的基址加變址尋址:

有效地址EA=基址寄存器+比例因子*變址寄存器+位移量指令格式:段寄存器:[基址寄存器+比例因子*變址寄存器+位移量]

或段寄存器:位移量[基址寄存器+比例因子*變址寄存器]

或段寄存器:位移量[基址寄存器][比例因子*變址寄存器]基址、變址寄存器必須是32位的。訪問約定的邏輯段,段超越前綴可省略。例:MOVAX,[EBX+8*EDX+5]5、基址加變址尋址

24(2)沒有比例因子的基址家變址尋址:

存儲單元的有效地址=基址寄存器+變址寄存器+位移量

指令格式:

段寄存器:[基址寄存器+變址寄存器+位移量]

或段寄存器:位移量[基址寄存器+變址寄存器]

或段寄存器:位移量[基址寄存器][變址寄存器]

基址、變址寄存器必須是規(guī)定的16位寄存器。訪問約定的邏輯段,段超越前綴可省略。

25例:DATA1DB10HDUP(?);定義16個字節(jié)的緩沖區(qū)

DATA2DB11H,22H,33H,44H,55H,66H,77H······MOVBX,OFFSETDATA1;設BX=0100HMOVDI,11HMOVAX,[BX+DI+4];EA=0100H+011H+4

;EA=0115H,AX=7766H0100H……0110H……0114H0115H0116H0117H……11H……55F66H77H……77H66HAXBX存儲器26注意:

在間址、基址、變址、基址加變址這4種尋址方式中,可使用16位,也可使用32位寄存器尋址。

實模式時,段的最大長度為64K,所以必須保證CPU最終算出的有效地址不超過FFFFH,而且操作數(shù)最高字節(jié)單元的有效地址也不能超過FFFFH,否則執(zhí)行尋址時系統(tǒng)將要癱瘓。例如:P。3727(1)存儲器尋址時規(guī)定使用的寄存器和約定訪問的邏輯段。

4.2.480486尋址方式的段約定和段超越

28(2)如果要訪問約定訪問之外的邏輯段,必須明確指出相關邏輯段的段超越前綴。例:

MOVAL,[BP];用BP間址,訪問堆棧段

MOVAL,DS:[BP];用BP間址,訪問數(shù)據(jù)段

MOVAL,F(xiàn)S:[BP];用BP間址,訪問FS附加段MOVAL,[BX];用BX間址,訪問數(shù)據(jù)段

MOVAL,CS:[BX];用BX間址,訪問代碼段

MOVAL,ES:[SI+5];用SI變址,訪問ES附加段MOVAL,GS:[EAX+10];用EAX基址尋址,訪問GS附加段

(3)使用變量名直接尋址訪問存儲器,不需要另加段超越前綴。MOVCX,BUF29作業(yè)2:1.

設DS=2000H,SS=3000H,BP=0200H,SI=4000H,BUF=1000H,EAX=00001000H,EBX=00002000H,假設按16位實模式操作,確定下列每條指令訪問內存的物理地址,并且指出源操作數(shù)及目的操作數(shù)的尋址方法。(1)MOV AL,[1234H] (2)MOV EDX,[BX](3)MOV CL,[BX+100H](4)MOV [SI],EBX(5)MOV AH,BUF[BX+SI](6)MOV EAX,[BP+1234H](7)MOV [EAX+EBX],DH2.

寫出把首地址為BUF的字節(jié)緩沖區(qū)中第5個字節(jié)數(shù)送AL寄存器的指令,要求使用以下幾種尋址方式:(1)寄存器間接尋址(2)寄存器變址尋址(3)基址變址尋址。30標志寄存器(EFLAGS)是一個32位的寄存器,含有三類標志:狀態(tài)標志、控制標志、系統(tǒng)標志。如圖:4.380486的標志寄存器EFLAGS/FLAGS

CPAZSTIDOIOPLNTRFVMACVIFVIPID22123456789101112131415161718192021318086/808880386/80486DXPentium031(D0)C標志——進位/借位標志,主要用于多字節(jié)的加、減運算,當最高位有產生進位/借位,則C標志置1,否則為0。。移位和循環(huán)移位也影響C標志。(D2)

P標志——奇偶標志,P標為1,表示操作結果有偶數(shù)個“1”;P標為0,表示操作結果有奇數(shù)個“1”。用于檢查數(shù)據(jù)在傳輸過程是否出錯。(D4)

A標志——輔助進位/借位標志。主要用于BCD碼的運算。置為1,表示: 字節(jié)加/減時,最低4位向高位產生了進位或借位。 字加/減時,最低8位向高位產生了進位或借位。雙字加/減時,最低16位向高位產生了進位或借位。(D6)Z標志——全零標志。置為1,表示操作結果為0。

32(D7)

S標志——符號標志。置為1,表示結果數(shù)據(jù)的最高位為“1”。(D11)O標志——溢出標志。置為1,表示運算結果產生溢出。CPU硬性規(guī)定:參與運算的操作數(shù)都是有符號數(shù),所以,當兩數(shù)的符號相同而且與結果的符號位相異時,O標置1。

程序設計時:如果定義操作數(shù)是有符號數(shù),測試O標志,為1表示溢出;如果定義操作數(shù)是無符號數(shù),測試C標志,為1,表示溢出。

(D10)D標志——方向標志。用于控制字符串操作指令中地址變化的方向。

執(zhí)行指令STD,D標志置1,串指針(SI/DI)自動減量,即減址調整。執(zhí)行指令

CLD,D標志置0,串指針(SI/DI)自動增量,即增址調整。

33(D9)I標志——中斷允許標志。控制CPU是否響應外部可屏蔽中斷(INTR)請求。

執(zhí)行STI指令,I標志置為1,CPU響應可外部屏蔽中斷INTR。

執(zhí)行CLI指令,I標志置為0,CPU不響應外部可屏蔽中斷。

I標志不影響外部非屏蔽中斷(NMI)或內部中斷。

(D8)T標志——陷阱標志。用于單步調試程序。

T標志為1時,CPU每執(zhí)行一條指令后都產生一個內部中斷,可利用調試軟件觀察該指令執(zhí)行的情況。

T標志為0時,CPU連續(xù)執(zhí)行指令。

34(D13-12)IOPL標志——I/O特權級標志,占2位,表示0級~3級4個I/O特權級,其中0級最高。用于保護模式下指明執(zhí)行I/O指令所需的優(yōu)先級。如果當前任務的特權級≥IOPL中規(guī)定的級別,則可以執(zhí)行該I/O指令,否則發(fā)生保護異常中斷,執(zhí)行程序被掛起。

(D14)

NT標志——任務嵌套標志。表示當前任務是否嵌套在另一個任務內,該標志控制中斷返回指令的執(zhí)行。如果當前任務A嵌套在另一任務B內,則NT=1,指示CPU,A任務執(zhí)行完畢后要返回到B任務中。

35(D16)RF標志——恢復標志,用于控制是否接受調試故障。當該位置0時,接受調試故障;當該位置1時,忽略調試故障,既使遇到中斷或調試故障,也不產生異常中斷,強迫程序恢復執(zhí)行,當指令執(zhí)行順利時,RF自動清0。(D17)VM標志——虛擬標志。CPU在保護模式下使VM=1,轉換為虛擬86操作模式。80486就象一個高速的8086CPU在運行8086的指令流。

36(D18)AC標志——對準標志。若AC=1,如果進行未對準的地址訪問,則產生異常中斷。

未對準的地址訪問指: 訪問字操作數(shù)時,從奇地址開始。

訪問雙字操作數(shù)時,地址不是4的整數(shù)倍。 訪問4字操作數(shù)時,地址不是8的整數(shù)倍。(D19)VIF

標志——虛擬中斷標志。為虛擬方式下中斷標志位的拷貝,用于多任務環(huán)境下,給操作系統(tǒng)提供中斷的信息。(D20)VIP標志——虛擬中斷暫掛標志。用于多任務環(huán)境下,給操作系統(tǒng)提供中斷暫掛信息。(D21)ID標志——指示Pentium微處理器支持CPUID指令,該CPUID指令給系統(tǒng)提供有關微處理器的各種信息,例如版本號和制造商等。

37為了支持80486的三種工作模式,指令系統(tǒng)設計了系統(tǒng)管理指令、保護模式控制指令以及高級語言支持指令等。80486基本的指令有:

4.4.1傳送類指令

4.4.2算術運算指令

4.4.3轉移和調用指令

4.4.4邏輯運算和移位指令

4.4.5串操作指令

4.4.6處理機控制指令

4.480486的基本指令集

384.4.1傳送類指令

特點:源操作數(shù)不變,不影響狀態(tài)標志。分類:通用轉送指令MOV堆棧操作指令PUSH/POP輸入/輸出指令IN/OUT(第7章介紹)。

391、通用傳送指令

(1)、數(shù)據(jù)傳送指令格式:

MOV DEST ,SRC功能:把SRC中的內容復制到DEST中去。DEST和SRC是字節(jié)、字或雙字。段寄存器通用寄存器存儲器立即數(shù)圖傳送指令數(shù)據(jù)流40例:寄存器之間的數(shù)據(jù)傳送MOV AL,DH ;AL←DH(8位)MOV DS,AX ;DS←AX(16位)MOV EAX,ESI ;EAX←ESI(32位)例:寄存器與存儲器之間的數(shù)據(jù)傳送MOV [BX],AX ;間接尋址MOV EAX,[EBX+ESI] ;基址變址尋址MOV AL,BLOCK ;BLOCK為變量名,直接尋址例:立即數(shù)送通用寄存器、存儲器MOV EAX,2345678H ;EAX←2345678H(32位)MOV byteptr[BX],12H ;間接尋址(8位)MOV AX,1234H ;AX←1234H(16位)411)、源和目的操作數(shù)不能同時為內存操作數(shù)

例:MOV [DI],[SI];是非法指令,同為內存操作數(shù)2)、立即數(shù)不能作為目的操作數(shù)

例:MOV 1234H,AX;是非法指令

3)、不能將立即數(shù)直接傳送到段寄存器

例:MOV DS,1000H;是非法指令

應借用一個16位的寄存器過度:

MOV AX,DATA;DATA為數(shù)據(jù)段名,編譯后即為DATA段的段基址。

MOV DS,AX使用時應注意以下幾點:

424)、源和目的操作數(shù)的數(shù)據(jù)位應等長,即同為字節(jié)、字或雙字。例:

MOV BL,AX;是非法指令

XYZ DB 12H;定義XYZ為字節(jié)變量

MOV AX,XYZ;AX是字操作數(shù),而XYZ是字節(jié)變量,錯

MOV [BX],12H;間接尋址,報警告錯誤應用PTR運算符說明目的操作數(shù)的屬性(可以是BYTE、WORD、DWORD)。改為:MOV WORDPTR[BX],12H;間接尋址(16位)正確5)、以CS為目標的一切轉送都是非法的。43(2)、符號擴展傳送指令

格式1:

MOVSX DEST ,SRC說明:目標操作數(shù)DEST是16位或32位的寄存器操作數(shù)。源操作數(shù)SRC是小于(或等于)目標字長的寄存器操作數(shù)或內存操作數(shù)。功能:將SRC的符號位向高位擴展使其與目標字長相同,然后再傳送到DEST,而SRC不變。例:MOV DL,-16;DL=F0H(補碼)

MOVSXBX,DL;BX=FFF0H,而DH,DL不變。格式2:CBW;AL中符號擴展到AH中格式3:CWD;AX中符號擴展為32位,分別送到DX和AX中。格式4:CWDE;AX中符號擴展為32位,送到EAX中。44(3)、零擴展傳送指令

格式:

MOVZX DEST ,SRC功能:與MOVSX類似,只是將源操作數(shù)SRC高位用0補足16或32位,然后再傳送到目標寄存器DEST例:MOV DL,-16;DL=F0H(補碼)

MOVZXBX,DL;BX=00F0H,而DH,DL不變。45(4)、有效地址傳送指令

格式:LEA

目標寄存器,內存操作數(shù)功能:將內存操作數(shù)的有效地址傳送到目標寄存器中,要求二者都是(16或32位)。例:LEA BX,BUF;將BUF單元的有效地址→BX

等價于:MOVBX,OFFSETBUF;編譯時完成有效地址的計算,執(zhí)行時完成賦值。例:LEAEAX,[SI+5];將變址尋址的那個單元的有效地址→EAX46LEA指令與MOV指令的區(qū)別:LEASI,BUFF指令是將標號BUFF的偏移地址送入寄存器中;MOVSI,BUFF指令是將標號BUFF所指存儲單元的內容送入SI。BUFF=0123454800FEFFLEASI,BUFF;執(zhí)行后:(SI)=0002HMOVSI,BUFF;執(zhí)行后:(SI)=0048H段起始地址47(5)、指針傳送指令

格式:LDS高16位低16位LES目標(16位)寄存器,32位內存操作數(shù)

LFSLGS

目標(32位)寄存器,

48位內存操作數(shù)

LSS高16位低32位例:設數(shù)據(jù)段:ADDR1 DF 1234567809ABHADDR2 DD 1A2B3C4DH代碼段:對DS初始化

LESEBX,ADDR1;ES=1234H,EBX=567809ABH

LDSSI,ADDR2;DS=1A2BH,SI=3C4DH48上例LDS指令將源操作數(shù)指定的4個連續(xù)字節(jié)單元內容分別送入指令指定的寄存器以及DS中。其中:低16位送到一個指定的字寄存器SI,高16位送到DS中。例:(DS)=C000H,(C2480H)=1357H,(C2482H)=2468HSIDS57H13H68H24HDS:2480HDS:2481HDS:2482HDS:2483H

1357

2468LDSSI,[2480]49格式及功能:LAHF;將標志寄存器的低8位傳送到AH寄存器中。SAHF;將AH的內容傳送到標志寄存器的底8位。(6)、標志寄存器傳送指令

(7)、交換指令格式:XCHG DEST,SRC功能:DEST與SRC中的內容交換說明:DEST與SRC是等長的操作數(shù),但不能同時為內存操作數(shù)。

50實例:將兩個存儲單元的內容互換

數(shù)據(jù)段:FIRST DB 35H SECOND DB 38H用XCHG指令實現(xiàn):

用MOV指令實現(xiàn):

MOV AL,F(xiàn)IRST MOV AL,F(xiàn)IRST MOV AH,SECONDXCHG AL,SECOND MOV FIRST,AHMOV FIRST,AL MOV SECOND,AL51(8)、字節(jié)交換指令

格式:

BSWAP 32位寄存器功能:將32位寄存器的第四字節(jié)(位32~位24)與第一字節(jié)(位7~位0)交換,第三字節(jié)(位23~位16)與第二字節(jié)(位15~位8)交換。例:MOV EAX,44332211HBSWAPEAX;EAX=11223344H

(9)、查表指令

格式:XLAT 表頭變量名功能:使AL中的值轉換為表中的一個值。在DS:BX(或DS:EBX)建立一個單字節(jié)的集合——字節(jié)表,用EBX(或BX)作為基址,AL作為表的無符號下標(既表指針),將AL指向的那個單元的內容傳送回AL。實例:查找與NUM單元的數(shù)相對應的字形編碼52實例:查找與NUM單元的數(shù)相對應的字形編碼

表4.3數(shù)碼管字形編碼表字形0123456789ABCDEF編碼H3F065B4F666D7D077F6F777C395E7971在數(shù)據(jù)段中定義:TAB DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 7FH,6FH,77H,7CH,39H,5EH,79H,71HNUM DB 2代碼段設置如下指令,即可查出字形為2的編碼:MOV DS,數(shù)據(jù)段的段基址MOV BX,OFFSETTABMOV AL,NUMXLAT TAB;AL=5BH532、堆棧操作指令堆棧——堆棧位于堆棧段,其段地址由SS指示,SP寄存器作為指針,SP內容始終指向棧頂所在存儲單元。棧底為堆??臻g的高地址單元,棧頂為低地址單元,且只有棧頂一個出口,即當前棧頂為空時,棧頂和棧底指向同一內存單元;用來暫存數(shù)據(jù)。見圖4.2

數(shù)據(jù)的存取規(guī)律——“先進后出”。數(shù)據(jù)進棧的規(guī)律——高位字節(jié)存入高地址,低位字節(jié)存入低地址。出棧規(guī)律——低位字節(jié)彈到目標操作數(shù)的低位,高位字節(jié)彈到目標操作數(shù)的高位。用SP或ESP存放棧頂?shù)挠行У刂?。?shù)據(jù)進棧后,ESP向低地址方向浮動;出棧后,ESP向高地址方向調整。54格式:PUSH

源操作數(shù) 其中源操作數(shù)可是立即數(shù)、通用寄存器和內存操作數(shù)功能:該指令使ESP中內容減2(16位操作數(shù))或減4(32位操作數(shù)),然后把操作數(shù)放到新棧頂。若源操作數(shù)是ESP或SP,則486CPU將調整前的ESP或SP壓棧。例:PUSH AX ;SP-2→SP,AX→SS:[SP]的2個單元。

PUSH DWORDPTR[SI+5]

;完成ESP-4→ESP,[SI+5]的1個雙字→SS:[ESP]的4個單元。(1)、PUSH進棧指令

55(2)、POP出棧指令格式:

POP 目標操作數(shù)其中源操作數(shù)是除CS以外的段寄存器、通用寄存器、內存操作數(shù)功能:從棧頂彈出2個或4個字節(jié),送目標操作數(shù),然后調整堆棧指針。例:POP AX ;SS:[SP]的2個單元→AX,SP+2→SP。

POP DWORDPTR[SI];SS:[ESP]的4個字節(jié)→[SI]的4個單元,ESP+4→ESP。

56PUSH/POP實例:設SS=0200H,SP=0212H,AX=1234H,CX=5678H執(zhí)行指令

PUSHAX PUSHCX POPBX;BX的值為5678H三條指令后堆??臻g的數(shù)據(jù)變化如圖4.2所示。

進棧:出棧:

格式:PUSHF;16位的

POPFPUSHFD;32位的

POPFD(3)、標志寄存器的進棧/出棧指令下一頁57返回1返回258(5)、通用寄存器的進棧/出棧指令進棧:出棧:

格式:PUSHA;16位的

POPAPUSHAD;32位的

POPAD功能:執(zhí)行PUSHA時,首先,SP-16→SP,依次把AX,CX,DX,BX,SP,BP,SI,DI的內容壓入堆棧,進棧的SP值是調整前的值。執(zhí)行POPA時,先從棧頂彈出16個字節(jié),并依次裝入DI,SI,BP,SP,BX,DX,CX和AX。執(zhí)行PUSHAD時,首先,ESI-32→ESP,依次把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI的內容壓入堆棧,進棧的ESP值是調整前的值。執(zhí)行POPAD時,先從棧頂彈出32個字節(jié),并依次裝入EDI,ESI,EBP,ESP,EBX,EDX,ECX和EAX。59作業(yè)2書P.694.14.2題

思考題:

試指出下列指令中的錯誤

(1)MOV [BX],[SI]

(2)MOV AH,DX

(3)INC [BX]

(4)MOV DS,SS

(5)XCHG AX,2000H

(6)MOV AX,[BX+DX]

(7)XCHG [BP],ES

(8)ADD [BX],BX

(9)MOV AX,DI+SI

604.4.2算術運算指令——執(zhí)行后要影響標志寄存器的狀態(tài)標志

1、基本四則運算

2、BCD碼調整指令

611、基本四則運算

(1)ADD二進制加法指令

ADDDEST,SRC;DEST+SRC——>DEST

(2)SUB二進制減法指令

SUBDEST,SRC;DEST-SRC——>DEST

(3)ADC帶進位加法ADCDEST,SRC;DEST+SRC+C標——>DEST(4)SBB帶進位減法

SBBDEST,SRC;DEST-SRC-C標——>DEST

62說明:

目標操作數(shù)DEST,為8,16或32位的寄存器、內存操作數(shù)

源操作數(shù)SRC要與DEST等長,可是立即數(shù)、寄存器或內存操作數(shù)。

DEST與SRC不能同為內存操作數(shù)。

若DEST、SRC都不能確定其操作數(shù)長度時,用PTR說明長度。

執(zhí)行后,影響A(輔助進/借位)、C(進/借位)、O(溢出)、P(奇偶性)、S(符號)、Z(全零)6個標志。

63例:MOV AX,9876H;AX=9876HADD AH,AL;AX=0E76H,CF=1,SF=0,OF=0,ZF=0,AF=0,PF=0

ADC AH,AL;AX=8576H,CF=0,SF=1,OF=1,ZF=0,AF=1,PF=0

見A.ASMMOV AX,9966H;AX=9966HSUB AL,80H;AL=E6H,CF=1,SF=1,OF=1,ZF=0,AF=0,PF=0

SBB AH,80H;AX=18H,CF=0,SF=0,OF=0,ZF=0,AF=0,PF=1

例:(書P.46)實現(xiàn)多字節(jié)二進制數(shù)的加法運算64(5)INC自加1指令INCDEST;DEST+1——>DEST

影響A,O,P,S,Z標志(6)DEC自減1指令DECDEST;DEST—1——>DEST

影響A,O,P,S,Z標志(7)NEG自求補指令NEGDEST;0—DEST——>DEST

影響A,C,O,P,S,Z標志65說明:

以上的目標操作數(shù)DEST,為8,16或32位的寄存器、內存操作數(shù)

用間址、基址、基址加變址的內存操作數(shù),必須用PTR說明其長度。

例:INC [BX];錯誤

INC BYTEPTR[BX];對DS:[BX]1個單元的內容加1。

如果原來的操作數(shù)為正數(shù),執(zhí)行NEG后,變成負數(shù)(用補碼表示)

如果原來的操作數(shù)為負數(shù)(用補碼表示),執(zhí)行NEG后,變成正數(shù)。

特例:DEST=80H,執(zhí)行NEG后,仍為80H,但O標=1。只有當DEST=0,執(zhí)行NEG后,C標=0,其他數(shù),C標總為1。66(8)XADD交換加法指令

XADD DEST,SRC先進行DEST與SRC的互換,然后DEST+SRC—>DEST。

(9)MUL無符號乘法指令

MUL SRC(reg,mem)功能:完成無符號數(shù)的乘法,被乘數(shù)是累加器(AL、AX或EAX),乘以SRC。

字節(jié)乘時,AL*SRC→AX

字乘時,AX*SRC→DX:AX

雙字乘時,EAX*SRC→EDX:EAX說明:如果乘積的高階字節(jié)(AH)、字(DX)、雙字(EDX)是0,則C標和O標置0,否則,置1。

67(10)IMUL有符號數(shù)的整數(shù)乘法

格式:

IMUL SRC(reg、mem)②IMUL DEST(reg),SRC(reg,mem,imm)③IMUL DEST(reg),SRC1(reg,mem),SRC2(imm)功能:完成有符號數(shù)的乘法操作

①與MUL指令相同②DEST*SRC→DEST寄存器中③SRC1*SRC2→DEST寄存器中說明:默認其乘數(shù)、被乘數(shù)均為有符號數(shù)的補碼

源、目操作數(shù)類型一致,乘積只取和目的操作數(shù)相同的位數(shù),高位被舍去,且CF=OF=1。

68例:

MOV BX,-6IMUL BX,5;BX=FFE2H=-30

MOV EAX,32IMULEBX,EAX,4;則EBX=00000080H,;EAX=00000020H69(11)DIV無符號除法格式:

DIV SRC(reg、mem)功能:完成無符號數(shù)的除法,被除數(shù)是累加器(AX、DX:AX或EDX:EAX),除數(shù)是SRC。要求被除數(shù)是除數(shù)的兩倍字長。根據(jù)除數(shù)SRC的字長,可執(zhí)行:

字節(jié)除法:AX/SRC商→AL,余數(shù)→AH;

字除法:DX:AX/SRC商→AX,余數(shù)→DX;

雙字除法:EDX:EAX/SRC商→EAX,余數(shù)→EDX;(12)IDIV有符號除法

格式:

IDIV SRC(reg、mem)說明:

功能與DIV相同,但除數(shù)、被除數(shù)和商值都采用補碼方式表示,余數(shù)與除數(shù)同符號。

當除數(shù)為0或商值超出范圍,則自動產生0型中斷。

70(13)符號擴展指令

格式1:CWB;將AL中的符號位擴展到AH中。

格式2:CWD;將AX中的符號位擴展到DX中。

格式3:CWDE;將AX中的符號位擴展到EAX的高16位。格式4:CDQ;將EAX中的符號位擴展到EDX中。

應用:如果被除數(shù)不是除數(shù)的雙倍字長,在進行除法運算時,須先進行符號擴展。例: MOV AX,BLOCK;BLOCK為變量

CWD;被除數(shù)高位擴展

MOV BX,1000HIDIV BX71(14)CMP比較指令格式:

CMP DEST,SRC功能:DEST減SRC,但結果不回送DESTCMP指令影響A,C,O,P,S,Z這6種標志。例:

CMP BYTEPTR[BX],‘A’CMP CX,3執(zhí)行CMPAX,BX指令對標志位的影響,見下表:72表執(zhí)行CMPAX,BX指令對標志位的影響數(shù)據(jù)類型關系CFZFSFOF判斷帶符號數(shù)AX=BX0100ZF=1OFSF=0AX<BX-010OFSF=1-001OFSF=1AX>BX-000OFSF=0-011OFSF=0無符號數(shù)AX=BX0100ZF=1AX<BX10--CF=1AX>BX00--CF=0

ZF=0732、BCD碼調整指令目的:當使用二進制運算指令對十進制數(shù)運算時,對其二進制結果進行調整,將結果調整成BCD碼表示形式。74(1)DAA組合十進制數(shù)加法調整指令

格式:

DAA功能:將存放在AL中的二進制和數(shù),調整為組合十進制數(shù)調整方法:

若AL中低4位大于9或AF=1,則AL+06H→AL,1→AF,否則不調整。

若AL中高4位大于9或CF=1,則AL+60H→AL,1→CF,否則不調整

DAA一般緊跟在ADD或ADC之后,影響標志S,Z,A,P,C。

例:

ADD AL,BUF;AL與BUF存放的數(shù)都是組合BCD碼數(shù)。

DAA自己看例4.4.1

(書P.51)

75例:進行BCD碼加法運算59+68=1270101100159+011010006811000001C1+0110011066100100111127加法運算結果為C1,AF=1,高位大于9加66H進行壓縮BCD調整76(2)DAS組合十進制數(shù)減法調整指令

格式:

DAS功能:將存放在AL中的二進制差值,調整為組合十進制數(shù)調整方法:

若AL中低4位大于9或AF=1,則AL﹣06H→AL,1→AF,否則不調整。

若AL中高4位大于9或CF=1,則AL-60H→AL,1→CF,否則不調整

DAS一般緊跟在SUB或SBB之后,影響標志S,Z,A,P,C

若被減數(shù)小于減數(shù),結果應為負數(shù),但BCD碼數(shù)無法表示負數(shù),用DAS調整后,CF=1,AL寄存器中得到的差值是相對于模100的“補碼”。

77(3)AAA未組合十進制數(shù)加法調整指令

格式:

AAA功能:將存放在AL中的二個未組合十進制數(shù)之和進行調整,從而在AH中得到十位的BCD碼,AL中得到個位BCD碼。

調整方法:

若AL中低4位大于9或AF=1,則AH+1→AH;AL+06H→AL,高4位清0;1→AF→CF。

執(zhí)行AAA之前,應使AH=0。

AAA一般緊跟在ADD或ADC之后,影響標志A,C。

78(4)AAS未組合十進制數(shù)減法調整指令

格式:

AAS功能:將存放在AL中的二個未組合十進制數(shù)之差值進行調整.調整方法:

當被減數(shù)小于減數(shù)時,AAS執(zhí)行后CF=1,AH內容減1,AL中的差值是相對與模10的“補碼”。當被減數(shù)大于減數(shù)時,AAS執(zhí)行后CF=0,AH內容不變,對AL中的差值不做修正。

例如:

MOV AX,0004HSUB AL,05H;04H-05H→AL

AAS

;CF=1,AH=FFH,AL=09H79(5)AAM未組合十進制數(shù)乘法調整指令

·格式:

AAM功能:將存放在AX中的二個未組合十進制數(shù)之積進行調整

調整方法:

用MUL實現(xiàn)兩個未組合十進制數(shù)相乘,其乘積在AX中,最大值為81,用二進制數(shù)表示。

AL/10商—>AH,余數(shù)—>AL。調整結果:AH中為乘積的十位數(shù),AL中為乘積的個位數(shù),為高4位恒為0的未組合十進制數(shù)。應用:只要AX中的值≤81,任何時候都可以使用AAM調整為未組合十進制數(shù)。例:

MOV AL,07H

MOV BL,09H

MUL BL;按二進制相乘,積AX=003FHAAM;調整后AX=0603H80(6)AAD未組合十進制數(shù)除之前調整指令格式:

AAD功能:將AX中的兩個未組合的十進制數(shù)(AH為十位數(shù),AL為個位數(shù))轉換成等值的二進制數(shù)。

調整方法:

AH*10+AL→AL,0→AH。應用:

用于二進制除法DIV操作之前,或任何時候需將兩個未組合的十進制數(shù)調整為二進制數(shù)時。影響標志S,Z,P。

例4.4.2編程實現(xiàn)十進制的除法86÷3=28……2

MOVBL,03HMOVAX,0806HAAD;將AX中86轉換成二進制數(shù),則AL=0056HDIVBL;AL為二進制商11100(1CH),AH為余數(shù)(02)。

PUSHAXAAM;將AL中的二進制商轉換為AX=0208H

見F442.ASM814.4.3轉移和調用指令

用于控制指令流程的指令有:轉移、循環(huán)、過程調用和中斷調用。按轉移條件分:無條件轉移和有條件轉移按轉移的范圍分:段內轉移——是指在同一段的范圍之內進行轉移,此時只需改變IP寄存器的內容,即用新的轉移目標地址代替原有的IP的值就可達到轉移的目的。段間轉移——是要轉到另一個段去執(zhí)行程序,此時不僅要修改IP寄存器的內容,還需要修改CS寄存器的內容才能達到目的,因此此時的轉移目標地址應由新的段地址和偏移地址兩部分組成。按獲取地址的方法分:直接轉移和間接轉移821.無條件轉移指令功能:無條件轉移到指定的目的地址去執(zhí)行指令。

格式1:段內直接轉移

JMP 標號

JMP SHORT標號說明:

SHORT運算符指明偏移量為8位,允許轉移值的范圍為-128~+127,為短距離轉移(稱短轉移)。不含SHORT的指令,其轉移范圍可覆蓋整個邏輯段。例:

JMP NEXTNEXT: MOV AL,BL83格式2:段內間接轉移

JMP 寄存器操作數(shù)

JMP 內存操作數(shù)說明:寄存器、內存單元存放的是有效地址

執(zhí)行時,本指令將有效地址寫入IP或EIP,實現(xiàn)段內間接轉移。

例:設數(shù)據(jù)段:POINTERDWP11,P12;匯編后P11的16位偏移地址→POINTER字單元代碼段:對DS初始化

MOV BX,OFFSETPOINTER JMP [BX] ;DS:[BX]→IP,轉移到P11程序段 ……

MOV SI,POINTER+2 JMP SI ;SI→IP,轉移到P11程序段P11: ……P12: …… 84格式3.1:段間直接轉移

JMP 標號對標號的要求:在本模塊中用EXTRN說明為“外部變量名”

在轉移模塊中用PUBLIC說明為“公共變量”

格式3.2:段間間接轉移

JMP 內存操作數(shù)段間轉移指令說明:在模塊設計時,從一個模塊轉移到另一個模塊,用段間轉移指令。

在實模式下,段間間接轉移指令將段地址和偏移地址送給CS和IP。例:數(shù)據(jù)段:

ADDRDD12345678H;32位轉移地址

代碼段:對DS初始化

JMP ADDR;1234H—>CS,5678H—>IP實現(xiàn)段間轉移852.條件轉移指令功能:根據(jù)上一條指令對標志寄存器中標志的影響來決定程序執(zhí)行的流程,若滿足指令規(guī)定的條件,則程序轉移執(zhí)行指定標號處的指令

;否則,程序順序執(zhí)行后續(xù)指令。條件轉移指令的轉移范圍:僅限于段內轉移格式:操作碼助記符,轉移地址標號說明:各種轉移條件隱藏在操作碼助記符當中。條件轉移指令包括四類: 單標志位條件轉移指令 無符號數(shù)比較條件轉移 帶符號數(shù)比較條件轉移 測試CX條件轉移86(1)單標志位條件轉移指令助記符判斷條件說明助記符判斷條件說明JOOF=1溢出轉移JNZ∕JNEZF=0非零/不等于轉移JNOOF=0無溢出轉移JP∕JPEPF=1奇偶為偶轉移JSSF=1負數(shù)轉移JNP∕JPOPF=0奇偶為奇轉移JNSSF=0正數(shù)轉移JCCF=1進位轉移JZ/JEZF=1零/等于轉移JNCCF=0無進位轉移例: SUB AL,BL JZNEXT;若標志ZF=1則轉移到標號NEXT處執(zhí)行87(2)無符號數(shù)比較條件轉移例: CMP AX,BX JA NEXT;無符號數(shù)AX與BX比較,若AX>BX則轉移到標號NEXT處執(zhí)行程序。助記符判斷條件說明(A-B)JA∕JNBECF=0∧ZF=0高于∕不低于且不等于(A>B)轉移JAE∕JNBCF=0∨ZF=1高于等于∕不低于(A≥B)轉移JB∕JNAECF=1∧ZF=0低于∕不高于且不等于(A<B)轉移JBE∕JNACF=1∨ZF=1低于等于∕不高于(A≤B)轉移88(3)帶符號數(shù)比較條件轉移例:助記符判斷條件說明(A-B)JG∕JNLESFOF=0∧ZF=0大于∕不小于且不等于(A>B)轉移JGE∕JNLSFOF=0∨ZF=1大于等于∕不小于(A≥B)轉移JL∕JNGESFOF=1∧ZF=0小于∕不大于且不等于(A<B)轉移JLE∕JNGSFOF=1∨ZF=1小于等于∕不大于(A≤B)轉移例: CMP AX,BX JG NEXT;帶符號數(shù)AX與BX比較,若AX>BX則轉移到標號NEXT處執(zhí)行程序。89(4)測試CX條件轉移助記符判斷條件說明(A-B)JCXZCX=0CX=0轉移,轉移范圍-128~+127JECXZECX=0ECX=0轉移,轉移范圍-128~+127例: JCXZ NEXT;CX=0則轉移到標號NEXT處執(zhí)行程序。條件轉移指令一般緊跟在CMP或TEST指令之后,判斷執(zhí)行CMP或TEST指令對標志位的影響來決定是否轉移。90實例:求符號函數(shù)1, x>0f(x)=0, x=0 -1,x<0假設X為某值且存放在寄存器AL中,求出函數(shù)值f(x)存放在AH中。

CMP AL,0 JGE BIG ;AL≥0,轉移到BIG處;

MOV AL,0FFH;否則,AL=-1

JMP DOWN ;無條件轉移BIG: JE DOWN ;AL=0轉移到DOWN處

MOV AL,1;否則,AL=1

DOWN:MOV AH,AL見F443.ASM

91(5)循環(huán)控制轉移功能:用(E)CX計數(shù)器中的內容控制循環(huán)次數(shù),先將循環(huán)計數(shù)值存放在(E)CX中,每循環(huán)一次(E)CX內容減1,直到(E)CX為0時循環(huán)結束。指令格式:LOOP標號;(E)CX-1→(E)CX,若CX≠0,轉

LOOPZ標號;(E)CX-1→(E)CX,若CX≠0,且Z標=1,轉LOOPNZ標號;(E)CX-1→(E)CX,若CX≠0,且Z標=0,轉92實例:找出以ARRAY為首地址的10個字數(shù)組中的第一個非0項,送AX中.數(shù)據(jù)段ARRAY DW0,0,0,5,6,7,8,3,4,9;(10個數(shù))代碼段對DS初始化

MOV CX,0AH LEA BX,ARRAY MOV SI,0FFFEH;-2,從第一個數(shù)據(jù)開始。

ZERO:INC SI INC SI CMP WORDPTR[BX+SI],0 LOOPZ ZERO;CX-1→CX,判斷CX≠0,且Z標=1,轉

MOV AX,[BX+SI]演示程序F4LOOP.ASM933、子程序調用與返回子程序——相對獨立的一段程序主程序或調用程序——調用子程序的程序子程序的特點:

允許有多個入口和多個出口子程序執(zhí)行完畢必須返回調用程序的斷點,以執(zhí)行調用指令的后繼指令。子程序的屬性:如果子程序和調用它的主程序同屬于一個代碼段,它具有NEAR(近)屬性;否則,子程序應設置為FAR(遠)屬性。子程序調用分為:段內直接調用、段內間接調用,段間直接調用、段間間接調用。子程序的返回指令: 帶參數(shù)和不帶參數(shù)的返回指令。94(1)段內直接調用

格式:CALL 過程名過程名編譯后即為子程序的入口地址

(2)段內間接調用

格式:CALL 寄存器或內存操作數(shù)執(zhí)行過程:當CUP執(zhí)行段內調用指令時,首先把斷口地址的有效地址壓棧,為子程序返回作準備,然后把子程序的入口地址→IP,從而轉入子程序。

斷口地址——CALL指令的后繼指令地址。95(3)段間直接調用

格式:CALL FARPTR遠過程名說明:此過程用FAR屬性定義在另一代碼段中(4)段間間接調用格式:CALL

內存操作數(shù)執(zhí)行過程:當CUP執(zhí)行段間調用指令時,將當前的CS和EIP(IP)壓棧,將目標的段基址和偏移量送給CS和EIP。實例:見書P。57

(程序F4CALL.ASM)

96(5)無參數(shù)的返回格式:RET

功能:子程序的出口,將堆棧中的斷口地址彈出。若是段內返回,則只彈出偏移地址至EIP(IP),若是段間返回,則需彈出段基址至CS和EIP(IP)。(6)有參數(shù)返回指令

格式:RET N(N為偶數(shù))功能:首先完成RET指令的操作,然后再執(zhí)行SP+N→SP。注意:在執(zhí)行RET以前,棧頂元素必須是調用程序的斷口地址。

974.中斷調用及返回

(1)中斷調用指令(又稱為軟件中斷指令)

格式

INTn(n=1~255稱為中斷類型碼)

執(zhí)行時,首先將標志寄存器的內容以及INTn指令的斷口地址(其段地址CS和斷口的有效地址IP)6元素入棧,然后轉入系統(tǒng)N型中斷服務程序。

(2)中斷返回指令

格式

IRET執(zhí)行時,依次從棧頂彈出6個元素→IP,CS,F(xiàn)LAGS,返回調用程序斷點。

984.4.4邏輯運算和移位指令

1、邏輯運算指令2、移位指令3、測試與位測試指令991、邏輯運算指令——對字節(jié)或字數(shù)據(jù)進行按位的操作。

(1)取反指令

格式:NOT目標操作數(shù)功能:按位求反,結果放—>目標操作數(shù),不影響標志位。(2)與指令

格式:AND目標,源操作數(shù)功能:源、目操作數(shù)按位相“與”,結果放—>目標操作數(shù)(3)或指令

格式:OR目標,源操作數(shù)功能:源、目操作數(shù)按位相“或”,結果放—>目標操作數(shù)(4)異或指令

格式:XOR目標,源操作數(shù)功能:源、目操作數(shù)按位“異或”,結果放—>目標操作數(shù)

以上三種操作影響標志P,S,Z,A標未定義,CF=0,OF=0。100說明:(1)NOT指令改變寄存器或存儲單元的每一位狀態(tài),原來位0變?yōu)?,原位1變?yōu)?。【例】

MOV AX,878AH ;AX=878AHNOT AX, ;AX=7875H(2)AND指令主要用來屏蔽掉一個數(shù)中某些位,以便對剩下的其它位進行某些處理。邏輯乘的運算法則為:1∧1=1,1∧0=0,0∧1=0,0∧0=0【例】將AL中第3位和第7位清零。

MOV AL,0FFH;AL=11111111B

AND AL,77H ;AL=01110111B101說明:(3)OR指令用于對寄存器或存儲單元中某一位置1或置0。邏輯加的運算法則為:1∨1=1,1∨0=1,0∨1=1,0∨0=0。【例】

ORBX,0C000B將BX的兩位最高的有效位(15和14位)置成1,而其它位不變?!纠繉L寄存器中第3位和第7位置1。MOV AL,0OR AL,88H ;AL=10001000B102說明:(4)XOR指令主要用于判斷兩個操作數(shù)中那些位是不同的。如兩個操作數(shù)相對應位的值不同時,在目的操作數(shù)產生一個1。相同為0,不同為1。邏輯異或的運算法則為:1⊕1=0,1⊕0=1,0⊕1=1,0⊕0=0?!纠堪次患舆\算。MOV AL,88H ;AL=10001000BMOV BL,87H ;BL=10000111BXOR AL,BL ;AL=00001111B=0FH1032、移位指令(1)開環(huán)移位算術左移:SAL操作數(shù),CL/立即數(shù)邏輯左移:SHL操作數(shù),CL/立即數(shù)功能:將(OPR)向左移動CL指定的次數(shù),最低位補入相應的0,CF的內容為最后移入位的值。算術右移:SAR操作數(shù),CL/立即數(shù)功能:將(OPR)向右移動CL指定的次數(shù)且最高位保持不變;CF的內容為最后移入位的值。邏輯右移:SHR操作數(shù),CL/立即數(shù)

功能:將(OPR)向右移動CL規(guī)定的次數(shù),最高位補入相應個數(shù)的0,CF的內容為最后移入位的值。

0CFOPR0CFOPRCFOPR其中:OPR為操作數(shù)104【例】算術右移運算。

MOV BH,08H ;BH=08H=00001000BMOV CL,2 ;CL=2SAR BH,CL ;BH=02H=00000010B,CF=0該例語句“SARBH,CL”實際上完成了BH/4→BH的運算,所以,用SAR指令可以實現(xiàn)對有符號數(shù)除2n的運算(n為移位次數(shù))【例】將兩個非壓縮BCD碼(高位在BL,低位在AL)合并成壓縮BCD碼送AL。MOV CL,4;將計數(shù)值送CLSHL BL,CL;將BL的低4位移到高4位

AND AL,0FH;清零AL高4位

OR AL,BL;合并AL和BL形成壓縮BCD碼。105(2)閉環(huán)移位(循環(huán)移位)含進位的循環(huán)左移:格式:RCL操作數(shù),CL/立即數(shù)功能:將目的操作數(shù)連同CF標志一起向左循環(huán)移動CL規(guī)定的次數(shù)。含進位的循環(huán)右移:格式:RCR 操作數(shù),CL/立即數(shù)功能:將目的操作數(shù)連同CF標志一起向右循環(huán)移動所規(guī)定的次數(shù)。

CFOPRCFOPR106不含進位的循環(huán)左移:格式:ROL 操作數(shù),CL/立即數(shù)功能:將目的操作數(shù)的最高位與最低位連成一個環(huán),將環(huán)中的所有位一起向左移動CL規(guī)定的次數(shù)。CF的內容為最后移入位的值。不含進位的循環(huán)右移:格式:ROR 操作數(shù),CL/立即數(shù)功能:將目的操作數(shù)的最高位與最低位連成一個環(huán),將環(huán)中的所有位一起向右移動CL規(guī)定的次數(shù),CF的內容為最后移入位的值。CFOPRCFOPR107【例】設AL=10110100B,CF=1執(zhí)行下列語句:執(zhí)行ROLAL,1后,AL=01101001,CF=1執(zhí)行RORAL,1后,AL=01011010,CF=0執(zhí)行RCLAL,1后,AL=01101001,CF=1執(zhí)行RCRAL,1后,AL=11011010,CF=0【例】

ROL EAX,16;實現(xiàn)高低16位的互換。

108實例:將一個2位數(shù)壓縮的BCD碼轉換成二進制數(shù)。設數(shù)據(jù)段

BCD DB01011001B;BCD碼為59

BIN

溫馨提示

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

評論

0/150

提交評論