匯編語言第2-3周_第1頁
匯編語言第2-3周_第2頁
匯編語言第2-3周_第3頁
匯編語言第2-3周_第4頁
匯編語言第2-3周_第5頁
已閱讀5頁,還剩86頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

匯編語言程序設(shè)計主講:江蘇蘇匯編語言程序設(shè)計1第二、三周大課第二、三周主要內(nèi)容基本尋址方式指令的種類及格式、指令的運行時間傳送類指令:MOV、進出棧,交換、地址傳送、類型轉(zhuǎn)換等運算類指令:加法、減法、比較、乘法、除法、十進制調(diào)整;邏輯運算:與、或、非、異或、測試、移位等控制轉(zhuǎn)移指令:JMP、Jcc、LOOP等數(shù)據(jù)定義及存儲器分配:DB、DW等簡單鍵盤輸入和屏幕顯示用的DOS調(diào)用指令susujiang@匯編語言程序設(shè)計2susujiang@匯編語言程序設(shè)計3第3章80x86指令系統(tǒng)主要內(nèi)容

80x86的尋址方式

程序空間和執(zhí)行時間

80x86的指令系統(tǒng)susujiang@匯編語言程序設(shè)計480x86的尋址方式[標(biāo)號:]

指令助記符[操作數(shù)1[,操作數(shù)2]][;注釋]指令助記符——標(biāo)記指令功能的字母符號,對應(yīng)一條二進制編碼的機器指令,又稱為操作碼操作數(shù)——不同的指令可有不同個數(shù)的操作數(shù),用逗號分隔

標(biāo)號——在需要時給指令加上標(biāo)號(符號地址),以冒號與操作碼分隔注釋——若要寫注釋,必須以分號開頭一、匯編語言的指令格式操作數(shù)通常有三種形式:立即操作數(shù):指令的操作數(shù)是立即數(shù),直接出現(xiàn)在指令 中。寄存器操作數(shù):操作數(shù)是寄存器的值,指令中使用寄存器名。內(nèi)存操作數(shù):操作數(shù)是某個內(nèi)存單元的值,指令中給出有效地址EA,段地址在某個段寄存器中。參考:指令助記符表susujiang@匯編語言程序設(shè)計7二、尋址方式

80x86的尋址方式

指令中指定操作數(shù)或操作數(shù)存放位置的方法稱為尋址方式。有七種基本的尋址方式:立即尋址寄存器尋址直接尋址寄存器間接尋址寄存器相對尋址基址變址尋址相對基址變址尋址(80386以前只能使用最多16位寄存器)含比例因子的變址尋址方式:

80386以后增加的尋址方式(同時可以使用32位寄存器)比例變址尋址基址比例變址的尋址相對基址比例變址的尋址susujiang@匯編語言程序設(shè)計8立即尋址方式寄存器尋址方式直接尋址方式80x86的尋址方式例: MOVAH,80H

MOVECX,12345678H

MOVAX,4576H

; 以上指令中的第二操作數(shù)都是立即數(shù)注:立即數(shù)不能作為指令中的第一操作數(shù)例:MOVEAX,EBX

ADDAX,DX

ADDAX,1234H

例:MOVBX,[1234H]

;

;缺省使用段寄存器DSMOVES:[1000H],AX ;指定用段寄存器ESsusujiang@匯編語言程序設(shè)計9寄存器間接尋址方式寄存器相對尋址方式80x86的尋址方式例:MOVBX,[DI] ;EA=(DI), ;PA=(DS)*16+EA若有效地址用SI、DI和BX等之一來指定,則其缺省的段寄存器為DS;若有效地址用BP來指定,則其缺省的段寄存器為SS(即:堆棧段)。指令中給出的8位/16位偏移量用補碼表示。計算有效地址時,若偏移量是8位,則進行符號擴展成16位。當(dāng)所得的有效地址超過0FFFFH,則取其64K的模。例:MOVBX,[SI+100H]

;EA=(SI)+100H ;PA=(DS)*16+EAsusujiang@匯編語言程序設(shè)計1080x86的尋址方式基址變址尋址方式相對基址變址尋址方式例: MOVBX,[BX+SI]

或?qū)懗桑篗OVBX,[BX][SI]例: MOVAX,[BX+SI+200H]或?qū)懗桑篗OVAX,200H[BX][SI]

;EA=(BX)+(SI)+200H;PA=(DS)*16+EA若有效地址用SI、DI和BX等之一來指定,則其缺省的段寄存器為DS;若有效地址用BP來指定,則其缺省的段寄存器為SS。;EA=(BX)+(SI);PA=(DS)*16+EAsusujiang@匯編語言程序設(shè)計11說明:默認(rèn)段寄存器取決于基址寄存器;而地址中寄存器的書寫順序決定了 該寄存器是基址還是變址寄存器;顯式段寄存器優(yōu)先。80x86的尋址方式(386以后)指令舉例所用的段寄存器MOV

EDX,ES:[EAX*4+200H];顯式段寄存器ESMOV

[ESP+EDX*2],AX

;默認(rèn)段寄存器SSMOV

EBX,GS:[EAX+EDX*2+300H];顯式段寄存器GSMOV

EAX,[EBX+EBP];默認(rèn)段寄存器DSMOV

EBX,[EBP+EBX];默認(rèn)段寄存器SS比例變址尋址方式基址比例變址的尋址方式相對基址比例變址的尋址方式

例:MOVEBX,[EAX+EDX*4]

例:MOVEBX,[EAX+EDX*2+300H]或MOVEBX,300H[EAX][EDX*2]

例:MOVEBX,[ECX*2]MOVEDX,[EAX*4+200H]susujiang@匯編語言程序設(shè)計12

說明:Variable是變量名或變量名±整數(shù)表達式。reg為BX、BP、SI、DI。disp可以是常量或變量,匯編后為一個常數(shù),若是變量,則取其偏移地址。base為BX或BP,index為SI或DI。有效地址為各項之和。如disp[base][index]形式,EA=base+index+disp。若使用了BP,則隱含段地址在SS,否則在DS。80x86的尋址方式三、內(nèi)存操作數(shù)形式歸納16位匯編指令中的:

Variable或[Variable] [reg] disp[reg] [base][index] disp[base][index]susujiang@匯編語言程序設(shè)計1380x86的尋址方式32位匯編指令中的:

[base] disp[base] [base][index] disp[base][index] [index*n] disp[index*n] [base][index*n] disp[base][index*n]三、內(nèi)存操作數(shù)形式歸納說明:base、index為任一32位通用寄存器(index不能取ESP)。n為比例因子,取1、2、4或8。若包含base且base為EBP或ESP,則隱含段地址在SS;否則,隱含段地址在DS。若在16位CPU上編程,則不能使用這些尋址方式。susujiang@匯編語言程序設(shè)計14第3章80x86指令系統(tǒng)主要內(nèi)容

80x86的尋址方式

程序空間和執(zhí)行時間

80x86的指令系統(tǒng)susujiang@匯編語言程序設(shè)計15程序占有的空間和執(zhí)行時間匯編語言程序設(shè)計通常需要考慮程序占用的空間,因為不同的指令所對應(yīng)的機器指令的長度不同,各條指令占用的字節(jié)數(shù)不同,程序量越大所需的存儲空間也越大。匯編語言程序設(shè)計還需要考慮程序的執(zhí)行時間,這是因為不同的指令或不同的尋址方式在取操作數(shù)或存放運算結(jié)果時所需要的時間長短不同。完成同樣功能的不同的程序可能在存儲空間和執(zhí)行時間上有很大的差別。如果對程序所占有的存儲空間或?qū)Τ绦驁?zhí)行的時間有很高的要求,則必須仔細(xì)斟酌程序的算法和指令的選用。susujiang@匯編語言程序設(shè)計16指令的語法舉例周期數(shù)ADCreg,regadcdx,cx1ADCmem,regadcwordptrm16[2],dx3ADCreg,memadcdx,dwordptrm32[2]2ADDreg,regaddax,bx1ADDmem,regaddtotal,cx3ADDreg,memaddcx,incr2ADDreg,immedaddbx,61ADDmem,immedaddpointers[bx][si],63ADDaccum,immedaddax,101INCregincbx1INCmemincvpage3XADDreg,regxadddl,al3XADDmem,regxaddstring,bl4susujiang@匯編語言程序設(shè)計17指令的語法舉例周期數(shù)ANDreg,reganddx,bx1ANDmem,regandbitmask,bx3ANDreg,memandbx,masker2ANDreg,immedanddx,0F7h1ANDmem,immedandmasker,100lb3ANDaccum,immedandax,0B6h1指令的語法舉例周期數(shù)ROLreg,1rolax,11ROLmem,1rolbits,13ROLreg,CLrolax,cl4ROLmem,CLrolcolor,cl4ROLreg,immed8rolax,131ROLmem,immed8rolbyteptr[bx],103susujiang@匯編語言程序設(shè)計18第3章80x86指令系統(tǒng)主要內(nèi)容

80x86的尋址方式

程序空間和執(zhí)行時間

80x86的指令系統(tǒng)susujiang@匯編語言程序設(shè)計1980x86的指令系統(tǒng)數(shù)據(jù)傳送指令算術(shù)指令邏輯指令控制轉(zhuǎn)移指令串處理指令處理器指令學(xué)習(xí)要求: 了解指令的功能,有效、準(zhǔn)確地運用指令。注意點: 指令所要求的操作數(shù)及其尋址方式 指令對標(biāo)志位的影響、標(biāo)志位對指令的影響 指令的執(zhí)行時間指令的分類susujiang@匯編語言程序設(shè)計20數(shù)據(jù)傳送指令通用數(shù)據(jù)傳送指令累加器專用傳送指令

地址傳送指令標(biāo)志寄存器傳送指令類型轉(zhuǎn)換指令包括:傳送、傳送-擴展指令 進棧、出棧指令 交換指令包括:輸入、輸出指令 換碼指令包括:有效地址傳送指令 指針?biāo)图拇嫫髦噶畎ǎ簶?biāo)志寄存器存取到AH

標(biāo)志寄存器存取堆棧包括:字節(jié)轉(zhuǎn)換為字 字轉(zhuǎn)換為雙字 雙字轉(zhuǎn)換為4字 字節(jié)交換匯編語言程序設(shè)計21數(shù)據(jù)傳送指令一、通用數(shù)據(jù)傳送指令1.MOV(來自Move):傳送指令一般形式:

MOV dst,src ;(dst)←(src),將源操作數(shù)src復(fù)制到目的操作 數(shù)dst,src不變。說明:兩個操作數(shù)的數(shù)據(jù)類型要相同,要同為8位、16位或32位;兩個操作數(shù)不能同時為段寄存器;代碼段寄存器CS不能為目的操作數(shù),但可作為源操作數(shù);指令指針I(yè)P不能作為MOV指令的操作數(shù);立即數(shù)不能作為目的操作數(shù);立即數(shù)不能直接傳給段寄存器;兩個操作數(shù)不能同時為存儲單元。對標(biāo)志位無影響。susujiang@匯編語言程序設(shè)計228位通用寄存器8個:AL、AH、BL、BH、CL、CH、DL、DH。16位通用寄存器8個:AX、BX、CX、DX、SI、DI、BP、SP。32位通用寄存器8個:EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP。數(shù)據(jù)傳送指令susujiang@匯編語言程序設(shè)計23指令的語法格式指令舉例周期數(shù)MOVreg,regMOVBP,SP1MOVmem,regMOVARRAY[DI],BX1MOVreg,memMOVBX,pointer1MOVmem,immMOV[BX],151MOVreg,immMOVCX,2561MOVmem,accumMOVtotal,AX1MOVaccum,memMOVAL,string1MOVsegreg,reg16MOVDS,AX2,3MOVsegreg,mem16MOVES,psp2,3MOVreg16,segregMOVAX,DS1MOVmem16,segregMOVstack_save,SS1數(shù)據(jù)傳送指令注:

Reg—Register(通用寄存器),

Mem—Memory(存儲器),

Imm—Immediate(立即數(shù)), 它們可以是8位、16位或32位(特別指出其位數(shù)的除外)。segreg—Segmentregister(段寄存器),accum—Accumulator(累加器)。susujiang@匯編語言程序設(shè)計24數(shù)據(jù)傳送指令(386新增)MOVSX(MovewithSign-extend)一般形式:

MOVSX dst,src ;src符號擴展為dst;386新增語法格式:

MOVSX reg16,reg8/mem8 MOVSX reg32,reg8/mem8/reg16/mem16功能描述:將8位數(shù)符號擴展為16位或32位數(shù),或者將16位數(shù)符號擴展為 32位數(shù)。對標(biāo)志位無影響。2.傳送-擴展指令MOVZX(MovewithZero-extend)一般形式:

MOVZX dst,src ;src零擴展為dst;386新增語法格式:

MOVZX reg16,reg8/mem8 MOVZX reg32,reg8/mem8/reg16/mem16對標(biāo)志位無影響。susujiang@匯編語言程序設(shè)計25數(shù)據(jù)傳送指令3.進棧指令PUSH(Pushontothestack)一般形式: PUSHreg/mem/seg/imm功能描述:PUSH16位操作數(shù)時:

SP=SP-2 SS:[SP]指向16位操作數(shù)PUSH32位操作數(shù)時:

SP=SP-4 SS:[SP]指向32位操作數(shù)指令的語法舉例周期數(shù)PUSHregPUSHDX1PUSHmemPUSH[DI]2PUSHsegregPUSHES1PUSHimmPUSH150001PUSHAPUSHA5PUSHADPUSHAD5

以上指令均對標(biāo)志位無影響。susujiang@匯編語言程序設(shè)計26PUSHA(PushAllGeneralRegisters)指令格式:PUSHA

;80286+其功能是依次把寄存器AX、CX、DX、BX、SP、BP、SI和DI等壓棧。PUSHAD(PushAll32-bitGeneralRegisters)指令格式:PUSHAD

;80386+其功能是把寄存器EAX、ECX、EDX、EBX、ESP、EBP、ESI和EDI等壓棧。數(shù)據(jù)傳送指令

susujiang@匯編語言程序設(shè)計27數(shù)據(jù)傳送指令指令的語法舉例周期數(shù)POPregPOPCX1POPmemPOPparam3POPsegregPOPES3POPAPOPA5POPADPOPAD54.出棧指令

POP(Popfromthestack)一般形式: POPreg/mem/seg功能描述:

POP16位操作數(shù)時:

16位操作數(shù)←SS:[SP],

SP=SP+2 POP32位操作數(shù)時:

32位操作數(shù)←SS:[SP],

SP=SP+4

以上指令均對標(biāo)志位無影響。susujiang@匯編語言程序設(shè)計28POPA(PopAllGeneralRegisters)指令格式:POPA

;80286+

其功能是依次把寄存器DI、SI、BP、SP、BX、DX、CX和AX等彈出棧。程序員不用記住它們的具體順序,只要與指令PUSHA對稱使用即可。POPAD(PopAll32-bitGeneralRegisters)指令格式:POPAD

;80386+

其功能是依次把寄存器EDI、ESI、EBP、ESP、EBX、EDX、ECX和EAX等彈出棧,它應(yīng)該與PUSHAD對稱使用。數(shù)據(jù)傳送指令susujiang@匯編語言程序設(shè)計29數(shù)據(jù)傳送指令例1:設(shè)SP=100H,EBX=12345678H,給出下列指令依次執(zhí)行后的結(jié)果。

PUSH BX ;SS:[00FFH]=56H

;SS:[00FEH]=78H,SP=0FEH POP AX ;AX=5678H,SP=100H PUSH EBX ;SS:[00FEH]=34H

;SS:[00FFH]=12H

;SS:[00FCH]=78H

;SS:[00FDH]=56H,SP=0FCH POP AX ;AX=5678H,SP=0FEH POP DX ;DX=1234H,SP=100H

例2:利用進棧和出棧指令交換AX與CX的值。

PUSH AX PUSH CX POP AX POP CXsusujiang@匯編語言程序設(shè)計30堆棧的特點80x86系統(tǒng)的堆棧具有如下特點:堆棧是在內(nèi)存中專門指定的某一段為堆棧段,具有“先進后出”的特點。堆棧只有一個出入口,即當(dāng)前棧頂。當(dāng)堆棧為空時,棧頂和棧底指向同一內(nèi)存單元。堆棧有兩個基本操作:PUSH(進棧)和POP(出棧)。PUSH操作使棧頂向低地址方向移動,而POP操作則剛好相反。堆棧操作只能以字或雙字為單位。堆棧指針SP/ESP(地址長度為32位時使用ESP作為堆棧指針)總是指向棧頂。susujiang@匯編語言程序設(shè)計31數(shù)據(jù)傳送指令5.XCHG(Exchange)交換指令一般形式:

XCHG oprd1,oprd2

;交換oprd1與oprd2的內(nèi)容功能說明:對標(biāo)志位無影響。

oprd1與oprd2不能都是內(nèi)存操作數(shù)。

oprd1與oprd2類型必須匹配。指令的語法舉例周期數(shù)XCHGreg,regXCHGCX,DX3XCHGreg,memXCHGEBX,[EBP][EAX*4],3XCHGmem,regXCHG[BX],AX3XCHGaccum,regXCHGEAX,ECX2XCHGreg,accumXCHGCX,AX2例: 已知EBX=12345678H,EDX=11223344H

執(zhí)行指令 XCHG EBX,EDX后 得EBX=11223344H,EDX=12345678H

已知單元2300H和2301H內(nèi)容為30H和40H,DX=5678H

執(zhí)行指令 XCHG [2300H],DX后 得2300H和2301H內(nèi)容為78H和56H,DX=4030Hsusujiang@匯編語言程序設(shè)計32數(shù)據(jù)傳送指令二、累加器專用傳送指令

IN(Input)輸入指令一般形式: IN

AL/AX/EAX,PortNo/DX功能說明: 該指令的作用是從端口中讀入一個字節(jié)或字或雙字,并保存在寄存器AL或AX或EAX中。如果某輸入設(shè)備的端口地址在0~255范圍之內(nèi),可在指令中直接給出PortNo,否則要把該端口地址先存入寄存器DX中。

OUT(Output)輸出指令一般形式: OUT

PortNo/DX,AL/AX/EAX功能說明: 把寄存器AL或AX或EAX的內(nèi)容輸出到指定端口。例:

INAL,20H ;從端口20讀入1個字節(jié)的內(nèi)容,傳送到累加器AL。

INAL,DX ;DX需預(yù)先賦值,從指定端口傳送一個字節(jié)到AL。

OUT28H,AX ;從AX輸出一個字的內(nèi)容到端口28H和29H。以上指令均對標(biāo)志位無影響。susujiang@匯編語言程序設(shè)計33數(shù)據(jù)傳送指令XLAT(Translate)換碼指令一般形式:

XLAT ;AL←(DS:[BX/EBX+AL])功能說明:將DS:BX所指內(nèi)存區(qū)中、由AL指定位移處的一個字節(jié)賦給AL。對標(biāo)志位無影響。當(dāng)需要進行代碼轉(zhuǎn)換時,可預(yù)先建立相應(yīng)的表格,把字節(jié)表格首地址存入BX或EBX,執(zhí)行指令就將對應(yīng)下標(biāo)為AL的存儲單元的內(nèi)容傳送給AL;注意表格長度不超過256字節(jié)。 例:把字母轉(zhuǎn)換成其它代碼產(chǎn)生加密碼。 把數(shù)字0-9轉(zhuǎn)換成七段數(shù)碼管代碼。 把ASCII字符轉(zhuǎn)換成可以運算的數(shù)等。susujiang@匯編語言程序設(shè)計34例:把AL中的十六進制數(shù)字轉(zhuǎn)換成七段數(shù)碼管代碼用于顯示。已知:DS=1200H,BX=0300H根據(jù)AL的值,可以取到相應(yīng)的顯示代碼。若指令執(zhí)行前:AL=05H執(zhí)行指令 XLAT12300H3FH12301H06H12302H5BH12303H4FH12304H66H12305H6DH12306H7DH12307H07H12308H7FH12309H6FH1230AH77H1230BH7CH1230CH39H1230DH5EH1230EH79H1230FH71H指令執(zhí)行后:AL=6DHDS 12000BX 0300AL+05PA 12305數(shù)據(jù)傳送指令—換碼指令匯編語言程序設(shè)計35數(shù)據(jù)傳送指令三、地址傳送指令LEA(LoadEffectiveAddress)有效地址裝入指令 一般形式:

LEA reg,mem ;reg←mem的有效地址 功能說明:把一個內(nèi)存變量的有效地址送給指定的寄存器(此處reg不能使用段寄存器)。當(dāng)reg長度大于地址長度時,將地址零擴展后存入reg; 當(dāng)reg長度小于地址長度時,截取地址的低16位存入reg。該指令通常用來對指針或變址寄存器BX、DI或SI等置初值之用。對標(biāo)志位無影響。例:設(shè)BX=5678H,EAX=00002345H,

EDX=00001111H。

LEA SI,2[BX] ;執(zhí)行后,SI=567AH LEA SI,2[EAX][EDX] ;執(zhí)行后,SI=3458Hsusujiang@匯編語言程序設(shè)計36段寄存器裝入指令1: LDS(LoadDataSegmentRegister) LES(LoadExtraSegmentRegister)LFS(LoadExtraSegmentRegister)LGS(LoadExtraSegmentRegister)LSS(LoadStackSegmentRegister)

指令格式:

LDS Reg,Mem ;reg16←(mem),DS←(mem+2) LES Reg,Mem ;reg16←(mem),ES←(mem+2) LFS Reg,Mem ;reg16←(mem),FS←(mem+2);80386+ LGS Reg,Mem ;reg16←(mem),GS←(mem+2);80386+ LSS Reg,Mem ;reg16←(mem),SS←(mem+2);80386+功能說明1: 該組指令的功能是把存貯單元的一個“低字”傳送給指令中指定的16位寄存器,把隨后的一個“高字”傳給相應(yīng)的段寄存器;susujiang@匯編語言程序設(shè)計37功能說明2: 當(dāng)指定的Reg是32位時,要從低地址為mem開始的4個字節(jié)中的內(nèi)容給32位寄存器,再將低地址為mem+4開始的“字”內(nèi)容送段寄存器; 該類指令 對標(biāo)志位無影響。指令格式:

LDS Reg32,Mem ;reg32←(mem),DS←(mem+4) LES Reg32,Mem ;reg32←(mem),ES←(mem+4) LFS Reg32,Mem ;reg32←(mem),FS←(mem+4) LGS Reg32,Mem ;reg32←(mem),GS←(mem+4) LSSReg32,Mem ;reg32←(mem),SS←(mem+4)段寄存器裝入指令2: susujiang@匯編語言程序設(shè)計38數(shù)據(jù)傳送指令LAHF(LoadAHfromFlags)標(biāo)志寄存器送累加器指令指令形式: LAHF ;AH←FLAGS的低8位 對標(biāo)志位無影響。SAHF(StoreAHintoFlags)累加器送標(biāo)志寄存器指令指令形式: SAHF ;FLAGS的低8位←AH

對標(biāo)志位的影響:由新裝入值確定。四、標(biāo)志寄存器傳送指令 共有四條與標(biāo)志寄存器相關(guān)的指令。1514131211109876543210

OFDFIFTFSFZF

AF

PF

CFsusujiang@匯編語言程序設(shè)計39PUSHF(PushFlagsontoStack)標(biāo)志寄存器進棧指令指令形式:

PUSHF ;SP=SP-2,FLAGS進棧

PUSHFD ;SP=SP-4,EFLAGS進棧;80386+對標(biāo)志位的影響:PUSHFD清除VM和RF位。POPF(PopFlagsoffStack)標(biāo)志寄存器出棧指令指令形式:

POPF ;棧頂字出棧到FLAGS,SP=SP+2 POPFD ;棧頂雙字出棧到EFLAGS, SP=SP+4;80386+對標(biāo)志位的影響:POPF/POPFD指令會以彈出值設(shè)置標(biāo)志寄存器。數(shù)據(jù)傳送指令susujiang@匯編語言程序設(shè)計40數(shù)據(jù)傳送指令CBW、CWD、CWDE與CDQ 擴展指令 一般形式:

CBW ;AL符號擴展為AX CWD ;AX符號擴展為32位數(shù)DX:AX CWDE ;AX符號擴展為EAX;386新增

CDQ ;EAX符號擴展為64位數(shù)EDX:EAX;386新增例:設(shè)AL=0FEH,給出依次執(zhí)行下列指令后的結(jié)果。

CBW ;AX=0FFFEH CWD ;DX=0FFFFH,AX不變,即DX:AX=-2 CWDE ;EAX=0FFFFFFFEH(-2)

CDQ ;EDX=0FFFFFFFFH,EAX不變, 即EDX:EAX=-2五、類型轉(zhuǎn)換指令susujiang@匯編語言程序設(shè)計41BSWAP(Byteswap) 字節(jié)交換指令一般形式:

BSWAPreg32 ;只用于486及后續(xù)機型,將32位寄存器的字節(jié)次序變反。例: 指令執(zhí)行前EAX=12345678H

指令 BSWAPEAX

執(zhí)行后EAX=78563412H注:CBW和CWDE的功能可由MOVSX指令實現(xiàn)。

MOVSX AX,AL ;等價于CBW MOVSX EAX,AX ;等價于CWDE MOVSX EAX,AL ;等價于順序執(zhí)行CBW與CWDE數(shù)據(jù)傳送指令susujiang@匯編語言程序設(shè)計42算術(shù)指令

包括二進制運算和十進制運算指令,有雙操作數(shù)指令也有單操作數(shù)指令。加法指令減法指令乘法指令除法指令十進制調(diào)整指令指令的分類數(shù)據(jù)傳送指令算術(shù)指令邏輯及位操作指令控制轉(zhuǎn)移指令串處理指令處理器指令

susujiang@匯編語言程序設(shè)計43算術(shù)指令一、加法指令1ADD(AddBinaryNumbers)加法指令指令格式:

ADD

Reg/Mem,Reg/Mem/Imm ;(dst)←(dst)+(src)指令功能:把源操作數(shù)的值加到目的操作數(shù)中。受影響標(biāo)志位:CF、PF、AF、ZF、SF和OF。ADC(AddWithCarry)帶進位加指令指令格式:

ADC

Reg/Mem,Reg/Mem/Imm ;(dst)←(dst)+(src)+CF指令功能:把源操作數(shù)和進位標(biāo)志位CF的值(0/1)一起加到目的操作數(shù)中。受影響標(biāo)志位:CF、PF、AF、ZF、SF和OF。susujiang@匯編語言程序設(shè)計44INC(Incrementby1)加1指令指令格式:

INC

Reg/Mem ;(dst)←(dst)+1指令功能:把操作數(shù)的值加1。受影響標(biāo)志位:PF、AF、ZF、SF和OF,不影響CF。XADD(ExchangeandAdd)交換加指令指令格式:

XADD

Reg/Mem,Reg

;80486+指令功能:先交換兩個操作數(shù)的值,再進行算術(shù)加法操作。受影響標(biāo)志位:CF、PF、AF、ZF、SF和OF。一、加法指令2算術(shù)指令susujiang@匯編語言程序設(shè)計45算術(shù)指令方法1:用16位寄存器編寫程序MOVAX,wordptrd1;由于d1是雙字類型,必須使用強制類型說明符MOVDX,wordptrd1+2;(DX,AX)構(gòu)成一個32位數(shù)據(jù)ADDAX,wordptrd2;低字相加ADCDX,wordptrd2+2;高字相加。在低字相加時,有可能會產(chǎn)生“進位”MOVwordptrd1,AX;低字送給d1的低字MOVwordptrd1+2,DX;高字送給d1的高字方法2:用32位寄存器編寫程序MOVEAX,d1ADDEAX,d2MOVd1,EAX例: 已知有二個32位數(shù)d1和d2(預(yù)先定義過),編寫程序片段把d2的 值加到d1中。

d1DD12345678H d2DD22221111H……

……

……susujiang@匯編語言程序設(shè)計46算術(shù)指令二、減法類指令1SUB(SubtractBinaryValues)減法指令指令格式:

SUB

Reg/Mem,Reg/Mem/Imm;(dst)←(dst)-(src)指令功能:從目的操作數(shù)中減去源操作數(shù)。受影響標(biāo)志位:CF、PF、AF、ZF、SF和OF。

SBB(SubtractwithBorrow)帶借位減指令指令格式:

SBB

Reg/Mem,Reg/Mem/Imm;(dst)←(dst)-(src)-CF

指令功能:把源操作數(shù)和標(biāo)志位CF的值從目的操作數(shù)中一起 減去。受影響標(biāo)志位:CF、PF、AF、ZF、SF和OF。susujiang@匯編語言程序設(shè)計47DEC(Decrementby1)減1指令指令格式:

DEC

Reg/Mem

指令功能:把操作數(shù)的值減去1。受影響標(biāo)志位:PF、AF、ZF、SF和OF,不影響CF。

NEG(Negate)求補指令指令格式:

NEG

Reg/Mem

指令功能:操作數(shù)=0-操作數(shù),即改變操作數(shù)的正負(fù)號。受影響標(biāo)志位:CF、PF、AF、ZF、SF和OF。二、減法類指令2算術(shù)指令susujiang@匯編語言程序設(shè)計4862A0 01100010101000009D60 + 1001110101100000 0000000000000000

CF←

1算術(shù)指令例1:已知AX=62A0H,BX=9D60H,

ADDAX,BX ;AX=0000H

ZF=1,SF=0,OF=0 例2:已知CX=4AE0,DX=0EA04H SUBDX,CX ;DX=9F24H

ZF=0,SF=1,OF=0注意減法設(shè)置CF的規(guī)則:

有借位CF為1,無借位CF為0。二進制補碼運算時,加出結(jié)果的進位要取反: 有進位CF=0,無進位CF=1。 EA04 11101010000001004AE0-0100101011100000

? 1001111100100100

CF←0 EA04 1110101000000100+[-4AE0]補+1011010100100000 1001111100100100

CF←0←1

借位←進位取反susujiang@匯編語言程序設(shè)計49算術(shù)指令CMP(Compare)比較指令指令格式:CMP

Reg/Mem,Reg/Mem/Imm指令功能:用第一個操作數(shù)減第二個操作數(shù),并根據(jù)所得的差設(shè)置有關(guān) 標(biāo)志位。與SUB的區(qū)別在于不將減法結(jié)果存入dst。受影響標(biāo)志位:CF、PF、AF、ZF、SF和OF。

CMPXCHG(CompareAndExchange)8/16/32位比較交換指令指令格式:CMPXCHG

Reg/Mem,AL/AX/EAX

;80486+

指令功能:計算acc–dst,ifZF=0則acc←dst。受影響標(biāo)志位:CF、PF、AF、ZF、SF和OF。

CMPXCHG8B(CompareAndExchange)64位比較交換指令指令格式:CMPXCHG8B

Reg/Mem

;Pentium+

指令功能:該指令只有一個操作數(shù),第二個操作數(shù)EDX:EAX是隱含的。 計算EDX:EAX-dst

受影響的標(biāo)志位:ZF。二、減法類指令3--數(shù)值比較指令:susujiang@匯編語言程序設(shè)計50算術(shù)指令三、乘法指令1MUL(UnsignedMultiply)無符號數(shù)乘法指令指令格式: MUL

Reg/Mem ;accE←acc×src

指令功能:把顯式操作數(shù)和隱含操作數(shù)(都作為無符號數(shù))相 乘,所得的乘積如表中對應(yīng)關(guān)系存放。受影響標(biāo)志位:若結(jié)果的高一半為0,則CF=OF=0,否則 CF=OF=1;其余標(biāo)志無定義。(雖然OF=1,因為沒有超 出accE的位數(shù),故運算結(jié)果是正確的。)

乘數(shù)位數(shù)隱含的被乘數(shù)acc指令舉例乘積的存放位置accE8位ALMUL

BLIMULBLAX←AL*BL16位AXMUL

BXIMULBXDX-AX

←AX*BX32位EAXMUL

ECXIMULECXEDX-EAX

←EAX*ECXsusujiang@匯編語言程序設(shè)計51例:設(shè)AL=0FFH,BL=1,分別執(zhí)行MUL與IMUL指令,會得到不同結(jié)果。

MUL BL ;AX=0FFH(255),無符號數(shù)運算

IMUL BL ;執(zhí)行前AL為-1,執(zhí)行后AX=0FFFFHIMUL(SignedIntegerMultiply)有符號數(shù)乘法指令指令格式: IMUL

Reg/Mem ;accE←acc×src指令功能:把顯式操作數(shù)和隱含操作數(shù)(都作為有符號數(shù))相 乘,乘積如前表所示存放。受影響標(biāo)志位:若結(jié)果的高一半為低一半的符號擴展,則CF=

OF=0,否則,CF=OF=1;其余標(biāo)志無定義。算術(shù)指令三、乘法指令2susujiang@匯編語言程序設(shè)計52算術(shù)指令I(lǐng)MUL(SignedIntegerMultiply)擴展的有符號數(shù)乘法指令I(lǐng)MULReg,Imm;80286+,Reg←Reg×ImmIMULReg1,Reg2/Mem;80386+,Reg1←Reg1×Reg2

Reg1←Reg1×Mem

IMULReg1,Reg2/Mem,Imm;80286+,Reg1←Reg2×Imm

Reg1←Mem×Imm指令格式:說明:各操作數(shù)的位數(shù)要一致。如果乘積超過目標(biāo)寄存器所能存儲的范圍,則系統(tǒng)將置溢出標(biāo)志OF為1,其余無定義。例: IMULBX,0FFFEH ;若執(zhí)行前BX=-1,則執(zhí)行后BX=2 IMULEAX,EBX ;EAX=EAX*EBX IMULDX,tab01 ;DX=DX*(tab01) IMULEBX,array[ESI*4],7 ;EBX=([DS*16+array+ESI*4])*7三、乘法指令3susujiang@匯編語言程序設(shè)計53算術(shù)指令四、除法指令DIV(UnsignedDivide)無符號數(shù)除法指令指令格式: DIV

Reg/Mem 指令功能:用顯式操作數(shù)去除隱含操作數(shù)(都作為無符號數(shù)),所得商和余數(shù)如表所示存放。指令對標(biāo)志位的影響無定義。IDIV(SignedIntegerDivide)有符號數(shù)除法指令指令格式: IDIV

Reg/Mem指令功能:用顯式操作數(shù)去除隱含操作數(shù)(都作為有符號數(shù)),所得商和余數(shù)的對應(yīng)關(guān)系見下表。對標(biāo)志位的影響無定義。除數(shù)位數(shù)隱含的被除數(shù)商余數(shù)指令舉例8位AXALAHDIV

BHIDIVnum116位DX-AXAXDXDIV

BXIDIV[bx]32位EDX-EAXEAXEDXDIV

ECXIDIVebxsusujiang@匯編語言程序設(shè)計54算術(shù)指令例:計算四則運算(C-120+A*B)/CADW

?;數(shù)據(jù)定義段BDW

?;全部為有符號數(shù)CDW

?XDW

?;存放結(jié)果商YDW

?;存放結(jié)果余數(shù)…MOVAX,CSUBAX,120D;也可以用指令“ADDAX,-120D”CWD;擴展成32位,為了與乘積相加MOVCX,DX;(CX,BX)←(DX,AX),MOVBX,AX;調(diào)度寄存器,為作乘法準(zhǔn)備必要的寄存器MOVAX,AIMULB;(DX,AX)←A*BADDAX,BX;計算32位二進制之和,為作除法作準(zhǔn)備ADCDX,CXIDIVC;AX是商,DX是余數(shù)MOVX,AX;分別保存商和余數(shù)到指定的字變量單元里MOVY,DXsusujiang@匯編語言程序設(shè)計55算術(shù)指令五、十進制調(diào)整指令DAA(DecimalAdjustAfterAddition)十進制數(shù)加法調(diào)整指令指令格式:

DAA ;AL調(diào)整后,得到的結(jié)果還是壓縮型BCD碼。

受影響標(biāo)志位:AF、CF、PF、SF和ZF(OF無定義)調(diào)整規(guī)則:如果AL的低四位大于9,或標(biāo)志位AF=1,那么,AL=AL+6,并置AF=1如果AL的高四位大于9,或CF=1,那么,AL=AL+60H,并置CF=1;如果以上兩點都不成立,則,清除標(biāo)志位AF和CF。1.壓縮BCD碼調(diào)整指令—加法調(diào)整susujiang@匯編語言程序設(shè)計56DAS(DecimalAdjustAfterSubtraction)十進制數(shù)減法調(diào)整指令指令格式:

DAS ;AL調(diào)整后,得到的結(jié)果還是壓縮型BCD碼。受影響標(biāo)志位:AF、CF、PF、SF和ZF(OF無定義)調(diào)整規(guī)則:如果AL的低四位大于9,或標(biāo)志位AF=1,那么,AL=AL-6,并置AF=1;如果AL的高四位大于9,或CF=1,那么,

AL=AL-60H,并置CF=1;如果以上兩點都不成立,則,清除標(biāo)志位AF和CF。五、十進制調(diào)整指令1.壓縮BCD碼調(diào)整指令—減法調(diào)整算術(shù)指令susujiang@匯編語言程序設(shè)計57算術(shù)指令例1:壓縮BCD加法后的調(diào)整MOV

AL,43H ;假定要做十進制運算 MOV

BL,29H ;ADD

AL,BL

;AL=6CH,不是壓縮型的BCD碼,因為“C”DAA

;調(diào)整后,AL=72H,這是壓縮型的BCD碼, 因為:43+29=72例2:壓縮BCD減法后的調(diào)整MOV

AL,43H

MOV

BL,29H

SUB

AL,BL

;AL=1AH,不是壓縮型的BCD碼,因為“A”

DAS

;調(diào)整后,AL=14H,這是壓縮型的BCD碼, 因為:43-29=14說明:標(biāo)志位OF不確定;CF反映壓縮BCD碼相加/相減的進位/借位狀態(tài);按一般規(guī)則影響SF和ZF。若使用DAA/DAS指令,則參加加法/減法運算的操作數(shù)應(yīng)該是壓縮BCD碼。如果將任意2個二進制數(shù)相加/減,然后調(diào)整,將得不到正確結(jié)果。susujiang@匯編語言程序設(shè)計58算術(shù)指令A(yù)AA(ASCIIAdjustAfterAddition)ASCII碼加法調(diào)整指令指令格式:AAA ;調(diào)整AL的低四位,清除高四位,進位加至AH。受影響的標(biāo)志位:AF和CF(OF、PF、SF和ZF等無定義)。調(diào)整規(guī)則:AAS(ASCIIAdjustAfterSubtraction)ASCII碼減法調(diào)整指令指令格式:AAS ;調(diào)整AL的低四位、清除高四位,從AH減去借位。

受影響的標(biāo)志位:AF和CF(OF、PF、SF和ZF等無定義)。調(diào)整規(guī)則:2.非壓縮BCD碼調(diào)整指令*susujiang@匯編語言程序設(shè)計59算術(shù)指令例3*:編寫一段程序,完成二個15位十進制數(shù)X和Y之和,并把計算結(jié)果存入X之中。假設(shè)數(shù)據(jù)X和Y都是以字符串形式表示的?!璛db

"456407983123186";任意假設(shè)二個15位的大數(shù)Ydb

"326676709587211"…CLCMOVSI,14;用變址寄存器SI來從字符串的后面向前訪問MOVCX,15;因為它們是二個15位十進制數(shù)loop1:MOVAL,X[SI]ADCAL,Y[SI];把被加數(shù)加上AAAMOVX[SI],ALDECSILOOPloop1;15位十進制數(shù)相加完畢LEABX,X;下面5條指令是把X中的數(shù)據(jù)變成對應(yīng)的字符MOVCX,15loop2:ADDbyteptr[BX],'0'INCBXLOOPloop2…susujiang@匯編語言程序設(shè)計60算術(shù)指令A(yù)AM(ASCIIAdjustAfterMultiplication)乘法調(diào)整指令指令格式: AAM

受影響標(biāo)志位:PF、SF和ZF(AF、CF和OF等都是無定義)功能描述:該指令是用于調(diào)整寄存器AL之值,該值是由二個 單BCD碼字節(jié)用無符號乘指令MUL所得的積。調(diào)整規(guī)則:AH←AXdiv10(商),AL←AXmod10(余數(shù))例4:乘法調(diào)整MOV

AL,9

MOV

BL,8

MUL

BL

;AL=72D

AAM

;AH=7,AL=2susujiang@匯編語言程序設(shè)計61AAD(ASCIIAdjustbeforeDivision)ASCII碼除法調(diào)整指令指令格式: AAD

受影響標(biāo)志位:PF、SF和ZF(AF、CF和OF等都是無定義)功能描述:該指令是在作除法前用于調(diào)整寄存器AH和AL之值,它是把二個寄存器中單BCD碼組成一個十進制數(shù)值,為下面的除法作準(zhǔn)備的。調(diào)整規(guī)則:AL←AH*10+AL,AH←0例5:除法前調(diào)整

MOV

AX,0502H

MOV

BL,10D

AAD

;AH=0,AL=52D

DIV

BL

;AH=2(余數(shù)),AL=5(商)算術(shù)指令susujiang@匯編語言程序設(shè)計6280x86的指令系統(tǒng)數(shù)據(jù)傳送指令算術(shù)指令邏輯及位操作指令控制轉(zhuǎn)移指令串處理指令處理器指令

指令的分類一、邏輯運算指令二、位測試指令三、位掃描指令四、移位指令五、標(biāo)志位處理指令susujiang@匯編語言程序設(shè)計63邏輯及位操作指令一般形式:

AND dst,src ;dst←dst∧src OR dst,src ;dst←dst∨src XOR dst,src ;dst←dst⊕src NOT dst ;dst←?

dst TEST dst,src ;dst∧src,執(zhí)行AND操作但不存儲結(jié)果到dst。語法格式:

AND reg/mem,reg/mem/imm OR reg/mem,reg/mem/imm XOR reg/mem,reg/mem/imm NOT reg/mem TEST reg/mem,reg/mem/imm 說明: 以上指令均對操作數(shù)按位進行二進制邏輯運算,其中NOT指令不影響標(biāo)志位;其它指令根據(jù)結(jié)果設(shè)置標(biāo)志位PF、SF和ZF,AF無定義,CF和OF為0。通常在這些指令后使用條件轉(zhuǎn)移指令來控制程序的執(zhí)行順序。一、邏輯運算指令

邏輯運算的作用可以屏蔽某些位,使某些位內(nèi)容清0;可以置某些位為1;可以使某些位變反;XOR還可以判斷兩個操作數(shù)是否相等;可以測試某些位是否為0;susujiang@匯編語言程序設(shè)計64邏輯及位操作指令例1:已知(BH)=67H,要求把其的第0、1和5位置為0。

ANDBH,0DCH ;SF=0,PF=1,ZF=0例2:已知(BL)=46H,要求把其的第1、3、4和6位置為1。

ORBL,5AH ;SF=0,PF=0,ZF=0例3:已知(AL)=46H,執(zhí)行指令“NOT

AL”后,

AL的值是什么?

NOT

AL ;AL=0B9H例4:已知(AH)=46H,要求把其的第0、2、5和7位的 二進制值變反。

XOR

AH,0A5H ;SF=1,PF=0,ZF=0例5: TEST

AX,1

;測試AX的第0位

TEST

CL,10101B

;測試CL的第0、2、4位01000100susujiang@匯編語言程序設(shè)計65邏輯及位操作指令BT(BitTest)位測試BTS(BitTestandSet)位測試并置位BTR(BitTestandReset)位測試并復(fù)位BTC(BitTestandComplement)位測試并取反一般形式:

BT dst,index ;CF←

dst的第index位,dst不變

BTS dst,index ;CF←dst的第index位,dst的第index位=1 BTR dst,index ;CF←

dst的第index位,dst的第index位=0 BTC dst,index ;CF←dst的第index位,dst的第index位取反說明:這些指令均為386新增指令。 其中dst可以是Reg/Mem,index只能是Reg/Imm。二、位測試指令例1:假設(shè)(AX)=1234H,分別執(zhí)行下面指令。BT

AX,2

;指令執(zhí)行后,CF=1,(AX)=1234h

BTS

AX,14

;指令執(zhí)行后,CF=0,(AX)=5234h

BTR

AX,9

;指令執(zhí)行后,CF=1,(AX)=1034hBTC

AX,6

;指令執(zhí)行后,CF=0,(AX)=1274h例2: BTSEAX,16 ;測試EAX的第16位,并置為1。

BTCtab01,7 ;測試內(nèi)存單元的第7位,并取反。0001001000110100

↑14↑9↑6↑2CFsusujiang@匯編語言程序設(shè)計66邏輯及位操作指令三、位掃描指令BSF(BitScanforward)正向位掃描指令BSR(BitScanreverse)反向位掃描指令指令格式:

BSF

Reg,Reg/Mem

;從右向左掃描,即:從低位向高位掃描

BSR

Reg,Reg/Mem

;從左向右掃描,即:從高位向低位掃描受影響的標(biāo)志位:ZF說明:

是80386以后的指令。位掃描指令是在第二個操作數(shù)中找第一個“1”的位置。如果找到,則該“1”的位置保存在第一操作數(shù)中,并置標(biāo)志位ZF為0,否則,置標(biāo)志位ZF為1。例1:MOV

AX,1234H

BSF

CX,AX

;指令執(zhí)行后,(CX)=2,ZF=0

BSR

CX,AX

;指令執(zhí)行后,(CX)=12,ZF=0例2:MOVEAX,60000000H BSFECX,EAX ;執(zhí)行后,ECX=29D,ZF=0 BSREDX,EAX ;執(zhí)行后,EDX=30D,ZF=0susujiang@匯編語言程序設(shè)計67邏輯及位操作指令

1.移位指令

SHL(ShiftLogicalLeft)邏輯左移

SAL(ShiftArithmeticLeft)算術(shù)左移

SHR(ShiftLogicalRight)邏輯右移

SAR(ShiftArithmeticRight)算術(shù)右移一般形式:

SHL dst,count ;dst左移。count為移位次數(shù)(下同)

SAL dst,count ;同SHL,最高位移出到CF,最低位移入0 SHR dst,count ;dst邏輯右移,最低位移入CF,最高位移入0 SAR dst,count ;dst算術(shù)右移,最低位移入CF,最高位不變。語法格式:

SHL reg/mem,CL/imm8 ;imm8表示8位立即數(shù)范圍0~31。

SAL、SHR與SAR格式同SHL說明:指令SHL與SAL完全相同,只是同一指令的不同助記符而已。

可用CL來指出要移位的次數(shù);8086中只能用CL或立即數(shù)1。對標(biāo)志位的影響:若移位后符號位發(fā)生了變化,則OF=1,否則OF=0;CF為最后移入位; 按一般規(guī)則影響ZF與SF;AF無定義。四、移位指令susujiang@匯編語言程序設(shè)計68邏輯及位操作指令操作數(shù)的初值執(zhí)行的指令執(zhí)行后操作數(shù)的內(nèi)容(AH)=12HSAL

AH,1(AH)=24H(BL)=0A9HSAL

BL,1(BL)=52H(AH)=12HSAR

AH,1(AH)=09H(BL)=0A9HSAR

BL,1(BL)=0D4H例:設(shè)AX的值為一個2字節(jié)非壓縮BCD碼,將其轉(zhuǎn)換為1字節(jié)壓縮BCD碼存入AL。

MOV CL,4 SHL AH,CL ;AH低4位移到高4位

AND AL,0FH ;AL高4位清0 OR AL,AH 例:(AH)=12HSHR

AH,1(AH)=09H(BL)=0A9HSHR

BL,1(BL)=54Hsusujiang@匯編語言程序設(shè)計69邏輯及位操作指令2.循環(huán)移位指令

ROL(RotateLeft)循環(huán)左移

ROR(RotateRight)循環(huán)右移

RCL(RotateLeftthroughCarry)帶進位循環(huán)左移

RCR(RotateRightthroughCarry)帶進位循環(huán)右移一般形式:

ROL dst,count ;dst循環(huán)左移,最高位移出到CF,并同時移入最低位。

ROR dst,count ;dst循環(huán)右移,最低位移出到CF,并同時移入最高位。

RCL dst,count ;dst帶CF循環(huán)左移,最高位移出到CF,原CF移入最低位。

RCR dst,count ;dst帶CF循環(huán)右移,最低位移出到CF,原CF移入最高位。語法格式:

ROL reg/mem,CL/imm8 ;ROR、RCL、RCR格式同ROL對標(biāo)志位的影響: 若移位后符號位發(fā)生了變化,則OF=1,否則OF=0;若移位次數(shù)>1, 則OF無定義。CF為最后移入位;不影響ZF與SF;AF無定義。susujiang@匯編語言程序設(shè)計70邏輯及位操作指令循環(huán)移位指令指令操作數(shù)的初值指令執(zhí)行后的結(jié)果ROL

AX,1(AX)=6789H(AX)=0CF12HROL

AX,3(AX)=6789H(AX)=3C4BHROR

AX,2(AX)=6789H(AX)=59E2HROR

AX,4(AX)=6789H(AX)=9678H例1:將DX:AX中的32位數(shù)左移1位。

SHL AX,1 RCL DX,1例2:例3:帶進位循環(huán)移位指令指令操作數(shù)的初值指令執(zhí)行后的結(jié)果RCL

AX,1CF=0,(AX)=0ABCDH(AX)=579AHRCL

AX,1CF=1,(AX)=0ABCDH(AX)=579BHRCR

AX,2CF=0,(AX)=0ABCDH(AX)=AAF3HRCR

AX,2CF=1,(AX)=0ABCDH(AX)=EAF3Hsusujiang@匯編語言程序設(shè)計71邏輯及位操作指令3.雙精度移位指令SHLD(ShiftLeftDouble)雙精度左移SHRD(ShiftRightDouble)雙精度右移指令格式:

SHLD

Reg/Mem,Reg,CL/Imm

;80386+ SHRD

Reg/Mem,Reg,CL/Imm

;80386+說明:第一操作數(shù)是一個16位/32位的寄存器或存儲單元;第二操作數(shù)(與前者具 有相同位數(shù))一定是寄存器,提供補充位,本身不變化;第三操作數(shù)是移 動的位數(shù),它可由CL或一個立即數(shù)來確定。雙精度移位指令指令操作數(shù)的初值指令執(zhí)行后的結(jié)果SHLD

AX,BX,1(AX)=1234H,(BX)=8765H(AX)=2469HSHLD

AX,BX,3(AX)=1234H,(BX)=8765H(AX)=91A4HSHRD

AX,BX,2(AX)=1234H,(BX)=8765H(AX)=448DHSHRD

AX,BX,4(AX)=1234H,(BX)=8765H(AX)=5123H受影響的標(biāo)志位:CF、PF、SF和ZF;移位1次時若符號位有變化則OF=1, 否則OF=0,當(dāng)移位次數(shù)>1時OF無定義;AF無定義。susujiang@匯編語言程序設(shè)計72標(biāo)志位處理指令CLC(ClearCarryFlag)進位標(biāo)志清除指令STC(SetCarryFlag)進位標(biāo)志置1指令CMC(ComplementCarryFlag)進位標(biāo)志取反指令CLD(ClearDirectionFlag)方向標(biāo)志清除指令STD(SetDirectionFlag)方向標(biāo)志置1指令CLI(ClearInterruptFlag)關(guān)中斷指令STI(SetInterruptFlag)開中斷指令指令格式:

CLC ;CF=0 STC ;CF=1 CMC ;CF=?CF CLD ;DF=0 STD ;DF=1 CLI ;IF=0 STI ;IF=1對標(biāo)志位的影響:只影響指定標(biāo)志。注意:在程序中應(yīng)慎重使用CLI指令,錯誤的使用會導(dǎo)致系統(tǒng)無法正常工作。susujiang@匯編語言程序設(shè)計7380x86的指令系統(tǒng)數(shù)據(jù)傳送指令算術(shù)指令邏輯及位操作指令控制轉(zhuǎn)移指令

串處理指令處理器指令susujiang@匯編語言程序設(shè)計74控制轉(zhuǎn)移指令用于控制程序的執(zhí)行順序和執(zhí)行流程的指令:無條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令條件設(shè)置指令循環(huán)指令子程序調(diào)用指令中斷指令

在高級語言中,時常有“盡量不要使用轉(zhuǎn)移語句”的勸告,但如果在匯編語言的程序中也盡量不用轉(zhuǎn)移語句,那么該程序要么無法編寫,要么沒有多少功能,所以,在匯編語言中,不但要使用轉(zhuǎn)移指令,而且還要靈活運用,因為指令系統(tǒng)中有大量的轉(zhuǎn)移指令。susujiang@匯編語言程序設(shè)計75控制轉(zhuǎn)移指令一、無條件轉(zhuǎn)移指令一般形式:

JMP Label/Reg/Mem ;轉(zhuǎn)移到操作數(shù)指定的目標(biāo)地址處對標(biāo)志位的影響:無。功能說明:

根據(jù)轉(zhuǎn)移的距離,JMP指令可分為下列兩類:段內(nèi)轉(zhuǎn)移:在同一代碼段內(nèi)進行,包括短(Short,移量在[-128~

127]范圍內(nèi))和近(Near,偏移量在[-32K~32K]范圍內(nèi))轉(zhuǎn) 移,只要修改IP的值即可實現(xiàn)。段間轉(zhuǎn)移:可在不同代碼段之間進行,又稱遠(yuǎn)(Far)轉(zhuǎn)移,需要同

溫馨提示

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

最新文檔

評論

0/150

提交評論