版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度升級(jí)版方自卸車租賃合同2篇
- 2025年度水電工程節(jié)能改造合同3篇
- 2025年上海市二手房買賣合同中合同附件與補(bǔ)充協(xié)議范本2篇
- 2024版房屋建筑施工協(xié)議范本一
- 2025版抗老型化妝品原料供應(yīng)與產(chǎn)品研發(fā)合作合同3篇
- 2025版客車二手車市場(chǎng)運(yùn)營(yíng)承包經(jīng)營(yíng)協(xié)議3篇
- 2024版二手房東租房合同范本
- 2024年食品行業(yè)市場(chǎng)調(diào)查與分析合同
- 2024年限量版玩具模具訂購(gòu)協(xié)議樣本版B版
- 2024年資產(chǎn)分配協(xié)議樣本一
- 高考體育特長(zhǎng)生培訓(xùn)
- 兒童及青少年知情同意書(shū)版本
- 廣東省肇慶市2024屆高三第二次教學(xué)質(zhì)量檢測(cè)數(shù)學(xué)試題(解析版)
- 部門(mén)預(yù)算編制培訓(xùn)課件
- 關(guān)于安全教育的主題班會(huì)課件
- 財(cái)務(wù)用發(fā)票分割單原始憑證 發(fā)票分割單范本
- 醫(yī)院精神科護(hù)理培訓(xùn):出走行為的防范與護(hù)理
- 《建筑基坑工程監(jiān)測(cè)技術(shù)標(biāo)準(zhǔn)》(50497-2019)
- 【環(huán)評(píng)文件】蚌埠市康城醫(yī)療廢物集中處置有限公司25噸日微波消毒處置醫(yī)療廢物項(xiàng)目
- 人教版初中物理八年級(jí)上冊(cè)全冊(cè)期末復(fù)習(xí)知識(shí)點(diǎn)
- 2023年法考鐘秀勇講民法講義電子版
評(píng)論
0/150
提交評(píng)論