32位匯編語(yǔ)言程序設(shè)計(jì) 第3版 課件 第3、4章 通數(shù)據(jù)處理指令、程序結(jié)構(gòu)_第1頁(yè)
32位匯編語(yǔ)言程序設(shè)計(jì) 第3版 課件 第3、4章 通數(shù)據(jù)處理指令、程序結(jié)構(gòu)_第2頁(yè)
32位匯編語(yǔ)言程序設(shè)計(jì) 第3版 課件 第3、4章 通數(shù)據(jù)處理指令、程序結(jié)構(gòu)_第3頁(yè)
32位匯編語(yǔ)言程序設(shè)計(jì) 第3版 課件 第3、4章 通數(shù)據(jù)處理指令、程序結(jié)構(gòu)_第4頁(yè)
32位匯編語(yǔ)言程序設(shè)計(jì) 第3版 課件 第3、4章 通數(shù)據(jù)處理指令、程序結(jié)構(gòu)_第5頁(yè)
已閱讀5頁(yè),還剩144頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第3章通用數(shù)據(jù)處理指令3.1數(shù)據(jù)傳送類指令3.2算術(shù)運(yùn)算類指令3.3位操作類指令第3章通用數(shù)據(jù)處理指令熟悉IA-32處理器通用的基本指令:數(shù)據(jù)傳送指令、算術(shù)運(yùn)算指令邏輯運(yùn)算和移位操作指令掌握指令功能和編程應(yīng)用3學(xué)習(xí)指令的注意事項(xiàng)指令的功能——該指令能夠?qū)崿F(xiàn)何種操作。通常指令助記符就是指令功能的英文單詞或其縮寫(xiě)形式指令支持的尋址方式——該指令中的操作數(shù)可以采用何種尋址方式指令對(duì)標(biāo)志的影響——該指令執(zhí)行后是否對(duì)各個(gè)標(biāo)志位有影響,以及如何影響其他方面——該指令其他需要特別注意的地方,如指令執(zhí)行時(shí)的約定設(shè)置、必須預(yù)置的參數(shù)、隱含使用的寄存器等43.1數(shù)據(jù)傳送類指令數(shù)據(jù)傳送把數(shù)據(jù)從一個(gè)位置傳送到另一個(gè)位置計(jì)算機(jī)中最基本的操作程序設(shè)計(jì)中最常使用的指令除標(biāo)志寄存器傳送指令外,均不影響標(biāo)志位全面而準(zhǔn)確地理解每條指令的功能和應(yīng)用是編寫(xiě)匯編語(yǔ)言程序的關(guān)鍵也是理解處理器如何進(jìn)行數(shù)據(jù)處理的核心53.1.1通用數(shù)據(jù)傳送指令提供方便靈活的通用數(shù)據(jù)傳送操作主要有傳送MOV和交換XCHG指令源操作數(shù)src目的操作數(shù)dest30H30H被傳送的數(shù)據(jù)MOV指令的功能61.傳送指令MOV(move)MOVreg/mem,immMOVreg/mem/seg,regMOVreg/seg,memMOVr16/m16,seg把一個(gè)字節(jié)、字或雙字的操作數(shù) 從源位置傳送至目的位置段寄存器通用寄存器立即數(shù)主存儲(chǔ)器禁止7IA-32指令支持3種數(shù)據(jù)長(zhǎng)度8位(字節(jié))數(shù)據(jù),byte類型

moval,20016位(字)數(shù)據(jù),word類型

mov

ax,[ebx]32位(雙字)數(shù)據(jù),dword類型

mov

eax,[dvar]32位通用寄存器:EAXEBXECX…16位通用寄存器:AXBXCXDX…8位通用寄存器:AHALBHBL…16位段寄存器:DSCSSSES…

8寄存器reg 為目的操作數(shù)

moval,200 ;8位立即數(shù)i8

movax,200 ;16位立即數(shù)i16

moveax,200 ;32位立即數(shù)i32立即數(shù)傳送MOVreg/mem,imm存儲(chǔ)器mem 為目的操作數(shù)

mov[bvar],byte

ptr200 ;8位立即數(shù)i8

mov[ebx],word

ptr200 ;16位立即數(shù)i16

mov[esi+8],dwordptr200 ;32位立即數(shù)i329MOVreg/mem/seg,reg存儲(chǔ)器mem 為目的操作數(shù)

mov[bvar],cl ;8位通用寄存器r8

mov[ebx],cx ;16位通用寄存器r16

mov[esi+8],edi ;32位通用寄存器r32寄存器傳送寄存器reg 為目的操作數(shù)

mov

al,ah ;8位通用寄存器r8

mov

ax,bx ;16位通用寄存器r16

mov

eax,edx ;32位通用寄存器r32段寄存器seg為目的操作數(shù)

mov

ds,bx10存儲(chǔ)器傳送MOVreg/seg,mem寄存器reg 為目的操作數(shù)

mov

dl,[bvar] ;8位儲(chǔ)存器m8

mov

dx,[ebx] ;16位存儲(chǔ)器m16

mov

edx,dvar[edi] ;32位存儲(chǔ)器m32段寄存器seg 為目的操作數(shù)

mov

ds,[wvar] ;16位存儲(chǔ)器m16

mov

es,[ebx] ;16位存儲(chǔ)器m16

movss,[ebp+8] ;16位存儲(chǔ)器m1611(16位)段寄存器傳送MOVr16/m16,seg寄存器r16 為目的操作數(shù)

mov

ax,ds

mov

dx,es

mov

si,fs

mov

di,gs存儲(chǔ)器m16 為目的操作數(shù)

mov[wvar],ds

mov[ebx],ss

mov[esi-8],cs

mov[ebp+8],cs12傳送指令MOV把一個(gè)字節(jié)、字或雙字的操作數(shù)從源位置傳送至目的位置MOVreg/mem,immMOVreg/mem/seg,regMOVreg/seg,memMOVreg/mem,seg并非任意傳送!無(wú)法翻譯就出錯(cuò)!段寄存器通用寄存器立即數(shù)主存儲(chǔ)器禁止13注意1:雙操作數(shù)必須類型一致MOVESI,DL ;錯(cuò)誤:類型不一致

;ESI為32位寄存器,DL為8位寄存器

movesi,edx ;正確:兩個(gè)32位寄存器傳送MOVAL,050AH ;錯(cuò)誤:類型不一致

;050AH超過(guò)了寄存器AL范圍

moveax,050ah ;正確:雙字量數(shù)據(jù)傳送14注意2:操作數(shù)必須有明確的類型MOV[EBX],255

;錯(cuò)誤:無(wú)明確類型

movbyteptr[ebx],255 ;正確:BYTEPTR說(shuō)明是字節(jié)操作

movwordptr[ebx],255 ;正確:WORDPTR說(shuō)明是字操作

movdwordptr[ebx],255 ;正確:DWORDPTR說(shuō)明是雙字操作15注意3:雙操作數(shù)不允許都是主存單元

;假設(shè)dbuf1和dbuf2是兩個(gè)雙字變量MOV[DBUF2],[DBUF1] ;錯(cuò)誤:兩個(gè)操作數(shù)都是存儲(chǔ)單元

moveax,[dbuf1] ;正確:EAX=DBUF1(將DBUF1內(nèi)容送EAX)

mov[dbuf2],eax

;正確:DBUF2=EAX(將EAX內(nèi)容送DBUF2)16注意4:不可隨意操作專用寄存器MOVDS,@DATA ;錯(cuò)誤:立即數(shù)不能直接傳送段寄存器

;(@DATA是數(shù)據(jù)段地址)

mov

ax,@data

mov

ds,ax ;正確:通過(guò)AX間接傳送給DS172.交換指令XCHG將源操作數(shù)和目的操作數(shù)內(nèi)容交換

XCHGreg,reg/mem

XCHGreg/mem,reg通用寄存器與通用寄存器之間通用寄存器或存儲(chǔ)器之間空操作指令NOP(=XCHGEAX,EAX)處理器執(zhí)行空操作該指令,需要化費(fèi)時(shí)間,在主存中也要占用一個(gè)字節(jié)空間實(shí)現(xiàn)短時(shí)間延時(shí)臨時(shí)占用代碼空間xchg

esi,edixchg

esi,[edi]xchg

al,[var]183.1.2堆棧操作指令“先進(jìn)后出FILO”存取的存儲(chǔ)區(qū)域,只有一個(gè)數(shù)據(jù)出入口,即當(dāng)前棧頂(不斷變化)兩種基本操作數(shù)據(jù)壓進(jìn)堆棧PUSH數(shù)據(jù)彈出堆棧操作POPSS指向堆棧段的起始位置ESP指定棧頂數(shù)據(jù)進(jìn)入堆棧,ESP逐漸減小數(shù)據(jù)依次彈出、ESP逐漸增大Word1Word2Word3Word4Word5StackPUSHPOP示意圖19IA-32處理器堆棧操作返回201.進(jìn)棧指令PUSH

PUSHr16/m16/i16/seg ①ESP=ESP-2②SS:[ESP]=r16/m16/i16/seg

PUSHr32/m32/i32 ①ESP=ESP-4②SS:[ESP]=r32/m32/i32先將ESP減小作為當(dāng)前棧頂后將源操作數(shù)(立即數(shù)、通用寄存器和段寄存器內(nèi)容或存儲(chǔ)器操作數(shù))傳送到當(dāng)前棧頂以字或雙字為單位操作進(jìn)棧雙字量數(shù)據(jù)時(shí),ESP減4進(jìn)棧字量數(shù)據(jù)時(shí),ESP減2pusheax示意圖21進(jìn)棧操作返回222.出棧指令POP POPr16/m16/seg ①r16/m16/seg=SS:[ESP]②ESP=ESP+2

POPr32/m32 ①r32/m32=SS:[ESP]②ESP=ESP+4

先將棧頂數(shù)據(jù)傳送到目的操作數(shù)(通用寄存器、存儲(chǔ)單元或段寄存器)后ESP增加作為當(dāng)前棧頂以字或雙字為單位操作出棧雙字量數(shù)據(jù)時(shí),ESP加4出棧字量數(shù)據(jù)時(shí),ESP加2popeax示意圖23出棧操作返回24〔例3-1〕堆棧操作程序

;數(shù)據(jù)段ten equ10dvar dd67762000h,12345678h ;代碼段

moveax,[dvar+4]

;EAX=12345678H

pusheax

;將EAX內(nèi)容壓入堆棧

pushdwordptrten

;將立即數(shù)以雙字量壓入堆棧

pushdwordptr[dvar] ;變量DVAR第一個(gè)數(shù)據(jù)入堆

popeax

;棧頂數(shù)據(jù)彈出到EAX

popdwordptr[dvar+4] ;棧頂數(shù)據(jù)彈出到DVAR+4

movebx,[dvar+4]

;EBX=000000AH

popecx

;棧頂數(shù)據(jù)彈出到ECX253.堆棧的應(yīng)用堆棧不可或缺,被很多指令使用:堆棧操作指令子程序調(diào)用CALL和返回RET,中斷調(diào)用INT和返回IRET等內(nèi)部異常、外部中斷等也利用堆棧堆??捎脕?lái)臨時(shí)存放數(shù)據(jù),以便隨時(shí)恢復(fù)它們常利用堆?;分羔楨BP,隨機(jī)讀寫(xiě)堆棧數(shù)據(jù)利用堆棧實(shí)現(xiàn)主、子程序間傳遞參數(shù)堆棧還常用于子程序的寄存器保護(hù)和恢復(fù)注意入棧和出棧的數(shù)據(jù)要成對(duì),保持堆棧平衡263.1.3其他傳送指令針對(duì)特定需要設(shè)計(jì)的專用傳送指令地址傳送指令換碼指令標(biāo)志傳送指令……PUSHADPOPADPUSHFDPOPFD……LEA

LDSLES……XLATCLCSTCCMC……271.地址傳送指令地址傳送指令獲取存儲(chǔ)器操作數(shù)的地址LEAr16/r32,mem

;r16/r32←mem的有效地址EA(不需類型一致)LEA指令類似的地址操作符OFFSET的作用LEA指令在指令執(zhí)行時(shí)計(jì)算出偏移地址OFFSET操作符在匯編階段取得變量的偏移地址OFFSET無(wú)需在執(zhí)行時(shí)計(jì)算、指令執(zhí)行速度更快LEA指令能獲取匯編階段無(wú)法確定的偏移地址leaesi,varmov

edi,offsetvar28〔例3-2〕地址傳送程序

;數(shù)據(jù)段dvar dd41424344h ;代碼段

moveax,[dvar]

;EAX=41424344H

leaesi,dvar

;ESI指向DVAR

movebx,[esi]

;EBX=41424344H

movedi,offsetdvar

;EDI指向DVAR

movecx,[edi]

;ECX=41424344H

leaedx,[esi+edi*4+100h]

;EDX=ESI+EDI×4+100H292.換碼指令XLAT指令功能:AL←[EBX+AL]將EBX指定的緩沖區(qū)中AL指定的位移處的一個(gè)字節(jié)數(shù)據(jù)取出賦給AL換碼指令執(zhí)行前:在主存建立一個(gè)字節(jié)量表格,內(nèi)含要目的代碼表格首地址存放于EBXAL存放相對(duì)表格首地址的位移量換碼指令執(zhí)行后:將AL寄存器的內(nèi)容轉(zhuǎn)換為目標(biāo)代碼xlat30〔例3-3〕換碼顯示程序-1

;數(shù)據(jù)段num db6,7,7,8,3,0,0,0 ;被轉(zhuǎn)換數(shù)字 countequ$-num ;count等于數(shù)字個(gè)數(shù)tab db'0123456789' ;代碼表 ;代碼段 movecx,count movesi,offsetnum movebx,offsettab ;EBX指向代碼表again: moval,[esi] ;AL=要轉(zhuǎn)換的數(shù)字

xlat ;換碼

calldispc ;顯示

addesi,1 ;指向下一個(gè)數(shù)字

loopagain ;循環(huán)使用XLAT指令31〔例3-3〕換碼顯示程序-2 ;代碼段 movecx,count movesi,offsetnum movebx,offsettab ;EBX指向代碼表again: moveax,0 ;EAX=0

moval,[esi] ;AL=要轉(zhuǎn)換的數(shù)字

addeax,ebx ;EAX=EAX+EBX,指向?qū)?yīng)的字符

moval,[eax] ;換碼

calldispc ;顯示

addesi,1 ;指向下一個(gè)數(shù)字

loopagain ;循環(huán)不使用XLAT指令32〔例3-3〕換碼顯示程序-3 ;代碼段 movecx,count movesi,offsetnumagain: moveax,0 ;EAX=0

moval,[esi] ;AL=要轉(zhuǎn)換的數(shù)字

moval,tab[eax] ;換碼

calldispc ;顯示

addesi,1 ;指向下一個(gè)數(shù)字

loopagain ;循環(huán)寄存器相對(duì)尋址67783000運(yùn)行結(jié)果333.標(biāo)志傳送指令直接操作標(biāo)志寄存器標(biāo)志位操作指令:直接改變CF、DF、IF標(biāo)志指令功能CLC復(fù)位進(jìn)位標(biāo)志:CF←0STC置位進(jìn)位標(biāo)志:CF←1CMC求反進(jìn)位標(biāo)志:原為0變?yōu)?,原為1變?yōu)?CLD復(fù)位方向標(biāo)志:DF←0,串操作后地址增大STD置位方向標(biāo)志:DF←1,串操作后地址減小CLI復(fù)位中斷標(biāo)志:IF←0,禁止可屏蔽中斷STI置位中斷標(biāo)志:IF←1,允許可屏蔽中斷343.2算術(shù)運(yùn)算類指令算術(shù)運(yùn)算對(duì)數(shù)據(jù)進(jìn)行加減乘除基本的數(shù)據(jù)處理方法加減運(yùn)算有“和”或“差”的結(jié)果外,還有進(jìn)借位、溢出等狀態(tài)標(biāo)志,也是結(jié)果的一部分注意算術(shù)運(yùn)算類指令對(duì)標(biāo)志的影響掌握:加法和減法指令熟悉:乘法和除法指令理解:零位擴(kuò)展和符號(hào)擴(kuò)展+-*/+-×÷353.2.1狀態(tài)標(biāo)志狀態(tài)標(biāo)志是處理器最基本的標(biāo)志一方面:作為加減運(yùn)算和邏輯運(yùn)算的輔助結(jié)果另一方面:構(gòu)成各種條件,實(shí)現(xiàn)程序分支8086的標(biāo)志OF111512DF10IF9TF8SF7ZF605AF403PF211CF036進(jìn)位標(biāo)志CF(CarryFlag)當(dāng)加減運(yùn)算結(jié)果的最高有效位有進(jìn)位(加法)或借位(減法)時(shí),進(jìn)位標(biāo)志置1,即CF=1;否則CF=0針對(duì)無(wú)符號(hào)整數(shù),判斷加減結(jié)果是否超出表達(dá)范圍N個(gè)二進(jìn)制位表達(dá)無(wú)符號(hào)整數(shù)的范圍:0~2N-18位:0~+25516位:0~+6553532位:0~+232-137進(jìn)位標(biāo)志CF:舉例8位二進(jìn)制數(shù)相加:

00111010+01111100=10110110十六進(jìn)制表達(dá):3A+7C=B6轉(zhuǎn)換成十進(jìn)制數(shù):58+124=182沒(méi)有產(chǎn)生進(jìn)位:CF=08位二進(jìn)制數(shù)相加:

10101010+01111100=[1]00100110十六進(jìn)制表達(dá):AA+7C=[1]26轉(zhuǎn)換成十進(jìn)制數(shù):170+124=294=256+38產(chǎn)生進(jìn)位:CF=10<182<255進(jìn)位1表達(dá)25638溢出標(biāo)志OF(OverflowFlag)有符號(hào)數(shù)加減結(jié)果有溢出,則OF=1;否則OF=0針對(duì)有符號(hào)整數(shù),判斷加減結(jié)果是否超出表達(dá)范圍N個(gè)二進(jìn)制位(補(bǔ)碼)表達(dá)有符號(hào)整數(shù)的范圍:-2N-1~2N-1-18位:-128~+12716位:-32768~+3276732位:-231~+231-1杯中水已滿,再加就溢出!39溢出標(biāo)志OF:舉例8位二進(jìn)制數(shù)相加:

00111010+01111100=10110110十六進(jìn)制表達(dá):3A+7C=B6轉(zhuǎn)換成十進(jìn)制數(shù):58+124=182超出范圍:OF=18位二進(jìn)制數(shù)相加:

10101010+01111100=[1]00100110十六進(jìn)制表達(dá):AA+7C=[1]26轉(zhuǎn)換成十進(jìn)制數(shù):-86+124=38沒(méi)有超出范圍:OF=0182>127補(bǔ)碼AAH表達(dá)-8640進(jìn)位和溢出的區(qū)別進(jìn)位標(biāo)志反映無(wú)符號(hào)整數(shù)運(yùn)算結(jié)果是否超出范圍有進(jìn)位,加上進(jìn)位或借位后運(yùn)算結(jié)果仍然正確溢出標(biāo)志反映有符號(hào)整數(shù)運(yùn)算結(jié)果是否超出范圍有溢出,運(yùn)算結(jié)果已經(jīng)不正確處理器按照無(wú)符號(hào)整數(shù)求得結(jié)果設(shè)置進(jìn)位標(biāo)志CF設(shè)置溢出標(biāo)志OF程序員決定操作數(shù)是無(wú)符號(hào)數(shù),關(guān)心進(jìn)位操作數(shù)是有符號(hào)數(shù),注意溢出41溢出標(biāo)志的判斷處理器硬件判斷規(guī)則最高位和次高位同時(shí)有進(jìn)位或同時(shí)無(wú)進(jìn)位,無(wú)溢出;最高位和次高位進(jìn)位狀態(tài)不同,有溢出人工判斷的簡(jiǎn)單規(guī)則只有當(dāng)兩個(gè)相同符號(hào)數(shù)相加(含兩個(gè)不同符號(hào)數(shù)相減),而運(yùn)算結(jié)果的符號(hào)與原數(shù)據(jù)符號(hào)相反時(shí),產(chǎn)生溢出;其他情況下,不會(huì)產(chǎn)生溢出

00111010+01111100

10110110正數(shù)正數(shù)負(fù)數(shù)最高位次高位42零標(biāo)志ZF(ZeroFlag)運(yùn)算結(jié)果為0,則ZF=1,否則ZF=0結(jié)果是0,ZF標(biāo)志不是0!舉例8位二進(jìn)制數(shù)相加:

00111010+01111100=10110110

結(jié)果不是0,ZF=08位二進(jìn)制數(shù)相加:

10000100+01111100=[1]00000000

結(jié)果是0,ZF=1結(jié)果進(jìn)位43符號(hào)標(biāo)志SF(SignFlag)運(yùn)算結(jié)果最高位為1,則SF=1;否則SF=0舉例8位二進(jìn)制數(shù)相加:

00111010+01111100=10110110

最高位=1:SF=18位二進(jìn)制數(shù)相加:

10000100+01111100=[1]00000000

最高位=0:SF=0結(jié)果進(jìn)位最高位=符號(hào)位=SF44奇偶標(biāo)志PF(ParityFlag)當(dāng)運(yùn)算結(jié)果最低字節(jié)中“1”的個(gè)數(shù)為零或偶數(shù)時(shí),PF=1;否則PF=0舉例8位二進(jìn)制數(shù)相加:

00111010+01111100=10110110

“1”的個(gè)數(shù)為5個(gè):PF=08位二進(jìn)制數(shù)相加:

10000100+01111100=[1]00000000

“1”的個(gè)數(shù)為0個(gè):PF=1結(jié)果進(jìn)位僅最低8位“1”的個(gè)數(shù)453.2.2加法指令加法指令

ADD帶進(jìn)位加法指令

ADC增量指令I(lǐng)NC除INC不影響進(jìn)位標(biāo)志CF外其他指令按定義影響全部狀態(tài)標(biāo)志位按照運(yùn)算結(jié)果相應(yīng)設(shè)置各個(gè)狀態(tài)標(biāo)志為0或?yàn)?數(shù)據(jù)傳送類指令不影響(=不改變)狀態(tài)標(biāo)志加法和減法指令根據(jù)結(jié)果按定義改變狀態(tài)標(biāo)志461.加法指令A(yù)DD目的操作數(shù)加上源操作數(shù),和送到目的操作數(shù)

ADDreg,imm/reg/mem ;reg←reg+imm/reg/mem

ADDmem,imm/reg ;mem←mem+imm/reg按照定義影響6個(gè)狀態(tài)標(biāo)志位moveax,0aaff7348h ;EAX=AAFF7348Haddal,27h;EAX=AAFF736FH,OF=0,SF=0,ZF=0,PF=1,CF=0addax,3fffh;EAX=AAFFB36EH,OF=1,SF=1,ZF=0,PF=0,CF=0addeax,88000000h;EAX=32FFB36EH,OF=1,SF=0,ZF=0,PF=0,CF=1472.帶進(jìn)位加法指令A(yù)DC兩個(gè)操作數(shù)相加,再加CF,結(jié)果送目的操作數(shù)ADCreg,imm/reg/mem ;reg←reg+imm/reg/mem+CFADCmem,imm/reg ;mem←mem+imm/reg+CF用于與ADD指令相結(jié)合實(shí)現(xiàn)多精度數(shù)的加法先將兩個(gè)操作數(shù)的低32位相加(用ADD指令)再加高位部分、并將進(jìn)位加到高位(用ADC指令)〔例3-4〕64位數(shù)據(jù)相加程序mov

eax,dword

ptr[qvar1] ;取低32位add

eax,dword

ptr[qvar2] ;加低32位,設(shè)置CFmov

edx,dword

ptr[qvar1+4] ;取高32位adc

edx,dword

ptr[qvar2+4] ;加高32位,同時(shí)加CF483.增量指令I(lǐng)NC只有一個(gè)操作數(shù):寄存器或存儲(chǔ)單元對(duì)操作數(shù)加1(增量)再將結(jié)果返回原處INCreg/mem

;加1:reg/mem←reg/mem+1用于計(jì)數(shù)器和地址指針的調(diào)整不影響進(jìn)位CF標(biāo)志,影響其他狀態(tài)標(biāo)志位例如incecxincdword

ptr[ebx]incword

ptr[wvar]493.2.3減法指令減法指令SUB帶借位減法指令SBB減量指令DEC求補(bǔ)指令

NEG比較指令CMP除DEC不影響CF標(biāo)志外其他按定義影響全部狀態(tài)標(biāo)志位數(shù)據(jù)傳送類指令不影響(=不改變)狀態(tài)標(biāo)志加法和減法指令根據(jù)結(jié)果按定義改變狀態(tài)標(biāo)志501.減法指令SUB目的操作數(shù)減去源操作數(shù),差送到目的操作數(shù)

SUBreg,imm/reg/mem ;reg←reg-imm/reg/mem

SUBmem,imm/reg ;mem←mem-imm/reg按照定義影響6個(gè)狀態(tài)標(biāo)志位

moveax,0aaff7348h

;EAX=AAFF7348H

subal,27h;EAX=AAFF7321H,OF=0,SF=0,ZF=0,PF=1,CF=0

subax,3fffh;EAX=AAFF3322H,OF=0,SF=0,ZF=0,PF=1,CF=0

subeax,0bb000000h;EAX=EFFF3322H,OF=0,SF=1,ZF=0,PF=1,CF=1512.帶借位減法指令SBB目的操作數(shù)減去源操作數(shù),再減CF,結(jié)果送目的操作數(shù)SBBreg,imm/reg/mem ;reg←reg-imm/reg/mem-CFSBBmem,imm/reg ;mem←mem-imm/reg-CF用于與SUB指令相結(jié)合實(shí)現(xiàn)多精度數(shù)的減法先將兩個(gè)操作數(shù)的低32位相減(用SUB指令)然后減高位部分、并減去借位(用SBB指令)523.減量指令DEC只有一個(gè)操作數(shù):寄存器或存儲(chǔ)單元對(duì)操作數(shù)減1(減量)再將結(jié)果返回原處

DECreg/mem

;減1:reg/mem←reg/mem-1用于計(jì)數(shù)器和地址指針的調(diào)整不影響進(jìn)位CF標(biāo)志,影響其他狀態(tài)標(biāo)志位例如dec

cxdecbyteptr[ebx]decwordptr[wvar]53〔例3-5〕大小寫(xiě)字母轉(zhuǎn)換程序

;數(shù)據(jù)段msg byte'welcome',0 countequ$-msg ;count等于字符個(gè)數(shù) ;代碼段

mov

ecx,count-1 ;ECX等于字符串長(zhǎng)度

movebx,0 ;EBX=0指向頭一個(gè)字母again: submsg[ebx],'a'-'A' ;小寫(xiě)字母減20H轉(zhuǎn)換為大寫(xiě)

incebx ;指向下一個(gè)字母

cmpebx,ecx ;指向下一個(gè)字母

jbeagain ;循環(huán)大寫(xiě)=小寫(xiě)-20H小寫(xiě)=大寫(xiě)+20H544.求補(bǔ)指令NEG對(duì)操作數(shù)執(zhí)行求補(bǔ)運(yùn)算,即用零減去操作數(shù)

NEGreg/mem ;reg/mem←0-reg/mem對(duì)標(biāo)志的影響與用零作減法的SUB指令一樣可用于對(duì)負(fù)數(shù)求補(bǔ)碼或由補(bǔ)碼求其絕對(duì)值movax,0ff64hnegal

;AX=FF9CH,OF=0,SF=1,ZF=0,PF=1,CF=1subal,9dh ;AX=FFFFH,OF=0,SF=1,ZF=0,PF=1,CF=1negax

;AX=0001H,OF=0,SF=0,ZF=0,PF=0,CF=1decal

;AX=0000H,OF=0,SF=0,ZF=1,PF=1,CF=1negax

;AX=0000H,OF=0,SF=0,ZF=1,PF=1,CF=0555.比較指令CMP將目的操作數(shù)減去源操作數(shù),差值不回送目的操作數(shù),按照減法結(jié)果影響狀態(tài)標(biāo)志

CMPreg,imm/reg/mem ;reg-imm/reg/mem

CMPmem,imm/reg ;mem-imm/reg根據(jù)標(biāo)志狀態(tài)獲知兩個(gè)操作數(shù)的大小關(guān)系給條件轉(zhuǎn)移等指令使用其形成的狀態(tài)標(biāo)志SUB與CMP?ADD與ADC?INC與DEC?SUB與SBB?ADD與SUB?ADC與SBB?DEC與NEG?563.2.4乘法和除法指令I(lǐng)A-32處理器的乘法和除法指令比較特殊針對(duì)無(wú)符號(hào)數(shù)和有符號(hào)數(shù)有各自的指令有符號(hào)數(shù)指令前用I(sIgned)表示隱含使用EAX(和EDX)寄存器加減指令只進(jìn)行無(wú)符號(hào)數(shù)運(yùn)算利用CF和OF區(qū)別無(wú)符號(hào)數(shù)和有符號(hào)數(shù)571.乘法指令無(wú)符號(hào)數(shù)乘法指令MUL有符號(hào)數(shù)乘法指令I(lǐng)MUL計(jì)算二進(jìn)制數(shù)乘法:A5H×64H用MUL指令作無(wú)符號(hào)數(shù)乘法:4074H(=16500)=A5H(=165)×64H(=100)用IMUL指令作有符號(hào)數(shù)乘法:DC74H(=-9100)=A5H(=-91)×64H(=100)58乘法指令指令類型操作數(shù)組合及功能舉例無(wú)符號(hào)數(shù)乘法MULsrcAX=AL×r8/m8DX.AX=AX×r16/m16EDX.EAX=EAX×r32/m32mulblimulbxmuldwordptr[dvar]有符號(hào)數(shù)乘法IMULsrc雙操作數(shù)乘法IMULdest,srcr16=r16×r16/m16/i8/i16r32=r32×r32/m32/i8/i32imuleax,10imulebx,ecx三操作數(shù)乘法IMULdest,src,immr16=r16/m16×i8/i16r32=r32/m32×i8/i32imulax,bx,-2imuleax,dwordptr[esi+8],5592.除法指令無(wú)符號(hào)除法指令DIV有符號(hào)除法指令I(lǐng)DIV除法指令可能產(chǎn)生除法溢出對(duì)DIV指令,除數(shù)為0,或者在字節(jié)除時(shí)商超過(guò)8位,在字除時(shí)商超過(guò)16位,或者雙字除時(shí)超過(guò)32位,則發(fā)生除法溢出對(duì)IDIV指令,除數(shù)為0,或者在字節(jié)除時(shí)商不在-128~127范圍內(nèi),在字除時(shí)商不在-32768~32767范圍內(nèi),或者在雙字除時(shí)商不在-231~231-1范圍內(nèi),則發(fā)生除法溢出除法錯(cuò)溢出,將產(chǎn)生編號(hào)為0的內(nèi)部中斷60除法指令指令操作數(shù)組合及功能舉例無(wú)符號(hào)除法:DIVsrcAL←AX÷r8/m8的商AH←AX÷r8/m8的余數(shù)AX←DX.AX÷r16/m16的商DX←DX.AX÷r16/m16的余數(shù)EAX←EDX.EAX÷r32/m32的商EDX←EDX.EAX÷r32/m32的余數(shù)divblidivbxdivebx有符號(hào)除法:IDIVsrc613.2.5其他運(yùn)算指令算術(shù)運(yùn)算類指令還有零位擴(kuò)展和符號(hào)擴(kuò)展指令十進(jìn)制調(diào)整指令……MOVZXMOVSXCBWCWDCWDECDQDAADASAAAAASAAMAAD……621.零位擴(kuò)展和符號(hào)擴(kuò)展指令零位擴(kuò)展對(duì)應(yīng)無(wú)符號(hào)數(shù):MOVZX指令前面加0實(shí)現(xiàn)位數(shù)擴(kuò)展80H:8位無(wú)符號(hào)數(shù),零位擴(kuò)展為16位:0080H符號(hào)擴(kuò)展對(duì)應(yīng)有符號(hào)數(shù):MOVSX指令前面加符號(hào)位(最高位)實(shí)現(xiàn)位數(shù)擴(kuò)展64H:8位有符號(hào)數(shù),符號(hào)擴(kuò)展成16位:0064HFF00H:16位有符號(hào)數(shù)據(jù)→符號(hào)擴(kuò)展成32位:FFFFFF00H,都表達(dá)真值:-256真值-1,字節(jié)量補(bǔ)碼:FFH→字量補(bǔ)碼:FFFFH,雙字量補(bǔ)碼:FFFFFFFFH

位數(shù)加長(zhǎng),大小沒(méi)變63零位擴(kuò)展和符號(hào)擴(kuò)展指令指令類型指令舉例零位擴(kuò)展MOVZXr16,r8/m8movzxdi,[bvar]movzxeax,axMOVZXr32,r8/m8/r16/m16符號(hào)擴(kuò)展MOVSXr16,r8/m8movsxax,almovsxedx,bxMOVSXr32,r8/m8/r16/m1664〔例3-6〕溫度轉(zhuǎn)換程序

;數(shù)據(jù)段tempc dw26 ;假設(shè)一個(gè)攝氏溫度Ctempf dw0 ;保存華氏溫度F ;代碼段

movsx

eax,[tempc] ;16位有符號(hào)數(shù)符號(hào)擴(kuò)展

imuleax,9 ;EAX=C×9

cdq

;EAX符號(hào)擴(kuò)展為EDX和EAX

movebx,5

idiv

ebx

;EAX=C×9/5

addeax,32 ;EAX=F=C×9/5+32

mov[tempf],ax ;取16位結(jié)果F=(9/5)×C+32652.十進(jìn)制調(diào)整指令算術(shù)運(yùn)算指令實(shí)現(xiàn)二進(jìn)制數(shù)的加減乘除十進(jìn)制BCD碼運(yùn)算:對(duì)二進(jìn)制運(yùn)算結(jié)果調(diào)整壓縮BCD碼:4個(gè)二進(jìn)制位表示一個(gè)十進(jìn)制位一個(gè)字節(jié)表示兩個(gè)十進(jìn)制位:00~99壓縮BCD碼調(diào)整指令:加法DAA和減法DAS非壓縮BCD碼:8個(gè)二進(jìn)制位表示一個(gè)十進(jìn)制位一個(gè)字節(jié)表示一個(gè)十進(jìn)制位0~9ASCII碼可以認(rèn)為是非壓縮BCD碼非壓縮BCD碼調(diào)整指令:加法AAA、減法AAS、乘法AAM和除法AAD663.3位操作類指令計(jì)算機(jī)中最基本的數(shù)據(jù)單位是二進(jìn)制位針對(duì)二進(jìn)制位進(jìn)行操作、實(shí)現(xiàn)位控制的指令邏輯運(yùn)算指令移位指令循環(huán)移位指令……進(jìn)行一位或若干位處理,采用位操作類指令多多閱讀程序673.3.1邏輯運(yùn)算指令邏輯與指令A(yù)ND邏輯或指令OR邏輯非指令NOT邏輯異或指令XOR測(cè)試指令TEST除NOT指令不影響標(biāo)志外其他邏輯指令使OF=CF=0根據(jù)結(jié)果按定義影響ZF、SF和PF681.邏輯與指令A(yù)ND邏輯與(邏輯乘)運(yùn)算規(guī)則:兩位都是邏輯1,則結(jié)果是1;否則,結(jié)果是0邏輯與指令A(yù)ND:按位進(jìn)行邏輯與,結(jié)果返回目的操作數(shù)ANDreg,imm/reg/mem

;reg←reg

imm/reg/memANDmem,imm/reg

;mem←mem

imm/reg設(shè)置CF=OF=0影響SF,ZF和PFTBATAB010111001000T=A·B真值表與門(mén)電路邏輯表達(dá)式010001010011000100000001

692.邏輯或指令OR邏輯或(邏輯加)運(yùn)算規(guī)則:兩位都是邏輯0,則結(jié)果是0;否則,結(jié)果是1邏輯或指令OR:按位進(jìn)行邏輯或,結(jié)果返回目的操作數(shù)ORreg,imm/reg/mem

;reg←reg

imm/reg/memORmem,imm/reg

;mem←mem

imm/reg設(shè)置CF=OF=0影響SF,ZF和PFTBATAB110111101000T=A+B真值表或門(mén)電路邏輯表達(dá)式010001010011000101110101

703.邏輯非指令NOT邏輯非(邏輯反)運(yùn)算規(guī)則:原來(lái)為0的位變成1,原來(lái)為1的位變成0邏輯非指令NOT:按位進(jìn)行邏輯非,結(jié)果返回操作數(shù)NOTreg/mem

;reg/mem←~reg/mem不影響狀態(tài)標(biāo)志位TA真值表非門(mén)電路邏輯表達(dá)式0110TAT=A0100010110111010~714.邏輯異或指令XOR邏輯異或(邏輯半加)運(yùn)算規(guī)則:兩位不同(相異),則結(jié)果是1;否則,結(jié)果是0邏輯異或指令XOR:按位進(jìn)行邏輯異或,結(jié)果返回目的操作數(shù)ANDreg,imm/reg/mem

;reg←reg

imm/reg/memANDmem,imm/reg

;mem←mem

imm/reg設(shè)置CF=OF=0影響SF,ZF和PFTAB010001010011000101110100

110011101000TBAT=A

B真值表異或門(mén)電路邏輯表達(dá)式72〔例3-7〕邏輯運(yùn)算程序-1moveax,[varA]

;EAX=11001010000111100101010101001101Bnoteax ;EAX=00110101111000011010101010110010Bandeax,[varB] ;EAX=00110101010000000010000010100000Bmovebx,[varB]

;EBX=00110111010110100011010111100001Bnotebx ;EBX=11001000101001011100101000011110Bandebx,[varA]

;EBX=11001000000001000100000000001100Boreax,ebx ;EAX=11111101010001000110000010101100Bmov[varT1],eax73〔例3-7〕邏輯運(yùn)算程序-2moveax,[varA]xoreax,[varB] ;EAX=11111101010001000110000010101100Bmov[varT2],eax;moveax,[varT1] ;二進(jìn)制形式顯示VART1calldispbdcalldispcrlf ;換行顯示moveax,[varT2] ;二進(jìn)制形式顯示VART2calldispbd1111110101000100011000001010110011111101010001000110000010101100運(yùn)行結(jié)果74邏輯運(yùn)算的屏蔽作用AND復(fù)位某些位(同0與),不影響其他(同1與)OR置位某些位(同1或),不影響其他(同0或)XOR求反某些位(同1異或),不影響其他(同0異或)andbl,11110110b

;BL中D0和D3清0,其余位不變orbl,00001001b ;BL中D0和D3置1,其余位不變xorbl,00001001b ;BL中D0和D3求反,其余位不變

復(fù)位Reset:清0,清除Clear

置位Set:置1大寫(xiě)=小寫(xiě)ANDDFH小寫(xiě)=大寫(xiě)OR20Hxor

edx,edxsubedx,edxmovedx,0755.測(cè)試指令TEST按位進(jìn)行邏輯與運(yùn)算,不返回邏輯與結(jié)果TESTreg,imm/reg/mem

;reg

imm/reg/memTESTmem,imm/reg

;mem

imm/regTEST指令像AND指令一樣來(lái)設(shè)置狀態(tài)標(biāo)志TEST指令常用于檢測(cè)一些條件是否滿足,一般后跟條件轉(zhuǎn)移指令,目的是利用測(cè)試條件轉(zhuǎn)向不同的分支AND與TEST?TEST與CMP?763.3.2移位指令邏輯左移指令

SHL邏輯右移指令

SHR算術(shù)左移指令

SAL算術(shù)左移指令

SARS:ShiftR:RotateL:LeftR:RightA:ArithmeticC:Carryflag不帶進(jìn)位循環(huán)左移指令

ROL不帶進(jìn)位循環(huán)右移指令

ROR帶進(jìn)位循環(huán)左移指令

RCL帶進(jìn)位循環(huán)右移指令

RCR771.移位指令分邏輯(Logical)和算術(shù)(Arithmetic)移位具有左移(Left)或右移(Right)操作

SHLreg/mem,i8/CL

;邏輯左移:最低位補(bǔ)0,最高位進(jìn)入CF SHRreg/mem,i8/CL

;邏輯右移:最高位補(bǔ)0,最低位進(jìn)入CF SALreg/mem,i8/CL ;算術(shù)左移,與SHL是同一條指令

SARreg/mem,i8/CL ;算術(shù)右移:最高位不變,最低位進(jìn)入CF目的操作數(shù):寄存器或存儲(chǔ)單元reg/mem后一個(gè)操作數(shù):移位位數(shù)i8/CL示意圖78移位指令的功能和示例返回79〔例3-8〕移位指令實(shí)現(xiàn)乘法程序xor

eax,eax ;EAX=0mov

ax,[wvar] ;AX=要乘以10的無(wú)符號(hào)數(shù)shleax,1 ;左移一位等于乘2mov

ebx,eax ;EBX=EAX×2shleax,2 ;再左移2位,EAX=EAX×8addeax,ebx ;EAX=EAX×10calldispuid ;顯示乘積calldispcrlf ;換行imuleax,10 ;EAX=EAX×10calldispuid ;顯示乘積

SHL邏輯左移一位相當(dāng)于無(wú)符號(hào)數(shù)乘以2

SHR邏輯右移一位相當(dāng)于無(wú)符號(hào)數(shù)除以2802.循環(huán)移位指令循環(huán)(Rotate)移位指令要將從一端移出的位返回到另一端形成循環(huán)分成不帶進(jìn)位循環(huán)移位和帶進(jìn)位循環(huán)移位分別具有左移或右移操作

ROLreg/mem,i8/CL ;不帶進(jìn)位循環(huán)左移指令 RORreg/mem,i8/CL ;不帶進(jìn)位循環(huán)右移指令 RCLreg/mem,i8/CL ;帶進(jìn)位循環(huán)左移指令

RCRreg/mem,i8/CL ;帶進(jìn)位循環(huán)右移指令RCL/RCR示意圖ROL/ROR示意圖81不帶進(jìn)位的循環(huán)移位指令返回82帶進(jìn)位的循環(huán)移位指令(c)帶進(jìn)位左循環(huán)移位RCL(d)帶進(jìn)位右循環(huán)移位RCR返回83〔例3-9〕循環(huán)移位程序-1 ;數(shù)據(jù)段qvar dq1234567887654321h ;代碼段

movecx,4again: shr

dword

ptr[qvar+4],1

rcr

dword

ptr[qvar],1 loopagain低32位CF0高32位64位數(shù)據(jù)邏輯右移84〔例3-9〕循環(huán)移位程序-2

;數(shù)據(jù)段ascii db'38'bcd db0

;代碼段

mov

al,[ascii]

andal,0fh

movah,[ascii+1]

shlah,4

oral,ah

mov[bcd],alBCD=83H第3章習(xí)題:通用數(shù)據(jù)處理指令3.1簡(jiǎn)答題(1、2、5、7、9)3.2

判斷題(1、4、5、7、10)3.3

填空題(2、4、5、8、10)3.4、3.6、3.11、3.14、3.163.21、3.22第4章程序結(jié)構(gòu)4.1順序程序結(jié)構(gòu)4.2分支程序結(jié)構(gòu)4.3循環(huán)程序結(jié)構(gòu)第4章程序結(jié)構(gòu)以順序、分支和循環(huán)程序結(jié)構(gòu)為主線結(jié)合數(shù)值運(yùn)算、數(shù)組處理等示例程序掌握控制轉(zhuǎn)移指令以及編寫(xiě)基本程序的方法4.1順序程序結(jié)構(gòu)按照指令書(shū)寫(xiě)的前后順序執(zhí)行每條指令最基本的程序片段構(gòu)成復(fù)雜程序的基礎(chǔ)3個(gè)示例程序知道“1+2+3+……+N”等于多少嗎?知道處理器內(nèi)置的識(shí)別字符串是什么嗎?知道“01100100”代表什么嗎?89求和過(guò)程求N個(gè)自然數(shù)之和1+2+3+……+N利用等差數(shù)列求和公式1+2+3+……+N=(1+N)×N÷2獲得N值N+1(1+N)×N結(jié)果除以2保存結(jié)果〔例4-1〕自然數(shù)求和程序

;數(shù)據(jù)段num dd3456

;假設(shè)一個(gè)N值(小于232-1)sum dq0 ;代碼段

moveax,[num]

;EAX=N

addeax,1

;EAX=N+1

imuldwordptr[num] ;EDX.EAX=(1+N)×N

shredx,1

;64位邏輯右移一位(除以2)

rcreax,1

;EDX.EAX=EDX.EAX÷2

movdwordptr[sum],eax ;小端方式保存

movdwordptr[sum+4],edx1+2+……+N=(1+N)×N÷290〔例4-2〕處理器識(shí)別程序

;數(shù)據(jù)段buffer db'Theprocessoris',12dup(0),0bufsize equ$-buffer ;代碼段 moveax,0 cpuid

;執(zhí)行處理器識(shí)別指令 movdwordptr[buffer+bufsize-13],ebx movdwordptr[buffer+bufsize-9],edx movdwordptr[buffer+bufsize-5],ecx moveax,offsetbuffer

;顯示信息

calldispmsgGenuineIntel91〔例4-3〕不同格式顯示程序moval,[var]calldispbbcalldispcrlfmoval,[var]calldisphbcalldispcrlfmoval,[var]calldispuibcalldispcrlfmoval,[var]calldispcvardb01100100b二進(jìn)制形式十六進(jìn)制形式十進(jìn)制形式字符形式運(yùn)行結(jié)果924.2分支程序結(jié)構(gòu)改變程序執(zhí)行順序、形成分支、循環(huán)、調(diào)用等程序結(jié)構(gòu)是很常見(jiàn)的程序設(shè)計(jì)問(wèn)題高級(jí)語(yǔ)言采用IF等語(yǔ)句表達(dá)條件,并根據(jù)條件是否成立轉(zhuǎn)向不同的程序分支匯編語(yǔ)言需要首先利用比較CMP、測(cè)試TEST、加減運(yùn)算、邏輯運(yùn)算等影響狀態(tài)標(biāo)志的指令形成條件然后利用條件轉(zhuǎn)移指令判斷由標(biāo)志表達(dá)的條件,并根據(jù)標(biāo)志狀態(tài)控制程序轉(zhuǎn)移到不同的程序段934.2.1無(wú)條件轉(zhuǎn)移指令程序代碼在代碼段CS:指明代碼段在主存中的段基地址EIP:給出將要執(zhí)行指令的偏移地址程序順序執(zhí)行,處理器自動(dòng)增量EIP程序控制轉(zhuǎn)移,EIP隨之改變程序轉(zhuǎn)移到另外的代碼段,EIP和CS都改變控制轉(zhuǎn)移類指令:改變EIP(有些也改變CS),即改變程序執(zhí)行順序(實(shí)現(xiàn)程序控制轉(zhuǎn)移)的指令本章學(xué)習(xí)控制轉(zhuǎn)移類指令941.轉(zhuǎn)移范圍段內(nèi)轉(zhuǎn)移在當(dāng)前代碼段范圍內(nèi)的程序轉(zhuǎn)移不需更改CS,只要改變EIP(偏移地址)近轉(zhuǎn)移(Near): 32位近轉(zhuǎn)移NEAR32、16位近轉(zhuǎn)移NEAR16短轉(zhuǎn)移(Short):轉(zhuǎn)移范圍在127~-128字節(jié)段間轉(zhuǎn)移從當(dāng)前代碼段跳轉(zhuǎn)到另一個(gè)代碼段需要更改CS(段地址)和EIP(偏移地址)遠(yuǎn)轉(zhuǎn)移(Far):48位遠(yuǎn)轉(zhuǎn)移FAR32、32位遠(yuǎn)轉(zhuǎn)移FAR16952.指令尋址方式相對(duì)尋址方式提供目標(biāo)地址相對(duì)于當(dāng)前指令指針EIP的位移量目標(biāo)地址(轉(zhuǎn)移后的EIP)=當(dāng)前EIP+位移量相對(duì)尋址都是段內(nèi)轉(zhuǎn)移,最常用、最靈活直接尋址方式直接提供目標(biāo)地址目標(biāo)地址(轉(zhuǎn)移后的CS和EIP)=指令操作數(shù)間接尋址方式指示寄存器或存儲(chǔ)單元目標(biāo)地址來(lái)自寄存器或存儲(chǔ)單元、間接獲得寄存器間接尋址:用寄存器保存目標(biāo)地址存儲(chǔ)器間接尋址:用存儲(chǔ)單元保存目標(biāo)地址目標(biāo)地址=目的地址=轉(zhuǎn)移地址96指令尋址973.JMP指令無(wú)條件轉(zhuǎn)移:程序無(wú)條件改變執(zhí)行順序JMP指令相當(dāng)于高級(jí)語(yǔ)言的goto語(yǔ)句

JMPlabel ;程序轉(zhuǎn)向label標(biāo)號(hào)指定的地址

;段內(nèi)相對(duì)尋址,段間直接尋址

JMPreg32/reg16 ;程序轉(zhuǎn)向寄存器指定的地址

;寄存器間接尋址

JMPmem48/mem32/mem16 ;程序轉(zhuǎn)向存儲(chǔ)單元指定的地址

;存儲(chǔ)器間接尋址98JMP指令的4種類型1.段內(nèi)轉(zhuǎn)移、相對(duì)尋址標(biāo)號(hào)指明目標(biāo)地址,指令代碼包含位移量2.段內(nèi)轉(zhuǎn)移、間接尋址通用寄存器或主存單元包含目標(biāo)指令偏移地址3.段間轉(zhuǎn)移、直接尋址標(biāo)號(hào)包含目標(biāo)指令的段地址和偏移地址4.段間轉(zhuǎn)移、間接尋址32位段用3字存儲(chǔ)單元包含目標(biāo)地址16位段用雙字存儲(chǔ)單元包含目標(biāo)地址MASM會(huì)根據(jù)存儲(chǔ)模式等信息自動(dòng)識(shí)別99〔例4-4〕無(wú)條件轉(zhuǎn)移程序-1

;數(shù)據(jù)段00000000 00000000 nvar dd0

;代碼段00000000 EB01 jmplabl1 ;相對(duì)尋址00000002 90

nop00000003 E900000001labl1: jmpnearptrlabl2 ;相對(duì)近轉(zhuǎn)移00000008 90

nop00000009 B800000011Rlabl2: mov

eax,offsetlabl30000000E FFE0

jmpeax ;寄存器間接尋址100〔例4-4〕無(wú)條件轉(zhuǎn)移程序-200000010 90

nop00000011 B800000021Rlabl3: moveax,offsetlabl400000016 A300000000R

mov[nvar],eax0000001B E900000000R

jmpnearptr[nvar] ;指令的存儲(chǔ)器間接尋址00000020

90

noplabl4:

mov

ebx,offset

nvarjmpnearptr[ebx];數(shù)據(jù)的寄存器間接尋址數(shù)據(jù)的存儲(chǔ)器直接尋址1011024.2.2條件轉(zhuǎn)移指令根據(jù)指定的條件確定程序是否發(fā)生轉(zhuǎn)移

Jcclabel ;條件滿足,發(fā)生轉(zhuǎn)移;否則,順序執(zhí)行下條指令LABEL表示目標(biāo)地址,采用段內(nèi)相對(duì)尋址32位IA-32處理器:達(dá)到32位的全偏移量16位80x86處理器:-128~+127間的短轉(zhuǎn)移條件轉(zhuǎn)移指令不影響標(biāo)志,但要利用標(biāo)志cc表示利用標(biāo)志判斷的條件,16種、兩類單個(gè)標(biāo)志狀態(tài)作為條件兩數(shù)大小關(guān)系作為條件103轉(zhuǎn)移條件cc:?jiǎn)蝹€(gè)標(biāo)志狀態(tài)JZ/JE

ZF=1 JumpifZero/EqualJNZ/JNE

ZF=0 JumpifNotZero/NotEqualJS

SF=1 JumpifSignJNS

SF=0 JumpifNotSignJP/JPE

PF=1 JumpifParity/ParityEvenJNP/JPO

PF=0 JumpifNotParity/ParityOddJO

OF=1 JumpifOverflowJNO

OF=0 JumpifNotOverflowJC

CF=1 JumpifCarryJNC

CF=0 JumpifNotCarry多個(gè)助記符方便記憶104轉(zhuǎn)移條件cc:兩數(shù)大小關(guān)系JB/JNAE

CF=1 JumpifBelow/NotAboveorEqualJNB/JAE

CF=0 JumpifNotBelow/AboveorEqualJBE/JNA

CF=1或ZF=1 JumpifBelow/NotAboveJNBE/JA

CF=0且ZF=0 JumpifNotBeloworEqual/AboveJL/JNGE

SF≠OF JumpifLess/NotGreaterorEqualJNL/JGE

SF=OF JumpifNotLess/GreaterorEqualJLE/JNG

ZF≠OF或ZF=1 JumpifLessorEqual/NotGreaterJNLE/JG

SF=OF且ZF=0 JumpifNotLessorEqual/Greater1051.單個(gè)標(biāo)志狀態(tài)作為條件的條件轉(zhuǎn)移指令JZ(JE)和JNZ(JNE):利用零位標(biāo)志ZF判斷結(jié)果是零(相等)還是非零(不等)JS和JNS:利用符號(hào)標(biāo)志SF判斷結(jié)果是負(fù)還是正JO和JNO:利用溢出標(biāo)志OF判斷結(jié)果是溢出還是沒(méi)有溢出JP(JPE)和JNP(JPO):利用奇偶標(biāo)志PF判斷結(jié)果低字節(jié)“1”的個(gè)數(shù)是偶數(shù)還是奇數(shù)JC和JNC:利用進(jìn)位標(biāo)志CF判斷結(jié)果是有進(jìn)位(為1)還是無(wú)進(jìn)位(為0)106〔例4-5〕個(gè)數(shù)折半程序條件滿足?分支體YNJcc指令獲得整數(shù)右移1位偶數(shù)?加1顯示結(jié)果YN107〔例4-5〕個(gè)數(shù)折半程序-1

moveax,885 ;假設(shè)一個(gè)數(shù)據(jù)

shreax,1 ;數(shù)據(jù)右移進(jìn)行折半

jncgoeven ;余數(shù)為0,即CF=0條件成立,轉(zhuǎn)移

addeax,1 ;否則余數(shù)為1,即CF=1,進(jìn)行加1操作goeven: calldispuid ;顯示結(jié)果

443運(yùn)行結(jié)果108〔例4-5〕個(gè)數(shù)折半程序-2

moveax,886 ;假設(shè)一個(gè)數(shù)據(jù)

shreax,1 ;數(shù)據(jù)右移進(jìn)行折半

jcgoodd ;余數(shù)為1,即CF=1條件成立,轉(zhuǎn)移

jmpgoeven ;余數(shù)為0,即CF=0無(wú)需處理,轉(zhuǎn)移到顯示!goodd: addeax,1 ;進(jìn)行加1操作goeven: calldispuid ;顯示結(jié)果jnc

goeven

何不合二為一?109〔例4-5〕個(gè)數(shù)折半程序-3

moveax,887 ;假設(shè)一個(gè)數(shù)據(jù)

shreax,1 ;數(shù)據(jù)右移進(jìn)行折半

adceax,0 ;余數(shù)=CF=1,進(jìn)行加1操作

;余數(shù)=CF=0,沒(méi)有加1

calldispuid

;顯示結(jié)果

moveax,888 ;假設(shè)一個(gè)數(shù)據(jù)

addeax,1 ;個(gè)數(shù)加1

rcreax,1 ;數(shù)據(jù)右移進(jìn)行折半

calldispuid ;顯示結(jié)果改進(jìn)算法消除分支110〔例4-6〕位測(cè)試程序底層程序設(shè)計(jì),常需測(cè)試某個(gè)位(bit)為0或?yàn)?例如,測(cè)試數(shù)據(jù)D1位為0或?yàn)?為0,顯示:NotReady!為1,顯示:Readytogo!01Readytogo!NotReady!D1位no_msg db'NotReady!',0yes_msg db'Readytogo!',0111〔例4-6〕位測(cè)試程序-1

;數(shù)據(jù)段no_msg db'NotReady!',0yes_msg db'ReadytoGo!',0 ;代碼段

moveax,56h

;假設(shè)一個(gè)數(shù)據(jù)

testeax,02h

;測(cè)試D1位(D1=1,其他位為0)

jznom

;D1=0條件成立,轉(zhuǎn)移

moveax,offsetyes_msg

;D1=1,顯示準(zhǔn)備好

jmpdone

;跳轉(zhuǎn)過(guò)另一個(gè)分支體!nom: moveax,offsetno_msg

;顯示沒(méi)準(zhǔn)備好done: calldispmsg112〔例4-6〕位測(cè)試程序-2

;數(shù)據(jù)段no_msg byte'NotReady!',0yes_msg byte'ReadytoGo!',0 ;代碼段

moveax,56h

;假設(shè)一個(gè)數(shù)據(jù)

testeax,02h

;測(cè)試D1位(D1=1,其他位為0)

jnzyesm

;D1=1條件成立,轉(zhuǎn)移

moveax,offsetno_msg

;D1=0,顯示沒(méi)準(zhǔn)備好

jmpdone

;跳轉(zhuǎn)過(guò)另一個(gè)分支體!yesm: moveax,offsetyes_msg

;顯示準(zhǔn)備好done: calldispmsg113奇偶校驗(yàn)(Parity)數(shù)據(jù)傳輸、存儲(chǔ)等,保證可靠的最常用校驗(yàn)方法奇校驗(yàn)使包括校驗(yàn)位在內(nèi)的數(shù)據(jù)中“1”的個(gè)數(shù)為奇數(shù)偶校驗(yàn)使包括校驗(yàn)位在內(nèi)的數(shù)據(jù)中“1”的個(gè)數(shù)為偶數(shù)11000017位數(shù)據(jù)0110000111100001奇校驗(yàn)偶校驗(yàn)校驗(yàn)位114為字符加上奇校驗(yàn)從鍵盤(pán)輸入字符二進(jìn)制顯示字符ASCII碼為字符加上奇校驗(yàn)顯示含奇校驗(yàn)的二進(jìn)制編碼“1”個(gè)數(shù)是奇數(shù)校驗(yàn)位(最高位)置1YN115〔例4-7〕奇校驗(yàn)程序

callreadc

;鍵盤(pán)輸入,AL=返回值

calldispcrlf

;回車換行(用于分隔)

calldispbb

;以二進(jìn)制形式顯示數(shù)據(jù)

calldispcrlf

;回車換行(用于分隔)

andal,7fh

;最高位置“0”、其他位不變

;同時(shí)標(biāo)志PF反映“1”的個(gè)數(shù)

jnpnext

;個(gè)數(shù)為奇數(shù),不需處理,轉(zhuǎn)移

oral,80h

;個(gè)數(shù)為偶數(shù),最高位置“1”、其他位不變next: calldispbb

;顯示含校驗(yàn)位的數(shù)據(jù)1162.兩數(shù)大小關(guān)系作為條件的條件轉(zhuǎn)移指令無(wú)符號(hào)數(shù)用高(Above)、低(Below)低于(不高于等于):JB(JNAE)不低于(高于等于):JNB(JAE)低于等于(不高于):JBE(JNA)不低于等于(高于):JNBE(JA)有符號(hào)數(shù)用大(Greater)、小(Less)小于(不大于等于):JL(JNGE)不小于(大于等于):JNL(JGE)小于等于(不大于):JLE(JNG)不小于等于(大于):JNLE(JG)117〔例4-8〕數(shù)據(jù)比較程序

cmpebx,ecx

jnenequal …

jmpdonenequal: jlfirst

xchgebx,ecxfirst: …done: …比較EBX和ECXEBX=ECX?顯示EBX、ECXYN顯示EBXEBX<ECX?EBX和ECX交換YN118〔例4-8〕數(shù)據(jù)比較程序-1

;數(shù)據(jù)段in_msg1 db'Enteranumber:',0in_msg2 db'Enteranothernumber:',0out_msg1 db'Twonumbersareequal:',0out_msg2 db'Thelessnumberis:',0out_msg3 db13,10,'Thegreaternumberis:',0

;代碼段

moveax,offsetin_msg1

;提示輸入

calldispmsg

callreadsid

;輸入第一個(gè)數(shù)據(jù)

movebx,eax

;保存到EBX

moveax,offsetin_msg2

;提示輸入

calldispmsg callreadsid

;輸入第二個(gè)數(shù)據(jù)

movecx,eax

;保存到ECX119〔例4-8〕數(shù)據(jù)比較程序-2

cmpebx,ecx ;二個(gè)數(shù)據(jù)進(jìn)行比較

jnenequal ;兩數(shù)不相等,轉(zhuǎn)移

moveax,offsetout_msg1

calldispmsg ;顯示兩數(shù)相等

moveax,ebx calldispsid ;顯示相等的數(shù)據(jù)

jmpdone ;轉(zhuǎn)移到結(jié)束nequal: jlfirst

;EBX較小,不需要交換,轉(zhuǎn)移

xchgebx,ecx ;EBX保存較小數(shù),ECX保存較大數(shù)120〔例4-8〕數(shù)據(jù)比較程序-3first: moveax,offsetout_msg2 ;顯示較小數(shù)

calldispmsg moveax,ebx

;較小數(shù)在EBX中

calldispsid

mov

eax,offsetout_msg3 ;顯示較大數(shù)

calldispmsg

mov

eax,ecx

;較大數(shù)在ECX中

calldispsid

done:1214.2.3單分支結(jié)構(gòu)只有一個(gè)分支的程序類似高級(jí)語(yǔ)言的IF-THEN語(yǔ)句結(jié)構(gòu)注意采用正確的條件轉(zhuǎn)移指令當(dāng)條件滿足(成立),發(fā)生轉(zhuǎn)移,跳過(guò)分支體條件不滿足,順序向下執(zhí)行分支體條件轉(zhuǎn)移指令與高級(jí)語(yǔ)言的IF語(yǔ)句正好相反IF語(yǔ)句是條件成立,執(zhí)行分支體122求絕對(duì)值與0比較大于等于0?求補(bǔ)YN輸入數(shù)據(jù)顯示絕對(duì)值

cmpeax,0

jgenonneg

negeaxnonneg: calldispuid

callreadsid123〔例4-9〕求絕對(duì)值程序

;代碼段

callreadsid ;輸入一個(gè)有符號(hào)數(shù),從EAX返回值

cmpeax,0

;比較EAX與0

jgenonneg ;條件滿足:EAX≥0,轉(zhuǎn)移

negeax ;條件不滿足:EAX<0,為負(fù)數(shù)

;需求補(bǔ)得正值nonneg: calldispuid ;分支結(jié)束,顯示結(jié)果124求絕對(duì)值(誤用Jcc指令)

callreadsid

cmpeax,0

jlyesneg

jmpnonnegyesneg:

negeaxnonneg: calldispuidjgenonneg小于0?求補(bǔ)YN顯示絕對(duì)值×JMP125大寫(xiě)字母判斷

cmpal,'A' jbdone

oral,20h calldispcrlf calldispc

callreadc大于'Z'

溫馨提示

  • 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)論