第3章-2+8086指令系統(tǒng)NEW_第1頁
第3章-2+8086指令系統(tǒng)NEW_第2頁
第3章-2+8086指令系統(tǒng)NEW_第3頁
第3章-2+8086指令系統(tǒng)NEW_第4頁
第3章-2+8086指令系統(tǒng)NEW_第5頁
已閱讀5頁,還剩96頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

微機(jī)原理與接口技術(shù)朱華貴2016年03月21日微機(jī)原理與接口技術(shù)3.2指令系統(tǒng)朱華貴2016年03月21日微機(jī)原理與接口技術(shù)3.38086指令系統(tǒng)8086指令系統(tǒng)包括六大類指令:數(shù)據(jù)傳送指令算術(shù)運(yùn)算指令邏輯運(yùn)算和移位指令串操作指令控制轉(zhuǎn)移指令處理器控制指令1、指令助記符指令類型助記符數(shù)據(jù)傳送通用傳送MOV,PUSH,POP,XCHG,XLAT地址傳送LEA,LDS,LES標(biāo)志傳送PUSHF,POPF,LAHF,SAHF輸入輸出IN,OUT算術(shù)運(yùn)算加法ADD,ADC,INC,AAA,DAA減法SUB,SBB,DEC,NEG,CMP,AAS,DAS乘法MUL,IMUL,AAM除法DIV,IDIV,AAD符號(hào)擴(kuò)展CBW,CWD邏輯操作邏輯運(yùn)算AND,TEST,OR,XOR,NOT移位SHL,SAL,SHR,SAR循環(huán)移位ROL,ROR,RCL,RCR指令類型助記符串處理串操作MOVS,CMPS,SCAS,LODS,STOS重復(fù)控制REP,REPZ/REPE,REPNZ,REPNE控制轉(zhuǎn)移無條件轉(zhuǎn)移JMP條件轉(zhuǎn)移JE/JZ,JNE/JNZ,JS,JNS,JO,JNOJP,JNP,JC,JNC,JCXZJA/JNBE,JAE/JNB,JB/JNAE,JBE/JNAJG/JNLE,JGE/JNL,JL/JNGE,JLE/JNG循環(huán)控制LOOP,LOOPZ/LOOPE,LOOPNE/LOOPNZ過程調(diào)用CALL,RET中斷指令I(lǐng)NT,INTO,IRET處理機(jī)控制CLC,STC,CMC,CLD,STD,CLI,STINOP,HLT,WAIT,ESC,LOCK2、學(xué)習(xí)指令要點(diǎn)從以下幾個(gè)方面來掌握一條指令:指令的助記符指令的格式:操作數(shù)的個(gè)數(shù)、類型執(zhí)行的操作:指令執(zhí)行后的結(jié)果。包括:哪些寄存器、內(nèi)存單元的值發(fā)生了變化,對(duì)標(biāo)志位有沒有影響,受哪些影響。特點(diǎn)及注意事項(xiàng)只介紹常用的指令,其他需要時(shí)可自學(xué)3、利用DEBUG學(xué)習(xí)尋址方式、指令系統(tǒng)例:D:\>DEBUG;進(jìn)入DEBUG-A;匯編指令1395:0100MOVBX,20001395:0103MOV[BX],CS-R;查看指令執(zhí)行前寄存器的內(nèi)容AX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=1395ES=1395SS=1395CS=1395IP=0100NVUPEIPLNZNAPONC1395:0100BB0020MOVBX,2000-DDS:2000L20;查看指令執(zhí)行前內(nèi)存單元的內(nèi)容1395:20000000000000000000-0000000000000000................1395:20100000000000000000-0000000000000000................-T;單步執(zhí)行指令A(yù)X=0000BX=2000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=1395ES=1395SS=1395CS=1395IP=0103NVUPEIPLNZNAPONC1395:01038C0FMOV[BX],CSDS:2000=0000-T;單步執(zhí)行指令A(yù)X=0000BX=2000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=1395ES=1395SS=1395CS=1395IP=0105NVUPEIPLNZNAPONC1395:01050000ADD[BX+SI],ALDS:2000=95-DDS:2000L10;查看指令執(zhí)行前內(nèi)存單元的內(nèi)容1395:20009513000000000000-0000000000000000................Q;退出4、指令中操作數(shù)的表示符號(hào)表示內(nèi)容data立即數(shù)操作數(shù)reg通用寄存器操作數(shù)8位:AH、AL、BH、BL、CH、CL、DH、DL16位:AX、BX、CX、DX、BP、SP、SI、DIsegreg段寄存器:DS、CS、SS、ESmem或[]存儲(chǔ)器操作數(shù)(5種尋址方式)src源操作數(shù)dst目的操作數(shù)()寄存器、存儲(chǔ)器、端口的內(nèi)容oprd1、oprd2兩操作數(shù)5、書寫指令注意事項(xiàng)不區(qū)分大小寫不添加指令系統(tǒng)沒有的指令,即不自創(chuàng)助記符注意操作數(shù)的范圍對(duì)無操作數(shù)指令,不添加操作數(shù)對(duì)單操作數(shù)指令,操作數(shù)不能是立即數(shù)…1.數(shù)據(jù)傳送指令類

◆數(shù)據(jù)傳送類指令一共有14條。這里主要介紹:

MOV

傳送

PUSH

壓入堆棧 POP

彈出堆棧

XCHG

交換 LEA

取偏移

IN 輸入端口“讀” OUT輸出端口“寫”◆數(shù)據(jù)傳送類指令均不影響標(biāo)志位?!魯?shù)據(jù)類型字節(jié)(byte)/字(word)。絕大多數(shù)是雙操作數(shù),兩個(gè)操作數(shù)(字節(jié)/字)類型必須一致?!魧ぶ贩绞交九cMOV指令的要求相同。數(shù)據(jù)傳送指令傳送指令MOV格式:MOVdst,src操作:dst←(src)雙操作數(shù)尋址方式:

dst(目的操作數(shù)) src(源操作數(shù))

reg(寄存器)reg|mem|data(立即數(shù))|segreg

mem(內(nèi)存)reg|data|segreg

segreg(段寄存器)reg|mem◆兩個(gè)操作數(shù)類型(字節(jié)/字)要一致?!裟康牟僮鲾?shù)不能是立即數(shù),兩個(gè)操作數(shù)不能都是內(nèi)存尋址方式。堆棧操作指令

PUSH

和POP是一對(duì)堆棧操作指令:◆堆棧是一個(gè)“先進(jìn)后出”的內(nèi)存數(shù)據(jù)存取區(qū)域。堆棧邏輯地址SS:SP。◆數(shù)據(jù)進(jìn)入堆棧的操作為壓入(PUSH),從堆棧取出數(shù)據(jù)的操作為彈出(POP)。堆棧操作是單操作數(shù)指令,只能是字類型數(shù)據(jù)。壓入指令PUSH

格式:PUSHsrc操作:⑴(SP)-2→SP

⑵(src)→(SP)操作數(shù)尋址:src=|mem|reg|segreg

SS:0000SS:SP棧頂

棧底彈出指令POP格式:POPdst操作:⑴((SP))→dst ⑵(SP)+2→SP操作數(shù)尋址:dst=mem|reg|segreg例如: PUSH AX ;AX→(SS:SP) PUSH [BX] ;(DS:BX)→(SS:SP) POP CX ;(SS:SP)→CX PUSH CL ;錯(cuò)誤,堆棧操作必須是字類型數(shù)據(jù) POP 200 ;錯(cuò)誤,立即數(shù)不能是堆棧操作數(shù)據(jù)堆棧操作指令交換指令XCHG格式:XCHGopr1,opr2操作:(opr1)←→(opr2)操作數(shù)尋址:opr1=reg opr2=reg|mem注意:不可以直接把兩個(gè)內(nèi)存數(shù)據(jù)交換。例如: MOVAX,[2000H] ;(DS:2000H)→AX XCHGAX,[BX] ;AX和(DS:BX)交換 MOV[2000H],AX ;AX→(DS:2000H)數(shù)據(jù)交換指令查表換碼指令XLAT格式:XLAT ;無操作數(shù)操作:AL←DS:(BX+AL) ;隱含操作數(shù)尋址注意:BX為表頭的EA,AL是距離表頭的位移量。表最大容量為256個(gè)字節(jié)。例如:MEM DB ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’ MOVBX,OFFSETMEM

或LEABX,MEM

MOVAL,2

XLAT ;AL=43H(‘C’的ASCII碼值)查表換碼指令XLAT指令用法舉例若(DS)=2000H,(BX)=0020H,(AL)=9H,則執(zhí)行指令XLAT后,(AL)=39H。裝偏移指令LEA格式:LEAdst,src操作:src的偏移址→dst操作數(shù)尋址:dst=reg src=mem例如:MEMDB ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’

LEABX,MEM ;BX取MEM數(shù)據(jù)表頭的EA(等同于:MOVBX,OFFSETMEM

) MOVAL,[BX+2] ;AL=43H(‘C’的ASCII碼值)裝偏移地址指令輸入/輸出(I/O)指令◆I/O接口指令的語句格式:

IN

AL,〈端口地址〉

OUT〈端口地址〉,AL

◆I/O接口指令的端口地址16位,地址范圍為0000H~FFFFH。若端口地址為00H~FFH(0~255),可以直接給出;超出該范圍的端口地址必須存放在DX寄存器,間接給出。例如:

IN

AL,80H ;與MOVAL,80H

的區(qū)別

OUT20H,AL ;與MOV[20H],AL

的區(qū)別

MOVDX,100H ;DX=100H OUTDX,AL ;與MOVDX,AX

的區(qū)別

INAL,[80H] ;錯(cuò)誤,端口尋址不能用方括號(hào)(1)取標(biāo)志指令LAHF格式:LAHF該指令中的源操作數(shù)隱含為標(biāo)志寄存器低8位,目標(biāo)操作數(shù)隱含為AH。功能:把16位的標(biāo)志寄存器低8位送寄存器AH。(2)置標(biāo)志指令SAHF格式:SAHF該指令中的源操作數(shù)隱含為AH,目標(biāo)操作數(shù)隱含為標(biāo)志寄存器。功能:把寄存器AH中內(nèi)容送至16位的標(biāo)志寄存器低8位,此操作是LAHF的逆操作。標(biāo)志傳送指令【例3-1】

編寫匯編程序段,把標(biāo)志寄存器的CF位求反,其他位不變。LAHF ;取標(biāo)志寄存器的低8位XORAH,01H ;最低位求反,其他位不變SAHF ;送入標(biāo)志寄存器的低8位OF111512DF10IF9TF8SF7ZF65AF43PF21CF0(3)標(biāo)志入棧指令PUSHF格式:PUSHF該指令中的源操作數(shù)隱含為標(biāo)志寄存器,目標(biāo)操作數(shù)隱含為堆棧區(qū)。功能:標(biāo)志寄存器入棧。(4)標(biāo)志彈出指令POPF格式:POPF該指令中的源操作數(shù)隱含為堆棧區(qū),目標(biāo)操作數(shù)隱含為標(biāo)志寄存器。功能:數(shù)據(jù)出棧到標(biāo)志寄存器?!纠?-2】

編寫匯編程序段,把標(biāo)志寄存器TF位清零,其他標(biāo)志位不變。PUSHF ;標(biāo)志寄存器入棧POPAX ;取標(biāo)志寄存器內(nèi)容ANDAX,0FEFFH ;TF清零,其他位不變PUSHAX ;新值入棧POPF ;送入標(biāo)志寄存器OF111512DF10IF9TF8SF7ZF65AF43PF21CF0◆算術(shù)運(yùn)算類指令一共有20條,分成加、減、乘、(整)除指令和BCD碼調(diào)整指令五組。這里主要介紹加、減、乘、除14條指令:

ADD

加法 ADC

進(jìn)位加 INC

加1

SUB

減法 SBB

借位減 DEC

減1

CMP

比較 NEG

求補(bǔ)

MUL無符號(hào)乘法 IMUL

有符號(hào)乘法

DIV

無符號(hào)除法 IDIV

有符號(hào)除法

CBW

字節(jié)符號(hào)擴(kuò)展 CWD

字符號(hào)擴(kuò)展◆算術(shù)運(yùn)算類指令基本都均影響標(biāo)志位(ZF、SF、CF、OF)?!艚^大多數(shù)是雙操作數(shù),操作數(shù)可為字節(jié)/字類型?!魧ぶ贩绞脚cMOV指令基本相同。2.算術(shù)運(yùn)算指令類加法指令A(yù)DD格式:ADDdst,src ;(dst)+(src)→dst進(jìn)位加指令A(yù)DC格式:ADCdst,src ;(dst)+(src)+CF→dst加1指令I(lǐng)NC格式:INCdst ;(dst)+1→dst操作數(shù)尋址方式:

dst src

reg reg|mem|data

mem reg|data加法運(yùn)算指令減法指令SUB格式:SUBdst,src ;(dst)-(src)→dst借位減指令SBB格式:SBBdst,src ;(dst)-(src)-CF→dst減1指令DEC格式:DEC dst ;(dst)-1→dst操作數(shù)尋址方式:

dst src

reg reg|mem|data

mem reg|data減法運(yùn)算指令比較指令CMP格式:CMPdst,src操作:(dst)-(src),僅根據(jù)計(jì)算結(jié)果設(shè)置相關(guān)標(biāo)志位。求補(bǔ)指令NEG格式:NEG dst操作:0-(dst)→dst ;求互補(bǔ)碼例如:計(jì)算 12345678H+80A7FD28HMOVDX,1234HMOVAX,5678H ;DX|AX=12345678HADDAX,0FD28HADCDX,80A7H ;DX|AX=92DC53A0H減法運(yùn)算指令無符號(hào)乘法指令MUL 有符號(hào)乘法指令I(lǐng)MUL格式:MULsrc IMULsrc操作數(shù)尋址:src=reg|mem操作:有/無符號(hào)數(shù)的乘法

字節(jié)乘法:(AL)×(src)→AX

字乘法:(AX)×(src)→DX|AX(32位)標(biāo)志位:ZF,SF無定義。乘積的高階部分如果非0,OF,CF均被置1。例如: 無符號(hào)數(shù)字節(jié)乘法0FFH×1=00FFH

有符號(hào)數(shù)字節(jié)乘法0FFH×1=0FFFFH乘法運(yùn)算指令無符號(hào)除法指令DIV 有符號(hào)除法指令I(lǐng)DIV格式:DIV src IDIV src操作數(shù)尋址:src=reg|mem操作:有/無符號(hào)數(shù)的除法字節(jié)除法:(AX)/(src)→AL(商),AH(余數(shù))字除法:(DX|AX)/(src)→AX(商),DX(余數(shù))注意:1.除法可能有0作除數(shù)錯(cuò)誤;商超出字節(jié)/字范圍的溢出錯(cuò)誤。2.有符號(hào)數(shù)除法的余數(shù)與被除數(shù)的符號(hào)相同。除法運(yùn)算指令符號(hào)擴(kuò)展指令CBW和CWD格式:CBW ;把有符號(hào)數(shù)AL擴(kuò)展為AX

CWD ;把有符號(hào)數(shù)AX擴(kuò)展為DX|AX操作數(shù):隱含尋址(AL/AX/DX)標(biāo)志位:不改變。例如:

MOV AL,07FH

CBW ;AX=007FH MOV AX,8003H

CWD ;AX=8003H,DX=0FFFFH符號(hào)擴(kuò)展指令例如: MUL AH ;無符號(hào)數(shù)(AL)×(AH)→AX IMUL AL ;有符號(hào)數(shù)(AL)×(AL)→AX MUL BX ;無符號(hào)數(shù)(AX)×(BX)→DX|AX MULwordptr[BX];(AX)×((BX))→DX|AX例如:計(jì)算30200除以1500。

MOV AX,30200 ;AX=30200

CWD ;AX擴(kuò)展為DX|AX MOV BX,1500

DIV BX ;AX=20(商),DX=200(余數(shù))例如,如果AX=0010H(+16),BL=0FDH(-3) IDIVBL ;AX=01FBH,商=-5,余數(shù)=1乘/除法指令應(yīng)用例【例3-3】

編寫匯編程序段,計(jì)算:(V-(X*Y+Z-100))/X。已知:X、Y、Z、V均為16位符號(hào)數(shù),已分別裝入X、Y、Z、V單元中,要求將上式計(jì)算結(jié)果的商存入AX,余數(shù)存入DX。MOVAX,X ;取被乘數(shù)XIMULY ;X*Y,結(jié)果在DX、AX中MOVCX,AX ;將乘積存在BX、CX中MOVBX,DXMOVAX,Z ;取被加數(shù)ZCWD;將符號(hào)擴(kuò)展后的Z加到BX、CX中的乘積上ADDCX,AXADCBX,DXSUBCX,100SBBBX,0 ;從BX、CX中減去100MOVAX,VCWDSUBAX,CX;從符號(hào)擴(kuò)展后的V中減去(BX、CX)SBBDX,BX;并除以X,商在AX中,余數(shù)在DX中IDIVX【例3-4】

編寫匯編程序段,用壓縮BCD碼編碼并計(jì)算37D-19D。MOVAL,37HSUBAL,19H ;AL=1EH,AF=1,CF=0DAS ;AL=18H,AF=1通過DAS這條指令來確認(rèn)上述減法計(jì)算為十進(jìn)制運(yùn)算3.邏輯運(yùn)算和移位指令◆邏輯運(yùn)算和移位類指令是以2#數(shù)位為單位的“位操作”指令,邏輯運(yùn)算指令5條,移位指令8條。NOT

邏輯非 AND

邏輯與 OR

邏輯或XOR

邏輯異或 TEST

位測試SHL

邏輯左移 ROL

循環(huán)左移 SHR

邏輯右移 ROR

循環(huán)右移SAL

算術(shù)左移 RCL

帶進(jìn)位循環(huán)左移SAR

算術(shù)右移 RCR

帶進(jìn)位循環(huán)右移◆操作數(shù)可為字節(jié)/字類型,按位進(jìn)行邏輯運(yùn)算。◆多數(shù)情況不改變標(biāo)志位。邏輯運(yùn)算指令邏輯非指令NOT格式:NOT dst ;求(dst)的互反碼邏輯與指令A(yù)ND邏輯或指令OR邏輯異或指令XOR格式:ANDdst,src 操作:(dst)∧(src)→dstOR dst,src(dst)∨(src)→dst XOR dst,src(dst)⊕(src)→dst測試指令TEST格式:TESTdst,src操作:(dst)∧(src);不保存結(jié)果,僅改變標(biāo)志位【例3-5】

編寫匯編程序段,將寄存器AX清零。

XORAX,AX還有哪些可以將AX清零的指令?比較之。指令時(shí)鐘數(shù)指令字節(jié)數(shù)8088286386486PentiumMOVAX,0432112ANDAX,0432113XORAX,AX322112SUBAX,AX322113MOVBL,0MULBL432112143213842113移位指令邏輯左移SHL

邏輯右移 SHR算術(shù)左移SAL

算術(shù)右移 SAR循環(huán)左移ROL

循環(huán)右移 ROR帶進(jìn)位循環(huán)左移RCL

帶進(jìn)位循環(huán)右移RCR格式:<移位指令>dst,cnt操作數(shù)尋址:dst是移位的對(duì)象,dst=reg|mem cnt是移位的位數(shù),cnt=1|CL標(biāo)志位:ZF和SF,指明移位結(jié)果的設(shè)置。

CF:左移取自dst最高位,右移取自dst的D0位。移位指令移位指令可以對(duì)寄存器或存儲(chǔ)單元的內(nèi)容按字節(jié)或字進(jìn)行操作。循環(huán)移位指令【例3-6】

設(shè)無符號(hào)數(shù)X在寄存器AL中,用移位指令實(shí)現(xiàn)X*10的運(yùn)算。MOVAH,0SALAX,1 ;AX←數(shù)X*2MOVBX,AX MOVCL,2SALAX,CL ;AX←數(shù)X*8ADDAX,BX ;AX←數(shù)X*10例:設(shè)AL=01010100B,CF=1,CL=4,則:ROLAL,1 ;AL=10101000B,CF=0,OF=1RORAL,1 ;AL=00101010B,CF=0,OF=0RCLAL,1 ;AL=10101001B,CF=0,OF=1RCRAL,CL ;AL=10010101B,CF=0,OF無定義邏輯運(yùn)算和移位指令應(yīng)用例

ANDAL,50H ;AL=(AL)∧50H ORAX,[8080H] ;AX=(AX)∨(DS:8080H)

XORAX,AX ;AX=0,CF=0 ANDAL,0FH ;AL高4位清0,低4位保留 ORAL,0FH ;AL高4位保留,低4位置1 XORAL,0FH ;AL高4位保留,低4位取反;AX乘以10MOVDX,0SAL AX,1RCLDX,1MOV BX,AXMOVCX,DX;雙字算術(shù)右移SAR DX,1RCR AX,1

DXCFAXCFSARDX,1RCRAX,1SAL AX,1

RCLDX,1SAL AX,1RCLDX,1

ADD AX,BXADCDX,CX6.處理器控制指令◆標(biāo)志位設(shè)置指令:CLC CF=0 STC CF=1 CMCCF取反CLD DF=0 STD DF=1CLI IF=0 STI IF=1◆CPU控制指令:NOP

無操作(空操作) HLT

停機(jī)(暫停,等待外部中斷,中斷后恢復(fù)運(yùn)行)WAIT

等待(等待測試信號(hào)TEST,恢復(fù)運(yùn)行)4.串操作指令所謂“串”是指一組數(shù)據(jù)。串操作指令的操作對(duì)象不是一字節(jié)或一個(gè)字,而是內(nèi)存中地址連續(xù)的一組字節(jié)或一組字。在默認(rèn)的情況下,串操作指令的源串存于數(shù)據(jù)段,目標(biāo)串存于附加段。在每一次基本操作后,能夠自動(dòng)修改源及目標(biāo)地址為下一次操作做好準(zhǔn)備。串操作指令前通常加上重復(fù)前綴,此時(shí),基本操作在滿足條件的情況下得到重復(fù),直至完成預(yù)設(shè)次數(shù)。(1)基本串操作指令(1)串傳送指令格式一:MOVSdst,src格式二:MOVSB格式三:MOVSW功能:(ES:DI)←(DS:SI);SI←SI+1/2;DI←DI+1/2MOVS指令使用說明格式一中的dst,src僅為了增加程序的可讀性。字節(jié)操作時(shí),使用格式二,地址調(diào)整量是1;字操作時(shí),使用格式三,地址調(diào)整量是2。地址是增或減由標(biāo)志位DF決定:DF=0,地址增;DF=1,地址減。尋址方式規(guī)定為寄存器間接尋址:源操作數(shù)隱含為數(shù)據(jù)段,偏移地址由寄存器SI指明,允許段超越。目標(biāo)操作數(shù)隱含為附加段,偏移地址由寄存器DI指明,不允許段超越。(2)串裝入指令格式一:LODSsrc格式二:LODSB格式三:LODSW 功能:AL←(DS:SI);SI←SI+1/2 (3)串送存指令格式一:STOSdst格式二:STOSB格式三:STOSW 功能:(ES:DI)←AL;DI←DI+1/2 (4)串比較指令格式一:CMPSsrc,dst格式二:CMPSB格式三:CMPSW 功能:(DS:SI)-(ES:DI);SI←SI+1/2;DI←DI+1/2(5)串掃描指令格式一:SCASdst格式二:SCASB格式三:SCASW 功能:AL/AX-(ES:DI);DI←DI+1/2說明:指令STD、CLD用于設(shè)置方向標(biāo)志。STD使DF為1,CLD使DF為0。(2)重復(fù)前綴指令基本串操作指令完成一個(gè)數(shù)據(jù)的操作,如果要操作一組數(shù)據(jù),就需要在基本串操作指令前加上重復(fù)前綴。重復(fù)前綴指明該指令的基本操作是否被重復(fù)、重復(fù)的條件是什么?;静僮鞯闹貜?fù)次數(shù)隱含在寄存器CX中。(1)無條件重復(fù)前綴指令格式:REP功能:REP前綴加在串指令MOVS、STOS之前,控制串指令重復(fù)執(zhí)行。串指令重復(fù)執(zhí)行的次數(shù)保存在寄存器CX中。每執(zhí)行一次串指令,CX←(CX)-1,直到CX=0為止。(2)相等重復(fù)前綴指令格式一:REPE格式二:REPZ功能:REPZ或REPE前綴加在串指令CMPS、SCAS指令前,控制串指令重復(fù)執(zhí)行。當(dāng)(CX)≠0且ZF=1時(shí),串指令重復(fù)執(zhí)行;當(dāng)(CX)=0或ZF=0時(shí),串指令重復(fù)執(zhí)行結(jié)束。(3)不相等重復(fù)前綴REPNE或REPNZ格式一:REPNE格式二:REPNZ功能:REPNZ或REPNE前綴加在串指令CMPS、SCAS指令前,控制串指令重復(fù)執(zhí)行。當(dāng)(CX)≠0且ZF=0時(shí),串指令重復(fù)執(zhí)行;當(dāng)(CX)=0或ZF=1時(shí),串指令重復(fù)執(zhí)行結(jié)束。說明:帶前綴的串操作指令執(zhí)行后,CX-1操作不影響標(biāo)志位?!纠?-7】

編寫匯編程序段,把自SAREA開始的100個(gè)字復(fù)制到DAREA開始的區(qū)域中。DATA1SEGMENTSAREADW……DATA1ENDSDATA2SEGMENTDAREADW……DATA2ENDSCODESEGMENTASSUMECS:CODE,DS:DATA1,ES:DATA2(1)源、目標(biāo)區(qū)沒有重疊MOVAX,SEGSAREA ;MOVDS,AX;源區(qū)段地址送段寄存器DSMOVAX,SEGDAREA MOVES,AX;目標(biāo)區(qū)段地址送段寄存器DSLEASI,SAREA;源區(qū)首字的偏移地址送SILEADI,DAREA ;目標(biāo)區(qū)首字的偏移地址送DIMOVCX,100;串長送寄存器CXCLD;DF=0,地址增REPMOVSW;串傳送(2)源、目標(biāo)區(qū)有重疊MOVCX,100 ;串長送寄存器CXMOVAX,SEGSAREAMOVDS,AX ;源區(qū)段地址送DSMOVAX,SEGDAREAMOVES,AX;目標(biāo)區(qū)段地址送ESLEASI,SAREAADDSI,CX;源區(qū)末字的偏移地址送SILEADI,DAREAADDDI,CX;目標(biāo)區(qū)末字的偏移地址送DISTD;DF=1,地址減REPMOVSW;串傳送【例3-8】

編寫匯編程序段,將內(nèi)存DS:2100~DS:210F存儲(chǔ)區(qū)清0。MOVES,DS ;目標(biāo)段段地址送ESMOVDI,2100;目標(biāo)段首字節(jié)偏移地址送DIMOVCX,10H ;串長送寄存器CXCLD;設(shè)置方向增MOVAL,0REPSTOSB ;重復(fù)串送存5.控制轉(zhuǎn)移指令8086程序的執(zhí)行順序由代碼段寄存器CS和指令指針寄存器IP的值決定。程序可以按順序執(zhí)行,也可以根據(jù)情況改變程序的執(zhí)行順序??刂妻D(zhuǎn)移指令就是通過改變CS和IP的值來實(shí)現(xiàn)程序的轉(zhuǎn)移??刂妻D(zhuǎn)移指令根據(jù)程序轉(zhuǎn)移地址的不同,分為段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移。段內(nèi)轉(zhuǎn)移是指程序在同一代碼段內(nèi)轉(zhuǎn)移,這時(shí)只要改變IP的值。段間轉(zhuǎn)移指程序?qū)⑥D(zhuǎn)移到其他段,此時(shí)CS和IP的值同時(shí)改變。(1)無條件轉(zhuǎn)移指令無條件轉(zhuǎn)移指令執(zhí)行后,程序無條件轉(zhuǎn)移到段內(nèi)由指令中給出的目標(biāo)地址處。A.段內(nèi)直接轉(zhuǎn)移指令格式一:JMP標(biāo)號(hào)格式二:JMP立即數(shù)指令完成的操作:IP←(IP)+以標(biāo)號(hào)或立即數(shù)給出的偏移量,(CS)不變。例如:JMP2010H ;IP←2010HJMPSHORT L ;IP←(IP)+8位移量JMPNEAR NEXT ;IP←(IP)+16位移量B.段內(nèi)間接轉(zhuǎn)移指令格式一:JMP寄存器格式二:JMP存儲(chǔ)單元指令完成的操作:(IP)←寄存器或存儲(chǔ)單元的值,(CS)不變。例如:JMPBX ;IP←(BX)JMPWORDPTR[SI] ;IP←(DS:SI)C.段間直接轉(zhuǎn)移格式:JMP FAR PTR標(biāo)號(hào)指令完成的操作:(IP)←標(biāo)號(hào)所在存儲(chǔ)單元的偏移地址,(CS)←標(biāo)號(hào)所在存儲(chǔ)單元的段地址。例如:JMPFARPTRNEXT ;(IP)←標(biāo)號(hào)NEXT的偏移地址 ;(CS)←標(biāo)號(hào)NEXT的段地址D.段間間接轉(zhuǎn)移格式:JMPDWORDPTR存儲(chǔ)單元指令完成的操作:(IP)←標(biāo)號(hào)指出的雙字存儲(chǔ)單元的低16位,(CS)←標(biāo)號(hào)給出的雙字存儲(chǔ)單元的高16位。例如:JMPDWORDPTR[SI] ;IP←(DS:SI),CS←(DS:SI+2)(2)條件轉(zhuǎn)移指令格式:Jcc標(biāo)號(hào)功能:以標(biāo)志位的狀態(tài)作為轉(zhuǎn)移依據(jù)。如果滿足轉(zhuǎn)移條件,則轉(zhuǎn)移到標(biāo)號(hào)指示的指令處;否則,順序執(zhí)行下一條指令。說明:cc代表跳轉(zhuǎn)條件,short-label表明該指令只能實(shí)現(xiàn)段內(nèi)短轉(zhuǎn)移,參數(shù)形式通常為符號(hào)地址。條件轉(zhuǎn)移指令(1)操作符功能測試條件JC進(jìn)位標(biāo)志為1轉(zhuǎn)移CF=1JNC進(jìn)位標(biāo)志為0轉(zhuǎn)移CF=0JZ/JE等于0/相等轉(zhuǎn)移ZF=1JNZ/JNE不等于0/不相等轉(zhuǎn)移ZF=0JS符號(hào)標(biāo)志為1轉(zhuǎn)移SF=1JNS符號(hào)標(biāo)志為0轉(zhuǎn)移SF=0JO溢出轉(zhuǎn)移OF=1JNO無溢出轉(zhuǎn)移OF=0JP/JPE偶狀態(tài)轉(zhuǎn)移PF=1JNP/JPO奇狀態(tài)轉(zhuǎn)移PF=0JCXZCX=0轉(zhuǎn)移CX=0條件轉(zhuǎn)移指令(2)比較情況無符號(hào)數(shù)有符號(hào)數(shù)指令判斷條件指令判斷條件

A>BJAZF=0,CF=0JGSF=OFJNBEJNLE且

ZF=0

A>=BJAEZF=1或JGESF=OFJNBCF=0JNL或ZF=1A<BJBZF=0,CF=1JLSF<>OFJNAEJNGE且ZF=0

A<=BJBEZF=1或JLESF<>OFJNACF=1JNG或ZF=1二分支程序設(shè)計(jì)示例【例3.9】把有符號(hào)字節(jié)數(shù)X和Y的較大者送入變量Z。;字節(jié)變量X和Y比較程序段:

…… MOV AL,X ;AL=X CMP AL,Y ;AL(即X)和Y比較

JGE YG ;X>=Y,轉(zhuǎn)YG MOVAL,Y ;X<Y,AL=YYG: MOV Z,AL ;較大者存放到Z單元 …… 多分支程序設(shè)計(jì)示例【例3.10】

求X字節(jié)變量數(shù)據(jù)的符號(hào)函數(shù)(3分支)。

;求字節(jié)變量符號(hào)函數(shù)程序段(X=0,AL=0;X>0,AL=1;X<0,AL=-1)

MOV AL,X CMP AL,0 ;X與0比較

JZ ZERO ;為0,轉(zhuǎn)ZERO

JS NEGA ;為負(fù),轉(zhuǎn)NEGA MOV AL,1 ;為正,AL=1

JMP OK ;轉(zhuǎn)公共出口OK

ZERO: MOV AL,0 ;AL=0

JMP OK ;轉(zhuǎn)公共出口OK NEGA: MOV AL,0FFH ;AL=-1

OK: MOV Y,AL ;符號(hào)函數(shù)值存放到Y(jié)單元(3)循環(huán)控制指令循環(huán)控制指令用于控制程序重復(fù)執(zhí)行。循環(huán)控制指令提供了程序段循環(huán)的控制及手段。循環(huán)控制指令都用CX寄存器作為循環(huán)次數(shù)計(jì)算器,表示某程序段的最大循環(huán)次數(shù),且循環(huán)體每執(zhí)行一次,CX被減去1。8088/8086CPU規(guī)定:被循環(huán)的程序段必須在同一段內(nèi),且長度不能大于256字節(jié)。循環(huán)控制指令不影響標(biāo)志位。

循環(huán)指令格式:指令碼標(biāo)號(hào);(CX中存放循環(huán)次數(shù))操作符操作功能LOOPCX<--(CX)-1循環(huán)

若(CX)<>0,則循環(huán)LOOPZCX<--(CX)-1當(dāng)CX不為零且LOOPE若(CX)<>0且ZF=1,則循環(huán)相等時(shí)循環(huán)

LOOPNZCX<--(CX)-1當(dāng)CX不為零且LOOPNE若(CX)<>0且ZF=0,則循環(huán)不相等時(shí)循環(huán)

A.循環(huán)指令格式:LOOP目標(biāo)地址

功能:①CX←CX-1②如果CX=0,結(jié)束循環(huán),執(zhí)行后續(xù)語句;否則:③轉(zhuǎn)移到標(biāo)號(hào)處,循環(huán)體被重復(fù)。B.相等循環(huán)指令格式:LOOPZ/LOOPE目標(biāo)地址

功能:①CX←CX-1②如果CX=0或ZF=0,結(jié)束循環(huán),執(zhí)行后續(xù)語句;否則:③轉(zhuǎn)移到標(biāo)號(hào)處,循環(huán)體被重復(fù)。C.不相等循環(huán)指令格式:LOOPNZ/LOONE目標(biāo)地址

功能:①CX←CX-1②如果CX=0或ZF=1,結(jié)束循環(huán),執(zhí)行后續(xù)語句;否則:③轉(zhuǎn)移到標(biāo)號(hào)處,循環(huán)體被重復(fù)?!纠?-11】

在首地址為Array的存儲(chǔ)區(qū)域已存入長度為M的字?jǐn)?shù)組,編寫匯編程序段,統(tǒng)計(jì)該數(shù)組中0元素的個(gè)數(shù),統(tǒng)計(jì)結(jié)果存入Result單元。

MOV CX,M

MOV Result,0

MOV SI,0AGAIN:

MOV AX,Array[SI]

CMP AX,0

JNZ NEXT

INC Result

NEXT:

ADD SI,2

LOOP AGAIN ;進(jìn)入下一輪循環(huán)LOOPAGAIN等效于下列語句:DECCXJNZAGAIN但是,LOOP指令中完成CX←CX-1的操作不影響標(biāo)志位,而DEC指令則對(duì)標(biāo)志位有影響。循環(huán)程序設(shè)計(jì)【例3.12】

把存儲(chǔ)器中N個(gè)字節(jié)數(shù)據(jù)“搬家”。

;“搬家”程序段:

MOV AX,DATA MOV DS,AX ;設(shè)置DS數(shù)據(jù)段基址

LEA SI,BLKS LEA DI,BLKD

MOV CX,N ;CX=N LOP1:MOV AL,[SI] ;取一個(gè)數(shù)

MOV [DI],AL ;“搬”一個(gè)數(shù)

INC SI INC DI ;SI和DI分別做+1修改

LOOP LOP1 ;CX1≠0

,循環(huán)“搬”數(shù)循環(huán)程序設(shè)計(jì)【例3.13】

計(jì)算

SUM=a1b1+a2b2……

+a10b10

。;內(nèi)存數(shù)據(jù)定義a db89,5,56,80…… ;10個(gè)數(shù)據(jù)b db18,29,12,38…… ;10個(gè)數(shù)據(jù)sum dw?;計(jì)算SUM程序段

……

mov dx,0 mov si,0 mov cx,10lop1: mov al,a[si] mul b[si] add dx,ax inc si

loop lop1 mov sum,dx ……循環(huán)程序設(shè)計(jì)【例3.14】ARR數(shù)據(jù)區(qū)有N個(gè)有符號(hào)字節(jié)數(shù)(ARR數(shù)組)。求ARR數(shù)組的最大值、最小值、數(shù)組元素之和,以及數(shù)據(jù)平均值。

ARR db89,-90,56,88……n equ$-ARR ;n=數(shù)據(jù)個(gè)數(shù)

max db-128 ;預(yù)先放最小值-128

min db127 ;預(yù)先放最大值127

sum dw0 ;預(yù)先放求和初值0ping db? ;平均值;程序段

……

LEA BX,ARR MOV CX,npp1: MOV AL,[BX] CBW ADD sum,AX CMP max,AL JGE p1 MOV max,ALp1:

CMP min,AL JLE p2 MOV min,ALp2: INC BX

LOOPpp1 MOV AX,sum MOV CL,n IDIV CL ;al=平均值

MOV ping,AL ……(4).過程調(diào)用與返回指令需要反復(fù)被調(diào)用的具有一定功能的程序段可以被設(shè)計(jì)成過程(也稱為子程序),以供需要時(shí)調(diào)用。在過程中需要安排返回指令,使得過程結(jié)束時(shí),返回到調(diào)用處。過程與調(diào)用程序在同一段內(nèi),稱“段內(nèi)調(diào)用”;過程與調(diào)用程序不在同一段內(nèi),稱“段間調(diào)用”。過程調(diào)用指令CALL和返回指令RET均不影響標(biāo)志位,但影響堆棧內(nèi)容。A.過程調(diào)用指令段內(nèi)直接調(diào)用指令格式:CALL過程名指令完成的操作:①(SP)←(SP)-2;②(SS:SP)←(IP);③(IP)←(IP)+16位偏移量。段內(nèi)間接調(diào)用指令格式:CALL寄存器指令完成的操作:①(SP)←(SP)-2;②(SS:SP)←(IP);③(IP)←寄存器的值。段間直接調(diào)用指令格式:CALLFARPTR過程名指令完成的操作:①(SP)←(SP)-2;②(SS:SP)←(CS);③(SP)←(SP)-2;④(SS:SP)←(IP);⑤(IP)←過程入口偏移地址;⑥(CS)←過程入口段地址。段間間接調(diào)用指令格式:CALLDWORDPTR存儲(chǔ)單元地址指令完成的操作:①(SP)←(SP)-2;②(SS:SP)←(CS);③(SP)←(SP)-2;④(SS:SP)←(IP);⑤(IP)←雙字存儲(chǔ)單元低16位數(shù)據(jù);⑥(CS)←雙字存儲(chǔ)單元高16位數(shù)據(jù)。B.過程返回指令無參數(shù)段內(nèi)返回格式:RET指令完成的操作:①(IP)←(SS:SP);

②(SP)←(SP)+2。RET子程序返回指令格式功能操作RET段內(nèi)返回IP<--((SP)+1,(SP))SP<--(SP)+2

RET段間返回IP<--((SP)+1,(SP))SP<--(SP)+2CS<--((SP)+1,(SP))SP<--(SP)+2

RETEXP帶立即數(shù)返回在上述操作之后再做

SP<--(SP)+EXP有參數(shù)段內(nèi)返回格式:RETn指令完成的操作:①(IP)←(SS:SP);

②(SP)←(SP)+2+n。無參數(shù)段間返回格式:RET指令完成的操作:①(IP)←(SS:SP);

②(SP)←(SP)+2。③(CS)←(SS:SP);

④(SP)←(SP)+2。有參數(shù)段間返回格式:RET指令完成的操作:①(IP)←(SS:SP);

②(SP)←(SP)+2。③(CS)←(SS:SP);

④(SP)←(SP)+2+n。(5)中斷指令中斷是輸入/輸出程序設(shè)計(jì)中常用的控制方式,是指計(jì)算機(jī)暫時(shí)停止當(dāng)前正在執(zhí)行的程序而轉(zhuǎn)去執(zhí)行處理某事件的中斷服務(wù)程序。當(dāng)中斷服務(wù)程序執(zhí)行完后,再恢復(fù)執(zhí)行被暫時(shí)停止的程序。常用的軟件中斷中斷號(hào)功能中斷號(hào)功能10H視頻服務(wù)中斷13H軟硬盤控制中斷14H串行口中斷15H各種IO設(shè)備中斷16H鍵盤中斷17H并行打印口中斷20H

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論