匯編語(yǔ)言程序設(shè)計(jì):第二章 匯編語(yǔ)言指令系統(tǒng)和尋址方式2_第1頁(yè)
匯編語(yǔ)言程序設(shè)計(jì):第二章 匯編語(yǔ)言指令系統(tǒng)和尋址方式2_第2頁(yè)
匯編語(yǔ)言程序設(shè)計(jì):第二章 匯編語(yǔ)言指令系統(tǒng)和尋址方式2_第3頁(yè)
匯編語(yǔ)言程序設(shè)計(jì):第二章 匯編語(yǔ)言指令系統(tǒng)和尋址方式2_第4頁(yè)
匯編語(yǔ)言程序設(shè)計(jì):第二章 匯編語(yǔ)言指令系統(tǒng)和尋址方式2_第5頁(yè)
已閱讀5頁(yè),還剩77頁(yè)未讀 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

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

文檔簡(jiǎn)介

1、第二章 匯編語(yǔ)言指令系統(tǒng)和尋址方式2.2 指令系統(tǒng) 2.2.1 數(shù)據(jù)傳送指令 2.2.2 算術(shù)運(yùn)算指令 2.2.3 邏輯運(yùn)算指令 2.2.4 字符串指令 2.2.5 程序轉(zhuǎn)移指令 2.2.6 處理器控制指令2.2 指令系統(tǒng) 指令系統(tǒng)是CPU指令的集合,CPU除了具有計(jì)算功能的指令外,還有一些實(shí)現(xiàn)其它功能的指令,也有為某種特殊的應(yīng)用而增設(shè)的指令。 在學(xué)習(xí)匯編指令時(shí),指令的功能無(wú)疑是我們學(xué)習(xí)和掌握的重點(diǎn),但要準(zhǔn)確、有效地運(yùn)用這些指令,我們還要熟悉系統(tǒng)對(duì)每條指令的一些規(guī)定或約束。 歸納起來(lái),對(duì)指令還要掌握以下幾個(gè)方面內(nèi)容:要清楚指令操作數(shù)的尋址方式,不同尋址方式,執(zhí)行時(shí)間大不相同;指令對(duì)標(biāo)志位的影響

2、、標(biāo)志位對(duì)指令的影響指令的執(zhí)行時(shí)間,對(duì)可完成相同功能的指令要選用執(zhí)行時(shí)間短的指令指令的執(zhí)行時(shí)間指令的基本執(zhí)行時(shí)間舉例加法指令執(zhí)行時(shí)間計(jì)算有效地址EA所需時(shí)間2.2.1數(shù)據(jù)傳送指令(14條)1.通用數(shù)據(jù)傳送指令 MOV (MOVe byte or word)傳送字節(jié)或字。 POP (POP word off stack)字退棧。 PUSH(PUSH Word into stack)字進(jìn)棧。 XCHG (Exchange byte or word)字節(jié)或字交換。 XLAT(Translate byte)字節(jié)換碼2.輸入輸出指令 IN(INput byte or word)輸入字節(jié)或字。 OUT(O

3、UTput byte or word)輸出字節(jié)或字。 3.標(biāo)志寄存器傳送指令 LAHF(Load AH register from Flags)取標(biāo)志到AH。 SAHF(Store AH register in Flags)取AH到標(biāo)志。 PUSHF(PUSH Flags into stack)標(biāo)志進(jìn)棧。 POPF(POP Flags off stack)標(biāo)志退棧。4.地址傳送指令 LEA(Load Effective Address)取有效地址。 LDS(Load pointer using DS)取指示器到DS。 LES(Load pointer using ES)取指示器到ES。除指令S

4、AHF和POPF指令外,本類的其它指令都不影響標(biāo)志位。1 通用數(shù)據(jù)傳送指令(1)傳送指令 MOV(Move Instruction) 傳送指令是使用最頻繁的指令,它相當(dāng)于高級(jí)語(yǔ)言中的賦值語(yǔ)句。格式:MOV Reg/Mem, Reg/Mem/Imm功能:把源操作數(shù)(第二操作數(shù))的值傳給目的操作數(shù)(第一操作數(shù))。指令執(zhí)行后,目的操作數(shù)的值被改變,而源操作數(shù)的值不變。說(shuō)明:源操作數(shù)可以是立即數(shù)、通用寄存器、存儲(chǔ)器以及段寄存器;目的操作數(shù)可以是通用寄存器、存儲(chǔ)器和除CS外的段寄存器,目的操作數(shù)不能是立即數(shù)。當(dāng)存儲(chǔ)單元是該指令的一個(gè)操作數(shù)時(shí),該操作數(shù)的尋址方式可以是任意一種存儲(chǔ)單元尋址方式。注釋:Reg

5、Register(寄存器),MemMemory(存儲(chǔ)器),ImmImmediate(立即數(shù)),它們可以是8位、16位或32位(特別指出其位數(shù)的除外)。通用數(shù)據(jù)傳送指令MOV對(duì)MOV指令有以下幾條具體規(guī)定,其中有些規(guī)定對(duì)其它指令也同樣有效。兩個(gè)操作數(shù)的數(shù)據(jù)類型要相同,要同為8位、16位或32位;如:MOV BL, AX等是不正確的;兩個(gè)操作數(shù)不能同時(shí)為段寄存器,如:MOV ES, DS等;代碼段寄存器CS不能為目的操作數(shù),但可作為源操作數(shù),如:指令MOV CS, AX等不正確,但指令MOV AX, CS等是正確的;立即數(shù)不能直接傳給段寄存器,如:MOV DS, 100H等;立即數(shù)不能作為目的操作

6、數(shù),如:MOV 100H, AX等;指令指針I(yè)P,不能作為MOV指令的操作數(shù);兩個(gè)操作數(shù)不能同時(shí)為存儲(chǔ)單元,如:MOV VARA, VARB等,其中VARA和VARB是同數(shù)據(jù)類型的內(nèi)存變量。對(duì)于規(guī)定2、4和7,我們可以用通用寄存器作為中轉(zhuǎn)來(lái)達(dá)到最終目的。通用數(shù)據(jù)傳送指令MOV數(shù)據(jù)傳送方向搭配圖通用數(shù)據(jù)傳送指令MOV舉例:(1) 寄存器與寄存器之間的數(shù)據(jù)傳送例如:MOV AX, BX;(BX)AXMOV DL, AH;(AH)DLMOV DX, ES;(ES)DXMOV DS, AX;(AX)DSMOV AX, CS;(CS)AX 注意:源操作數(shù)和目的操作數(shù)的數(shù)據(jù)類型必須一致,可以同時(shí)是字節(jié)寄存

7、器或字寄存器,不能同時(shí)為段寄存器;代碼段寄存器CS不能為目的操作數(shù);指令指針I(yè)P不能作為操作數(shù)。MOV指令不影響狀態(tài)標(biāo)志通用數(shù)據(jù)傳送指令MOV舉例:(2) 立即數(shù)傳送到通用寄存器立即數(shù)傳送到通用寄存器是指立即數(shù)傳送給AX,BX,CX,DX,BP,SP,SI,DI以及AH,AL,BH,BL,CH,CL,DH,DL寄存器,但不能傳送到段寄存器。例如:MOV AX,100Q;100QAXMOV BX,0FFFFH;0FFFFHBXMOV AL,-2;0FFFEHALMOV CH,100B;100BCHMOV DL, A;65DLMOV SI, OFFSET TABLE;OFFSET TABLESI注

8、意:立即數(shù)與寄存器數(shù)據(jù)類型必須一致,立即數(shù)可以是二進(jìn)制、八進(jìn)制、十進(jìn)制、十六進(jìn)制的常數(shù),可以是帶符號(hào)或無(wú)符號(hào)的整數(shù),也可以是ASCII字符。通用數(shù)據(jù)傳送指令MOV舉例:(3) 寄存器與存儲(chǔ)器之間的數(shù)據(jù)傳送寄存器與存儲(chǔ)器之間的數(shù)據(jù)傳送是指除了CS和IP以外的所有寄存器與內(nèi)存儲(chǔ)器之間的數(shù)據(jù)傳送。例如:MOV AL,BUFFER;(BUFFER)ALMOV AX,SI ;(DS)10H+(SI)AXMOV DI,DX ;(DX)(DS)10H+(DI)MOV BX+DI,DL ;(DL)(DS)10H+(BX)+(DI)MOV SI,ES:BP ;(ES)10H+(BP)SIMOV AX,ABXSI

9、 ;(DS)10H+(BX)(SI)+A位移)AX(4) 立即數(shù)傳送到存儲(chǔ)器立即數(shù)的數(shù)據(jù)類型與存儲(chǔ)器變量的類型一致。例如:MOV A,3 ; 3同A的類型一致MOV BYTE PTR SI,3 ; 3為一個(gè)字節(jié)MOV WORD PTR BX,3 ; 3為一個(gè)字MOV B1BXDI1,30H ; 30H同B1變量的類型一致存儲(chǔ)器操作數(shù)可以采用各種存儲(chǔ)器尋址方式。 (2)堆棧指令POP/PUSH堆棧的概念堆棧也稱作棧(Stack),是一種具有后進(jìn)先出訪問(wèn)方式的存儲(chǔ)空間;堆棧是先進(jìn)后出(Last In First Out)的線性表,簡(jiǎn)稱LIFO表,堆棧允許插入和刪除的一端稱作棧頂,另外一端稱作棧底。

10、堆棧就是限制在頂端進(jìn)行插入和刪除的線性表。見(jiàn)示意圖堆棧有兩個(gè)基本操作:入棧(push)和出棧(pop)。入棧就是將一個(gè)新的元素放入棧頂,這一個(gè)元素只能夠是字,不能是字節(jié)。入棧也稱作壓棧。出棧則是從棧頂取出一個(gè)元素。其中棧頂?shù)脑乜偸亲詈笕霔W钕瘸鰲?。出棧也稱作退?;驈棾?。堆棧指令POP/PUSH8086的堆棧機(jī)制8086 CPU中提供了堆棧的機(jī)制,將一段內(nèi)存當(dāng)作棧來(lái)使用,并通過(guò)8086的相關(guān)指令以棧的方式訪問(wèn)內(nèi)存。堆棧操作過(guò)程中,段寄存器SS指向用于堆棧的內(nèi)存段,SP指向該堆棧的棧頂,把它們合在一起就可以訪問(wèn)棧頂單元。堆棧的深度由SP的初值決定。入棧指令:PUSH 格式: PUSH Reg/M

11、em PUSH Imm;80286+功能:一個(gè)字進(jìn)棧,系統(tǒng)自動(dòng)完成兩步操作:首先SPSP-2,使棧頂指針指向一個(gè)新位置,然后(SP)操作數(shù);出棧指令:POP 格式: POP Reg/Mem功能:彈出一個(gè)字,系統(tǒng)自動(dòng)完成兩步操作:首先彈出操作數(shù)(SP),然后SPSP+2,使棧頂指針指向新的棧頂位置;堆棧指令POP/PUSH舉例:PUSH AX ; (SP)-2SP且(SP),(SP)1)(AX)PUSH BX ; 將(BX)壓入堆棧PUSH SS ; 將(SS)壓入堆棧PUSH CS ; 將(CS)壓入堆棧(這是合法的)PUSH BETA ; 將BETA存儲(chǔ)字的內(nèi)容壓入堆棧PUSH BETABX

12、; 將BETABX一個(gè)字的內(nèi)容壓入堆棧PUSH BETABXSI; 將BETABX+SI一個(gè)字的內(nèi)容壓入堆棧POP BETABXSIPOP BETABXPOP BETAPOP A ; 因?yàn)镻OP CS是非法的POP SSPOP BXPOP AX 堆棧指令POP/PUSH假設(shè)AX=4243H,執(zhí)行指令“PUSH AX”,進(jìn)棧前后堆棧段的情況如a、b所示,執(zhí)行指令“POP BX”,堆棧段情況如圖b、c所示。(a)進(jìn)棧前堆棧段(b)進(jìn)棧后和出棧前堆棧段 (c)出棧后堆棧段 堆棧指令POP/PUSH注意:(1) 因?yàn)槎褩V羔楽P總是指向已經(jīng)存入數(shù)據(jù)的棧頂,所以PUSH指令是先(SP)-2SP,然后將內(nèi)

13、容壓棧,即先修改SP使之指向堆棧中的空閑單元,后將內(nèi)容壓棧。而POP是先從棧頂彈出一個(gè)字,然后將堆棧指針(SP)+2SP以便使剛剛彈出的堆棧字空間釋放;(2)因?yàn)镾P總是指向棧頂,而用PUSH和POP指令存取數(shù)時(shí)都是在棧頂進(jìn)行的,所以堆棧是“先進(jìn)后出”或稱作“后進(jìn)先出”。棧底在高地址,堆棧是從高地址向低地址延伸的,所以棧底就是最初的棧頂; (3)PUSH CS 是合法的,但POP CS是非法的;(4)PUSH 和POP的操作數(shù)都不能是立即數(shù);(5)用PUSH指令和POP指令時(shí)只能按字訪問(wèn)堆棧,不能按字節(jié)訪問(wèn)堆棧;(6)PUSH和POP指令都不影響標(biāo)志。堆棧指令POP/PUSH.model sm

14、all .stack 4h .code go: mov ah,A mov al,B mov bh,C mov bl,D push ax push bx pop ax pop bx mov ah,4ch int 21h end go(3)交換指令XCHG格式:XCHG Reg/Mem, Reg/Mem功能:將源操作數(shù)和目的操作數(shù)相互交換。目的操作數(shù)和源操作數(shù)同時(shí)為字節(jié)或字。 例如: XCHG AX,BX ; AX與BX寄存器內(nèi)容交換 XCHG SI,AX ; SI與AX內(nèi)容交換 XCHG AL,BL ; AL與BL內(nèi)容交換 XCHG WORD_VAR,CX ; 變量WORD_VAR與CX寄存器內(nèi)

15、容交換 XCHG DH,BYTE_VAR ; DH與變量BYTE_VAR內(nèi)容交換 XCHG SI+3, AL ; DS:SI+3所指的內(nèi)容與AL內(nèi)容交換交換指令XCHG注意:XCHG指令不影響狀態(tài)標(biāo)志。(2) 操作數(shù)可以是通用寄存器和存儲(chǔ)器,但不包括段寄存器,也不能為立即數(shù)。(3) 源操作數(shù)和目的操作數(shù)不能同時(shí)為存儲(chǔ)器,因此不能直接實(shí)現(xiàn)兩個(gè)存儲(chǔ)器單元的內(nèi)容交換。若要進(jìn)行存儲(chǔ)器(字)變量A和存儲(chǔ)器(字)變量B的內(nèi)容交換,可以借用一個(gè)通用寄存器來(lái)實(shí)現(xiàn): MOV AX,B XCHG AX,A MOV B,AX 交換指令XCHG舉例:用XCHG指令將字符串S1與S2的內(nèi)容進(jìn)行交換源程序如下: DATA

16、 SEGMENTS1 DB ABCDEFGS2 DB 0123456N DW $-OFFSET S2 ;N為字符串長(zhǎng)度DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV SI,0 MOV CX,N;將字符的個(gè)數(shù)送至CX中L1: MOV AL, S1SI XCHG AL, S2SI MOV S1SI,AL;借助寄存器AL將S1SI與S2SI交換 INC SI LOOP L1 ;循環(huán)N次 MOV AH,4CH INT 21HCODE ENDS END START (4)查表轉(zhuǎn)換指令XLAT格式:XL

17、AT功能:換碼表中的一個(gè)字節(jié),稱為換碼字節(jié),用換碼字節(jié)來(lái)置換累加器AL中的內(nèi)容,即ALBXAL。說(shuō)明:該指令有兩個(gè)隱含操作數(shù)BX和AL,換碼表的表首由DS:BX指向,要換的碼在表中的位移由寄存器AL中的內(nèi)容指出。指令執(zhí)行后即將表中要換的碼置入AL中,即DS:BX+ALAL。查表轉(zhuǎn)換指令XLAT舉例:利用XLAT指令將計(jì)算機(jī)機(jī)內(nèi)二進(jìn)制表示的十六進(jìn)制轉(zhuǎn)換成ASCII碼并顯示輸出源程序如下:DATA SEGMENTHEX_NUM DB 0,1,2,3,4,5,6,7,8,9,0AH,0BH, 0CH,0DH,0EH,0FHTABLE DB 0123456789ABCDEFDATA ENDSCODE

18、SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AXMOV CX,16MOV BX,OFFSET TABLEMOV SI,OFFSET HEX_NUM查表轉(zhuǎn)換指令XLAT L:MOV AL,SIXLAT TABLE;換碼DS:BX+ALALMOV DL,ALMOV AH,02H;顯示輸出INT 21HMOV DL, INT 21HINC SILOOP LMOV AH,4CH INT 21HCODE ENDSEND START2 輸入輸出指令I(lǐng)N/OUT格式一:端口輸入 IN AL,port 端口輸出 OUT port,AL功能:

19、IN從指定的外設(shè)端口讀數(shù)據(jù)到AL寄存器,OUT將AL寄存器的內(nèi)容傳送到指定的外設(shè)端口。說(shuō)明:這里端口地址port為立即數(shù),限制在0255,只能使用AX或AL收發(fā)端口數(shù)據(jù)。 格式二:端口輸入 MOV DX,port IN AL,DX 端口輸出 MOV DX,port OUT DX, AL說(shuō)明:這里端口地址可以在0655353 標(biāo)志寄存器傳送指令(1)LAHF指令( Load AH with Flags )格式:LAHF功能:將標(biāo)志寄存器的狀態(tài)標(biāo)志SF, ZF, AF, PF, CF位傳送至AH寄存器的對(duì)應(yīng)位,AH寄存器的其余3位內(nèi)容不變,其操作如圖所示:標(biāo)志寄存器傳送指令(2) SAHF指令(S

20、tore AH into Flags) 格式:SAHF功能:將AH的指定位(與狀態(tài)標(biāo)志對(duì)應(yīng)的位)傳送至標(biāo)志寄存器(即與LAHF指令傳送方向相反)。其操作示意如下圖所示 該條指令把寄存器AH的指定位送至標(biāo)志寄存器低8位的SF, ZF, AF, PF和CF標(biāo)志位,因而這些標(biāo)志的內(nèi)容會(huì)受到影響。但這條指令不影響溢出標(biāo)志OF、方向標(biāo)志DF、中斷允許標(biāo)志IF和追蹤標(biāo)志TF,即不影響標(biāo)志寄存器的高位字節(jié)。標(biāo)志寄存器傳送指令(3) PUSHF指令(PUSH Flags)格式:PUSHF功能:將標(biāo)志寄存器的內(nèi)容壓入堆棧。先將堆棧指針減2(即(SP)-2SP),然后將整個(gè)標(biāo)志寄存器(16位)的內(nèi)容壓入SP所指向

21、的棧頂。 這條指令不影響狀態(tài)標(biāo)志。 (4) POPF指令(POP Flags)格式:POPF功能:標(biāo)志寄存器退棧。先將堆棧頂?shù)膬?nèi)容,即(SP)+1,(SP)傳送至標(biāo)志寄存器(16位)中,然后將堆棧指針SP加2,即(SP)+2SP。執(zhí)行該指令后,標(biāo)志寄存器的各位會(huì)發(fā)生相應(yīng)的變化,因此,該指令影響標(biāo)志寄存器。4 地址傳送指令(1)有效地址傳送指令LEA (Load Effective Address)格式: LEA Reg, Mem 功能:把源操作數(shù)的有效地址傳送至目的操作數(shù)寄存器說(shuō)明:該指令通常用來(lái)對(duì)指針或變址寄存器BX、DI或SI等置初值之用。目的操作數(shù)為16位的通用寄存器(即AX, BX,

22、CX, DX, SP, BP, SI, DI之一);源操作數(shù)是存儲(chǔ)器操作數(shù),如變量、標(biāo)號(hào)或地址表達(dá)式例如: LEA BX,BUFFER ; 將變量BUFFER的位移量送入BX中LEA DX,BUFARRAYBXSI ; 將數(shù)組元素的位移量送入DX中LEA AX,BPDI ; 將有效地址(BP)+(DI)送入AX中地址傳送指令注意:LEA指令處理的是變量的地址(即變量的位移量),而不是變量的內(nèi)容(即變量的值)。 LEA指令和MOV指令有本質(zhì)上的區(qū)別。假設(shè)變量BUFFER的偏移是1000H,該字變量的值是4243H,則指令“LEA AX,BUFFER”是將偏移1000H送入AX中,而指令“MOV

23、AX,BUFFER”是將值4243H送入AX中。MOV指令也可以傳送有效地址(位移量),但必須用OFFSET操作符作用于變量,“MOV AX,OFFSET BUFFER”將變量BUFFER的位移量送入AX中。(3) LEA指令的源操作數(shù)可以帶下標(biāo),即LEA指令可以傳送任意數(shù)組元素的位移量。例如指令“LEA DX,BUFARRAYBXSI”是將數(shù)組元素BUFARRAYBXSI的位移量傳送至DX中。而MOV指令用OFFSET操作符則不能直接取數(shù)組元素的位移量,只能取數(shù)組的第一個(gè)元素的位移量(即數(shù)組的起始地址)。(4) LEA指令的源操作數(shù)必須是存儲(chǔ)器操作數(shù)。(5) LEA指令的目的操作數(shù)必須是16

24、位寄存器。(6) LEA指令不影響狀態(tài)標(biāo)志。地址傳送指令(2)取段寄存器指令(Load Segment Instruction) 格式:LDS/LES Reg, Mem 功能:將雙字指針傳送至目的操作數(shù)(寄存器)和數(shù)據(jù)段寄存器。將源操作數(shù)中所含的一個(gè)32位地址指針的段值部分(變量或標(biāo)號(hào)所在地段的基址)送到數(shù)據(jù)段寄存器DS(LDS)或ES(LES)中,偏移部分(變量或標(biāo)號(hào)所在段的位移量)送到目的操作數(shù)。 LDS(Load Data Segment Register)和LES(Load Extra Segment Register) 。 Reg是16位寄存器,Mem必須是32位存儲(chǔ)器指針;例如:

25、LDS BX, DD_VAR; DD_VAR為雙字變量 將DD_VAR所在的段的段基址送到DS,將DD_VAR的偏移量送到BX。2.2.2算術(shù)運(yùn)算指令(20條)1 加法指令 ADD (ADD byte or word)字節(jié)或字相加 ADC (ADd byte or word with Carry)帶進(jìn)位的字節(jié)或字相加 INC (INCrement byte or word by 1)字節(jié)或字加1。 AAA (ASCII Adjust for Addition)加法的ASCII碼修正 DAA (Decimal Adjust for Addition)加法的十進(jìn)制修正2 減法指令 SUB (SUB

26、tract byte or word)字節(jié)或字相減 SBB (SUBtract Byte or word with carry)帶借位的字節(jié)或字相減 NEG (NEGate byte or word)字節(jié)或字求補(bǔ) CMP (COMPare byte or word)字節(jié)或字的比較 DEC (DECrement byte or word by 1)字節(jié)或字減1 AAS (ASCII Adjust for Subtraction)減法的ASCII碼修正 DAS (Decimal Adjust for Subtraction)減法的十進(jìn)制校正算術(shù)運(yùn)算指令3 乘法指令 MUL (MULtiple by

27、te or word unsigned)無(wú)符號(hào)的字節(jié)或字相乘。 IMUL (Integer MULtiple byte or word)整數(shù)字節(jié)或字相乘。 AAM (ASC II Adjust for Multiple)乘法的ASCII碼修正4 除法指令 DIV (DIVide byte or word unsigned)無(wú)符號(hào)的字節(jié)或字相除。 IDIV (Integer DIVision signed)帶符號(hào)數(shù)除法指令。 AAD (ASCII Adjust for Division)除法的ASCII碼修正。 CBW (Convert Byte to Word)字節(jié)轉(zhuǎn)換為字。 CWD (Con

28、vert Word to Double word)字轉(zhuǎn)換為雙字。算術(shù)運(yùn)算的數(shù)據(jù)格式80X86提供的二進(jìn)制算術(shù)運(yùn)算指令包括二進(jìn)制運(yùn)算和十進(jìn)制運(yùn)算指令,能對(duì)二進(jìn)制數(shù)(字節(jié)或字)直接進(jìn)行算術(shù)運(yùn)算,并且通過(guò)專門的調(diào)整指令,可以完成十進(jìn)制數(shù)(BCD碼)的算術(shù)運(yùn)算。它提供的加、減、乘、除4種基本的算術(shù)運(yùn)算指令,只能直接對(duì)整數(shù)進(jìn)行操作,而不能直接對(duì)實(shí)數(shù) (浮點(diǎn)數(shù))進(jìn)行運(yùn)算。對(duì)于無(wú)符號(hào)二進(jìn)制數(shù) 加法指令有:ADD,ADC,INC 減法指令有:SUB,SBB,DEC 乘法指令為:MUL 除法指令為:DIV 對(duì)于帶符號(hào)的二進(jìn)制數(shù) 乘法指令為:IMUL 除法指令為:IDIV; 加、減法運(yùn)算:與無(wú)符號(hào)二進(jìn)制數(shù)的加、減

29、法指令一樣算術(shù)運(yùn)算的數(shù)據(jù)格式對(duì)于壓縮型BCD碼加、減分兩步來(lái)實(shí)現(xiàn):先用一條無(wú)符號(hào)二進(jìn)制數(shù)的加、減指令對(duì)壓縮型BCD碼進(jìn)行加、減,在AL中產(chǎn)生一個(gè)中間結(jié)果(可能為不正確的結(jié)果);然后再執(zhí)行一條加、減法的壓縮型BCD碼調(diào)整指令。加法調(diào)整指令為DAA;減法調(diào)整指令為DAS。調(diào)整指令將AL中的中間結(jié)果調(diào)整為最終正確的壓縮型BCD碼。壓縮型BCD碼不能進(jìn)行乘、除運(yùn)算對(duì)于非壓縮型BCD碼加、減、乘運(yùn)算都是先用無(wú)符號(hào)二進(jìn)制數(shù)的加、減、乘運(yùn)算指令在AL中產(chǎn)生一個(gè)中間結(jié)果,然后,再執(zhí)行一條調(diào)整指令,以便將AL中可能錯(cuò)誤的中間結(jié)果調(diào)整成最終正確的非壓縮型BCD碼。其加法的調(diào)整指令為AAA;減法的調(diào)整指令為AAS;

30、乘法的調(diào)整指令為AAM。非壓縮型BCD碼十進(jìn)制數(shù)的除法運(yùn)算與加、減、乘不同,除法不是先計(jì)算后校正,而是先校正后做除法。除法調(diào)整指令為AAD。非壓縮型BCD碼在進(jìn)行加、減時(shí),可以直接用09數(shù)字的ASCII碼參加運(yùn)算,而不必將高4位清零,這也是將非壓縮型BCD碼的調(diào)整指令稱為ASCII碼調(diào)整指令的緣故。而乘、除運(yùn)算之前則必須將ASCII碼高4位清零,即必須轉(zhuǎn)換為真正的非壓縮型BCD碼后才能夠進(jìn)行相應(yīng)運(yùn)算。二進(jìn)制加法指令 ADD(1)加法指令 ADD格式:ADD DST,SRC功能: (DST)+(SRC) DST影響狀態(tài)標(biāo)志:AF,CF,OF,PF,SF,ZF。說(shuō)明:目的操作數(shù)可以是寄存器和存儲(chǔ)器

31、;源操作數(shù)可以是寄存器、存儲(chǔ)器和立即數(shù),但是兩者不能同時(shí)是存儲(chǔ)器。 例:ADD AX, BX ;(AX)+(BX)AXADD BX ;同上,這里不寫出目的操作數(shù),隱含的目的操作數(shù)為AXADD AX, BX+SI;(AX)+(DS:BX+SI)AXADD AX, 12;(AX)+12 AXADD BXSI,AX;(DS:BX+SI)+(AX)DS:BX+SIADD BXSI,12;(DS:BXSI)+12 (BXSI)二進(jìn)制加法指令 ADC(2)帶進(jìn)位加法指令 ADC格式:ADC DST,SRC功能: (DST)+(SRC)+ CF DST影響狀態(tài)標(biāo)志:AF,CF,OF,PF,SF,ZF。說(shuō)明:

32、ADD和ADC指令既適用于無(wú)符號(hào)二進(jìn)制數(shù)加法運(yùn)算,也適用于帶符號(hào)二進(jìn)制數(shù)的加法運(yùn)算。但是,它們的兩個(gè)操作數(shù)必須同時(shí)為無(wú)符號(hào)數(shù)或同時(shí)為帶符號(hào)數(shù),并且同時(shí)為字節(jié)(8位數(shù))或同時(shí)為字(16位數(shù))。ADC指令多用于多字節(jié)加法運(yùn)算,需要分步計(jì)算時(shí)很有用。例如,有兩個(gè)兩字節(jié)的數(shù)相加,AF8AH+0A90H,先進(jìn)行低字節(jié)相加,然后做高字節(jié)相加,并且要加上進(jìn)位,示意如下:二進(jìn)制加法指令 INC(3)加1指令 INC格式:INC DST功能:(DST)+ 1 DST影響狀態(tài)標(biāo)志:AF,OF,DF,SF,ZF。不影響進(jìn)位標(biāo)志CF。說(shuō)明:目的操作數(shù)可以為通用寄存器,也可以為存儲(chǔ)器,但不能是立即數(shù)。 操作數(shù)可為字節(jié)或

33、字,并被當(dāng)作一個(gè)無(wú)符號(hào)二進(jìn)制數(shù),這一點(diǎn)不同于ADD,ADC。該指令常用于調(diào)整地址和計(jì)數(shù)器。例如: INC CX INC BL INC BYTE PTRBX ;數(shù)據(jù)段中位移量BX的字節(jié)加1 INC WORD PTRBX+SI ;數(shù)據(jù)段中位移量為BX+SI處的字加1 INC WORD PTRBP+SI ;堆棧段中位移量為BP+SI處的字加1二進(jìn)制減法指令 SUB(4)減法指令 SUB格式:SUB DST,SRC功能: (DST)(SRC) DST影響狀態(tài)標(biāo)志:AF,CF,OF,PF,SF,ZF。說(shuō)明:目的操作數(shù)和源操作數(shù)的具體格式同ADD指令。 例:SUB AX, BX ;(AX)-(BX)AXS

34、UB CL, 6SUB WORD PRTBX, 56二進(jìn)制減法指令 SBB(5)帶借位減法指令 SBB格式:SBB DST,SRC功能: (DST)(SRC)CF DST影響狀態(tài)標(biāo)志:AF,CF,OF,PF,SF,ZF。說(shuō)明:要求同ADC,可用于多字節(jié)數(shù)值的減法程序。減法實(shí)際上是用加法做的。即先把源操作數(shù)(減數(shù))變成其補(bǔ)碼,把CF也變成補(bǔ)碼(0的補(bǔ)碼為0,1的補(bǔ)碼為1111 1111(8位時(shí))或1111 1111 1111 1111(16位時(shí)),然后再做加法。例如:(DL)=03H,(BL)=64H,CF=1。指令:SBB BL,DL的執(zhí)行結(jié)果是:(BL)=60H,示意如下 :二進(jìn)制減法指令

35、DEC、CMP(6)減1指令 DEC格式:DEC DST功能: (DST) 1 DST影響狀態(tài)標(biāo)志:AF,OF,PF,SF,ZF。不影響進(jìn)位標(biāo)志CF。說(shuō)明:目的操作數(shù)可為字節(jié)或字,并被視為無(wú)符號(hào)二進(jìn)制數(shù)。例如:DEC BX(7)比較指令 CMP格式:CMP DST, SRC功能: (DST) (SRC),影響標(biāo)志位。影響狀態(tài)標(biāo)志:AF,OF,PF,SF,ZF,CF。說(shuō)明:該指令常用于比較兩個(gè)數(shù)的大小,執(zhí)行相減后只根據(jù)結(jié)果設(shè)置標(biāo)志位,并不改變兩個(gè)操作數(shù)的原值。其它要求同SUB指令。例如:CMP AX,BX二進(jìn)制減法指令 NEG(8)求補(bǔ)指令 NEG格式:NEG DST功能:0減去目的操作數(shù)后送至

36、目的操作數(shù),使目的操作數(shù)符號(hào)變反。例如,+1變成-1,-變成+2。即實(shí)現(xiàn):0(DST) DST.影響狀態(tài)標(biāo)志:AF, CF, OF, PF, SF和ZF。但要注意:除了操作數(shù)為0以外,CF總是1;操作數(shù)為0時(shí)CF置0。 說(shuō)明:利用NEG指令可以實(shí)現(xiàn)求一個(gè)數(shù)的相反數(shù)。舉例:(1)實(shí)現(xiàn) 0(AL)的運(yùn)算。 NEG AL (2)AX中存放一負(fù)數(shù),求該數(shù)的絕對(duì)值。 NEG AX二進(jìn)制加減運(yùn)算的有效性加減指令同時(shí)會(huì)影響到標(biāo)志寄存器的CF和OF,這兩個(gè)標(biāo)志位主要是為算術(shù)運(yùn)算設(shè)計(jì)的,設(shè)計(jì)規(guī)則如下: (1) 當(dāng)符號(hào)位(即最高位)有進(jìn)位時(shí),CF=1,否則CF=0。CF可以用來(lái)表示無(wú)符號(hào)數(shù)的溢出。 (2) 數(shù)據(jù)位

37、向符號(hào)位有進(jìn)位,但符號(hào)位不再產(chǎn)生進(jìn)位時(shí)有溢出,或者符號(hào)位產(chǎn)生進(jìn)位但數(shù)據(jù)位不向符號(hào)位進(jìn)位時(shí)也產(chǎn)生溢出。OF可以用來(lái)表示帶符號(hào)數(shù)的溢出。 下面用實(shí)例來(lái)總結(jié)CF, OF和運(yùn)算有效性之間的關(guān)聯(lián)規(guī)律。 (1)CF=0,OF=0 符號(hào)位無(wú)進(jìn)位CF=0,數(shù)據(jù)位向符號(hào)位無(wú)進(jìn)位OF=0二進(jìn)制加減運(yùn)算的有效性(2)CF=1,OF=0 符號(hào)位有進(jìn)位CF=1,數(shù)據(jù)位向符號(hào)位也有進(jìn)位OF=0 (3)CF=0,OF=1 符號(hào)位無(wú)進(jìn)位CF=0,數(shù)據(jù)位向符號(hào)位有進(jìn)位OF=1 二進(jìn)制加減運(yùn)算的有效性(4)CF=1,OF=1 符號(hào)位有進(jìn)位CF=1,并且數(shù)據(jù)位向符號(hào)位無(wú)進(jìn)位OF=1 CF標(biāo)志OF標(biāo)志無(wú)符號(hào)數(shù)有符號(hào)數(shù)00有效有效10

38、無(wú)效有效01有效無(wú)效11無(wú)效無(wú)效標(biāo)志位與運(yùn)算結(jié)果的有效性關(guān)系二進(jìn)制加減運(yùn)算舉例(1)例1 執(zhí)行指令 ADD DX, 0F0F0H二進(jìn)制加減運(yùn)算舉例(2)例2 執(zhí)行兩個(gè)雙精度數(shù)的加法。 設(shè)目的操作數(shù)在DX和AX中,DX為高位,源操作數(shù)在BX和CX中,BX為高位。(DX)=0002H, (AX)=0F365H, (BX)=0005H, (CX)=0E024H,指令序列為ADD AX, CXADC DX,BX第一條指令執(zhí)行后:第二條指令執(zhí)行后:二進(jìn)制加減運(yùn)算舉例(3)例3 執(zhí)行指令 SUB SI+14H,0136H二進(jìn)制加減運(yùn)算舉例(4)例4 執(zhí)行指令 SUB DH, BP+4二進(jìn)制加減運(yùn)算舉例(5

39、)例5 設(shè)X,Y,Z均為雙精度數(shù),它們分別存放在X,X+2; Y,Y+2; Z,Z+2存儲(chǔ)單元中,存放時(shí)高位字在高地址,低位字在低地址,用指令實(shí)現(xiàn)下列運(yùn)算,結(jié)果存放在W,W+2單元。 W = X + Y + 24 - Z二進(jìn)制乘法指令 MUL、IMUL(9)無(wú)符號(hào)乘法指令 MUL (Unsigned Multiple)(10)帶符號(hào)乘法指令 IMUL (Signed Multiple)格式:MUL SRC_reg/mIMUL SRC_reg/m功能:把源操作數(shù)與隱含目的操作數(shù) AL或AX相乘,結(jié)果保存到AX或(DX,AX)中。說(shuō)明:源操作數(shù)可以使用除立即數(shù)方式外的各種尋址方式;若源操作數(shù)是8位

40、,則與AL相乘,實(shí)現(xiàn)字節(jié)型乘法: (AL)*(SRC)8 AX若源操作數(shù)是16位,則與AX相乘,實(shí)現(xiàn)字型乘法:(AX)*(SRC)16 (DX,AX)二進(jìn)制乘法指令 IMUL影響狀態(tài)標(biāo)志:AF, CF, OF, PF, SF和ZF,但只有CF、OF有意義,其它標(biāo)志不確定。對(duì)于MUL指令, 若乘積的高半部分(AH或DX)為0,則對(duì)CF和OF清0,否則OF、CF均為1??梢杂脕?lái)檢查結(jié)果是字節(jié)、字或者是雙字。對(duì)于IMUL指令,如果乘積的高一半是低一半的符號(hào)擴(kuò)展,則CF和OF均為0,否則就均為1。舉例:MOV AL, 8MUL BL;(AL)*(BL),結(jié)果在AX中MOV AX, 1234HMUL W

41、ORD PRT BX;(AX)*(BX),結(jié)果在DX:AX中MOV AL, 80HSUB AH, AH;AH清0MUL BX ;(AX)*(BX),結(jié)果在DX:AX中二進(jìn)制除法指令 DIV(11)無(wú)符號(hào)除法指令 DIV格式:DIV SRC_reg/m功能:將AX或(DX,AX)中無(wú)符號(hào)被除數(shù)除以源操作數(shù)中的無(wú)符號(hào)除數(shù)。對(duì)于8位除數(shù)的除法運(yùn)算,被除數(shù)在AX中;對(duì)于16位除數(shù)的除法運(yùn)算,被除數(shù)在(DX,AX)中。運(yùn)算后將商送回累加器AL或AX,將余數(shù)送到AH或DX。商或余數(shù)均為無(wú)符號(hào)數(shù)。具體操作:字節(jié)型除法:(AX)/(SRC)8 商:AL, 余數(shù):AH字節(jié)型除法:(DX,AX)/(SRC)16

42、商:AX, 余數(shù):DX影響狀態(tài)標(biāo)志:無(wú)定義。若除數(shù)為0或商超出操作數(shù)的范圍,會(huì)產(chǎn)生除法錯(cuò)中斷,類型號(hào)為0.二進(jìn)制除法指令 DIV舉例:(1)計(jì)算135100,可用以下指令序列來(lái)實(shí)現(xiàn): MOV AX,135 ;被除數(shù)135AX MOV BL,100 ;除數(shù)100BL DIV BL ;(AX)(BL)商1AL,余數(shù)35AH(2)計(jì)算125321000,可用下列指令序列實(shí)現(xiàn): MOV AX,12532 ;被除數(shù)12532AX MOV DX,0 ;0DX MOV BX,1000 ;除數(shù)1000BX DIV BX ;DX AX(BX)商12AX,余數(shù)532DX二進(jìn)制除法指令 IDIV(12)帶符號(hào)除法指

43、令 IDIV格式:DIV SRC_reg/m功能:實(shí)現(xiàn)兩個(gè)帶符號(hào)二進(jìn)制數(shù)相除,與DIV指令類似,但操作數(shù)必須是帶符號(hào)數(shù),商和余數(shù)也是帶符號(hào)數(shù)。說(shuō)明:帶符號(hào)數(shù)的除法指令I(lǐng)DIV規(guī)定:余數(shù)和被除數(shù)的符號(hào)相同。這樣規(guī)定就使得商和余數(shù)是唯一的。例如: -26(+)= -3(商),余數(shù)為-5,是正確的; -26(+)= -4(商),余數(shù)為+2,是錯(cuò)誤的。除法指令源操作數(shù)的尋址方式可以使用除立即數(shù)之外的各種尋址方式;字節(jié)、字?jǐn)U展指令CBW/CWD(13)字節(jié)轉(zhuǎn)換為字指令 CBW格式:CBW功能:將AL的符號(hào)擴(kuò)充到AH說(shuō)明:如(AL)最高位為0,則(AH)=00;如(AL)最高位為1,則(AH)=0FFH;

44、(14)字轉(zhuǎn)換為雙字指令 CWD格式:CWD功能:將AX的符號(hào)擴(kuò)充到DX說(shuō)明:如(AX)最高位為0,則(DX)=0000;如(AX)最高位為1,則(DX)=0FFFFH;算術(shù)運(yùn)算綜合舉例計(jì)算( V ( X * Y + Z 540 ) ) / X,其中X、Y、Z、V均為16位帶符號(hào)數(shù),已分別裝入X、Y、Z、V單元中,要求計(jì)算結(jié)果商存入AX,余數(shù)存入DX寄存器。十進(jìn)制算術(shù)運(yùn)算(1)對(duì)于壓縮型BCD碼加、減分兩步來(lái)實(shí)現(xiàn):先用一條無(wú)符號(hào)二進(jìn)制數(shù)的加、減指令對(duì)壓縮型BCD碼進(jìn)行加、減,在AL中產(chǎn)生一個(gè)中間結(jié)果(可能為不正確的結(jié)果);然后再執(zhí)行一條加、減法的壓縮型BCD碼調(diào)整指令。加法調(diào)整指令為DAA;減

45、法調(diào)整指令為DAS。調(diào)整指令將AL中的中間結(jié)果調(diào)整為最終正確的壓縮型BCD碼。壓縮型BCD碼不能進(jìn)行乘、除運(yùn)算十進(jìn)制運(yùn)算調(diào)整指令 DAADAA (decimal adjust for addition)加法的十進(jìn)制調(diào)整指令格式:DAA功能:跟在二進(jìn)制加法指令之后,把AL中的結(jié)果調(diào)整成壓縮BCD碼并送回AL.說(shuō)明:參與二進(jìn)制加法指令的兩個(gè)操作數(shù)必須是壓縮BCD碼,DAA指令必須在ADD或ADC指令之后,二進(jìn)制加法的和必須在AL寄存器中。調(diào)整規(guī)則:如果AL低四位組成的二進(jìn)制數(shù)大于9或者輔助進(jìn)位標(biāo)志AF=1,則將AL加上06H,并使AF=1;如果AL高四位組成的二進(jìn)制數(shù)大于9或者進(jìn)位標(biāo)志CF=1,則

46、將AL加上60H,并使CF=1;影響標(biāo)志位:除OF標(biāo)志無(wú)影響外,影響其它標(biāo)志。十進(jìn)制運(yùn)算調(diào)整指令DAS (decimal adjust for subtraction)減法的十進(jìn)制調(diào)整指令格式:DAS功能:跟在二進(jìn)制減法指令之后,把AL中的結(jié)果調(diào)整成兩位壓縮BCD碼并送回AL.說(shuō)明:參與二進(jìn)制減法指令的兩個(gè)操作數(shù)必須是壓縮BCD碼,DAS指令必須在SUB或SBB指令之后,二進(jìn)制減法的差必須在AL寄存器中。調(diào)整規(guī)則:如果AL低四位組成的二進(jìn)制數(shù)大于9或者輔助進(jìn)位標(biāo)志AF=1,則將AL減去06H,并使AF=1 ;如果AL高四位組成的二進(jìn)制數(shù)大于9或者進(jìn)位標(biāo)志CF=1,則將AL減去60H,并使CF=

47、1;影響標(biāo)志位:除OF標(biāo)志無(wú)影響外,影響其它標(biāo)志。十進(jìn)制算術(shù)運(yùn)算(2)對(duì)于非壓縮型BCD碼09十個(gè)數(shù)字的ASCII碼可以看作非壓縮BCD碼。加、減、乘運(yùn)算都是先用無(wú)符號(hào)二進(jìn)制數(shù)的加、減、乘運(yùn)算指令在AL中產(chǎn)生一個(gè)中間結(jié)果,然后,再執(zhí)行一條調(diào)整指令,以便將AL中可能錯(cuò)誤的中間結(jié)果調(diào)整成最終正確的非壓縮型BCD碼。其加法的調(diào)整指令為AAA;減法的調(diào)整指令為AAS;乘法的調(diào)整指令為AAM。非壓縮型BCD碼十進(jìn)制數(shù)的除法運(yùn)算與加、減、乘不同,除法不是先計(jì)算后校正,而是先校正后做除法。除法調(diào)整指令為AAD。非壓縮型BCD碼在進(jìn)行加、減時(shí),可以直接用09數(shù)字的ASCII碼參加運(yùn)算,而不必將高4位清零,這也

48、是將非壓縮型BCD碼的調(diào)整指令稱為ASCII碼調(diào)整指令的緣故。而乘、除運(yùn)算之前則必須將ASCII碼高4位清零,即必須轉(zhuǎn)換為真正的非壓縮型BCD碼后才能夠進(jìn)行相應(yīng)運(yùn)算。十進(jìn)制運(yùn)算調(diào)整指令A(yù)AA (ASCII adjust for addition)加法的ASCII調(diào)整指令格式:AAA功能:跟在二進(jìn)制加法指令之后,把AL中的結(jié)果調(diào)整成非壓縮BCD碼并送回AL.說(shuō)明:參與二進(jìn)制加法指令的兩個(gè)操作數(shù)必須是ASCII碼或非壓縮BCD碼,AAA指令必須在ADD或ADC指令之后,二進(jìn)制加法的和必須在AL寄存器中。調(diào)整步驟:(1)如AL低4位在09之間且AF=0,則跳過(guò)第(2)步,執(zhí)行第(3)步;(2)如AL

49、低4位在十六進(jìn)制數(shù)AF之間或AF=1,則將AL加上06H,AH內(nèi)容加1,并使AF=1;(3)清除AL寄存器的高4位;(4)AF位的值送CF位.影響標(biāo)志位:影響AF/CF標(biāo)志,其它標(biāo)志無(wú)定義。十進(jìn)制運(yùn)算調(diào)整指令A(yù)AS (ASCII adjust for subtraction)減法的ASCII調(diào)整指令格式:AAS功能:跟在二進(jìn)制減法指令之后,把AL中的結(jié)果調(diào)整成非壓縮BCD碼并送回AL.說(shuō)明:參與二進(jìn)制減法指令的兩個(gè)操作數(shù)必須是ASCII碼或非壓縮BCD碼,AAS指令必須在SUB或SBB指令之后,二進(jìn)制減法的差必須在AL寄存器中。調(diào)整步驟:(1)如AL低4位在09之間且AF=0,則跳過(guò)第(2)步

50、,執(zhí)行第(3)步;(2)如AL低4位在十六進(jìn)制數(shù)AF之間或AF=1,則將AL減去06H,AH內(nèi)容減1,并使AF=1;(3)清除AL寄存器的高4位;(4)AF位的值送CF位.影響標(biāo)志位:影響AF/CF標(biāo)志,其它標(biāo)志無(wú)定義。十進(jìn)制運(yùn)算調(diào)整指令A(yù)AM (ASCII adjust for multiplication)加法的ASCII調(diào)整指令格式:AAM功能:跟在二進(jìn)制乘法指令MUL之后,對(duì)AL中的結(jié)果進(jìn)行調(diào)整,調(diào)整后的非壓縮BCD碼在AX中.說(shuō)明:參與MUL指令的兩個(gè)操作數(shù)必須是非壓縮BCD碼,AAM指令必須在MUL指令之后,AX中的二進(jìn)制乘積的有效部分在AL中,該乘積的最大值不會(huì)超過(guò)81,調(diào)整的非

51、壓縮BCD碼結(jié)果在AX中。調(diào)整步驟: 把AL內(nèi)容除以0AH,商放在AH中,余數(shù)保存在AL中。影響標(biāo)志位:影響SF/ZF/PF標(biāo)志,其它標(biāo)志無(wú)定義十進(jìn)制運(yùn)算調(diào)整指令A(yù)AD (ASCII adjust for division)減法的ASCII調(diào)整指令格式:AAD功能:AAD指令在二進(jìn)制除法指令DIV之前,對(duì)AX中的非壓縮BCD碼進(jìn)行調(diào)整,以便執(zhí)行DIV指令之后,得到非壓縮BCD碼形式的商在AL中,余數(shù)在AH中.說(shuō)明:調(diào)整前AH中為非壓縮BCD碼的十位上的數(shù),AL中為個(gè)位。調(diào)整步驟: 把AX中的被除數(shù)調(diào)整成二進(jìn)制數(shù),并存放在AL中,內(nèi)容除以0AH,商放在AH中,余數(shù)保存在AL中。影響標(biāo)志位:影響S

52、F/ZF/PF標(biāo)志,其它標(biāo)志無(wú)定義以上討論都沒(méi)有涉及到符號(hào)問(wèn)題,對(duì)于帶符號(hào)的十進(jìn)制數(shù),需要用附加的字節(jié)作為符號(hào)標(biāo)志。2.2.3邏輯運(yùn)算指令(13條)(1) 邏輯指令(logical) NOT (NOT byte or word)字節(jié)或字邏輯非 AND (AND byte or word)字節(jié)或字的邏輯與 OR (Inclusive OR byte or word)字節(jié)或字的邏輯或 XOR (eXclusive OR byte or word)字節(jié)或字的邏輯異或 TEST (TEST byte or word)字節(jié)或字的測(cè)試 (2) 移位指令(shifts) SHL(SHift Logical

53、Left byte or word)字節(jié)或字的邏輯左移 SAL (SHift Arithmetic Left byte or word)字節(jié)或字的算術(shù)左移 SHR (SHift logical Right byte or word)字節(jié)或字的邏輯右移 SAR (Shift Arithmetic Right byte or word)字節(jié)或字的算術(shù)右移 ROL (ROtate Left byte or word)字節(jié)或字的循環(huán)左移 ROR (ROtate Right byte or word)字節(jié)或字的循環(huán)右移 RCL (Rotate through Carry Left byte or wor

54、d)字節(jié)或字帶進(jìn)位循環(huán)左移 RCR (Rotate through Carry Right byte or word)字節(jié)或字帶進(jìn)位循環(huán)右位邏輯指令NOT AND OR XOR TEST(1) 邏輯指令(logical) 邏輯指令可以對(duì)字或字節(jié)按位執(zhí)行邏輯運(yùn)算。 格式:AND DST, SRC ;按位相與,結(jié)果送 (DST) OR DST, SRC ;按位相或,結(jié)果送 (DST) XOR DST, SRC ;按位異或,結(jié)果送 (DST) NOT OPR ;對(duì)操作數(shù)按位取反 TEST OPR1,OPR2;按位相與,結(jié)果影響標(biāo)志位但不保存說(shuō)明:(1)NOT指令不允許使用立即數(shù);(2)NOT指令不影

55、響標(biāo)志位,其余4條指令對(duì)CF和OF清0,影響SF、ZF、PF,對(duì)AF無(wú)定義。邏輯指令舉例;對(duì)AL中的值按位求反MOV AL,00001111BNOT AL;清0高四位,低四位不變AND AL,0FH;使高四位置位,低四位不變OR AL,0F0H;使61H端口的D1、D7位變反IN AL, 61HXOR AL, 82HOUT 61H, AL;使AX清0XOR AX,AX;設(shè)系統(tǒng)中打印機(jī)的狀態(tài)端口是379H,其D7位是忙閑標(biāo)志位,D7=0表示忙, D7=1表示閑,測(cè)試打印機(jī)狀態(tài),控制程序執(zhí)行。MOV DX, 379HWT:IN AL, DXTEST AL, 80HJZ WT移位指令基本移位指令格式

56、:SHL OPR, CNT ;邏輯左移CNT次SAL OPR, CNT ;算術(shù)左移CNT次SHR OPR, CNT ;邏輯右移CNT次SAR OPR, CNT ;算術(shù)右移CNT次循環(huán)移位指令格式:ROL OPR, CNT ;循環(huán)左移CNT次ROR OPR, CNT ;循環(huán)右移CNT次RCL OPR, CNT ;帶進(jìn)位邏輯左移CNT次RCR OPR, CNT ;帶進(jìn)位循環(huán)右移CNT次(1)SHL/SAL(2)SHR (3)SAL(4)ROL(5)ROR (6)RCL(7)RCR移位指令說(shuō)明:(1)操作數(shù)OPR可以為8、16或32位,可以用立即數(shù)之外的任何尋址方式;(2)CNT1時(shí),直接在指令中寫

57、出,CNT1時(shí),在CL寄存器給出;(3)CF中總是最后移出的一位,ZF/SF/PF按結(jié)果設(shè)置,當(dāng)CNT=1時(shí),如果移位使符號(hào)位變化,則使OF=1,否則OF=0。(4)SAR指令使最高位右移,保持其自身的值不變。舉例:設(shè)無(wú)符號(hào)數(shù)X在AL中,用移位指令實(shí)現(xiàn)X*10的運(yùn)算。MOV AH, 0SAL AX, 1MOV BX, AXMOV CL, 2SAL AX, CLADD AX, BX2.2.4字符串指令(5條)MOVSMOVSBMOVSW (MOV Byte or Word String)傳送字節(jié)串或字串。STOSSTOSBSTOSW (STOre Byte OR Word String)存字節(jié)串

58、或字串。LODSLODSBLODSW (LOaD Byte or Word String)取字節(jié)串或字串。以上各條指令前可使用重復(fù)前綴指令REPCMPSCMPSBCMPSW (COMPare Byte or Word String)比較字節(jié)或字串。SCASSCASBSCASW (SCAn Byte or Word String)搜索字節(jié)串或字串。以上各條指令前可使用重復(fù)前綴指令REPEREPZREPNZ字符串指令(1)串傳送指令格式: MOVS DST, SRC MOVSB (字節(jié)傳送) MOVSW (字傳送)操作: ( (DI) ) ( (SI) ),且自動(dòng)修改SI/DI指針:若DF=0 :

59、字節(jié)操作時(shí),SI/DI各加1,字操作時(shí),SI/DI各加2;若DF=1 :字節(jié)操作時(shí),SI/DI各減1,字操作時(shí),SI/DI各減2;該指令不影響標(biāo)志位。說(shuō)明:第一種格式應(yīng)在操作數(shù)中表明是字節(jié)還是字操作,用如下格式:MOVS ES:BYTE PTRDI, DS:SI且這種尋址方式是固定的,不允許其他尋址方式。源串是指由DS:SI指向的字節(jié)或字符串目標(biāo)串是指由ES:DI指向的字節(jié)或字符串字符串指令(2)存入串指令格式: STOS DST STOSB (存字節(jié)) STOSW (存字)操作:字節(jié)操作: ( (DI) ) ( AL ) 字操作: ( (DI) ) ( AX ) 自動(dòng)修改SI/DI指針:若D

60、F=0 :字節(jié)操作時(shí),SI/DI各加1,字操作時(shí),SI/DI各加2;若DF=1 :字節(jié)操作時(shí),SI/DI各減1,字操作時(shí),SI/DI各減2;該指令不影響標(biāo)志位。說(shuō)明:字符串指令(3)從串取指令格式: LODS DST, SRC LODSB (取字節(jié)) LODSW (取字)操作: 字節(jié)操作: ( AL ) ( (SI) )字操作: ( AX ) ( (SI) )自動(dòng)修改SI/DI指針:若DF=0 :字節(jié)操作時(shí),SI/DI各加1,字操作時(shí),SI/DI各加2;若DF=1 :字節(jié)操作時(shí),SI/DI各減1,字操作時(shí),SI/DI各減2;該指令不影響標(biāo)志位。說(shuō)明:字符串指令指令前綴:REP 重復(fù)串操作直到C

溫馨提示

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

評(píng)論

0/150

提交評(píng)論