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

下載本文檔

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

文檔簡(jiǎn)介

匯編語言程序設(shè)計(jì)講授人:杜春來第3章指令系統(tǒng)與尋址方式講授人:杜春來教學(xué)重點(diǎn)重點(diǎn)掌握常用指令功能及應(yīng)用常用傳送指令加減法指令邏輯運(yùn)算和移位指令控制轉(zhuǎn)移指令字符(串)輸入輸出功能調(diào)用什么是指令系統(tǒng)計(jì)算機(jī)的指令系統(tǒng)就是指該計(jì)算機(jī)能夠執(zhí)行的全部指令的集合每種計(jì)算機(jī)都有它支持的指令集合

16位8086指令系統(tǒng)是Intel80x86系列微處理器指令系統(tǒng)的基礎(chǔ)Intel80x86系列微處理器指令系統(tǒng):整數(shù)指令浮點(diǎn)指令多媒體指令8086指令系統(tǒng)概述Intel8086指令系統(tǒng)共有117條基本指令可分成6個(gè)功能組①數(shù)據(jù)傳送類指令②算術(shù)運(yùn)算類指令③位操作類指令④串操作類指令⑤控制轉(zhuǎn)移類指令⑥處理機(jī)控制類指令學(xué)習(xí)指令的注意事項(xiàng)指令的功能——該指令能夠?qū)崿F(xiàn)何種操作。通常指令助記符就是指令功能的英文單詞或其縮寫形式指令支持的尋址方式——該指令中的操作數(shù)可以采用何種尋址方式指令對(duì)標(biāo)志的影響——該指令執(zhí)行后是否對(duì)各個(gè)標(biāo)志位有影響,以及如何影響其他方面——該指令其他需要特別注意的地方,如指令執(zhí)行時(shí)的約定設(shè)置、必須預(yù)置的參數(shù)、隱含使用的寄存器等匯編語言指令格式由4部分組成:標(biāo)號(hào):指令助記符目的操作數(shù),源操作數(shù);注釋

標(biāo)號(hào)表示該指令在主存中的邏輯地址

每個(gè)指令助記符就代表一種指令

目的和源操作數(shù)表示參與操作的對(duì)象

注釋是對(duì)該指令或程序段功能的說明教學(xué)提示全面而準(zhǔn)確地理解每條指令的功能和應(yīng)用,是編寫匯編語言程序的關(guān)鍵逐個(gè)展開指令3.1數(shù)據(jù)傳送類指令數(shù)據(jù)傳送是計(jì)算機(jī)中最基本、最重要的一種操作傳送指令也是最常使用的一類指令傳送指令把數(shù)據(jù)從一個(gè)位置傳送到另一個(gè)位置除標(biāo)志寄存器傳送指令外,均不影響標(biāo)志位重點(diǎn)掌握MOVXCHGPUSHPOPLEA3.1.1通用數(shù)據(jù)傳送指令提供方便靈活的通用傳送操作有3條指令MOVXCHGXLATMOVXCHGXLAT1.傳送指令MOV(move)把一個(gè)字節(jié)或字的操作數(shù)從源地址傳送至目的地址MOVreg/mem,imm;立即數(shù)送寄存器或主存例題3.1MOVreg/mem/seg,reg;寄存器送(段)寄存器或主存例題3.2MOVreg/seg,mem;主存送(段)寄存器例題3.3MOVreg/mem,seg;段寄存器送寄存器或主存例題3.5例3.1:立即數(shù)傳送moval,4 ;al←4,字節(jié)傳送movcx,0ffh ;cx←00ffh,字傳送movsi,200h ;si←0200h,字傳送movbyteptr[si],0ah;byteptr說明是字節(jié)操作movwordptr[si+2],0bh;wordptr說明是字操作

注意立即數(shù)是字節(jié)量還是字量明確指令是字節(jié)操作還是字操作MOV例3.2:寄存器傳送movax,bx ;ax←bx,字傳送movah,al ;ah←al,字節(jié)傳送movds,ax ;ds←ax,字傳送mov[bx],al ;[bx]←al,字節(jié)傳送MOV例3.3:存儲(chǔ)器傳送moval,[bx]movdx,[bp] ;dx←ss:[bp]moves,[si] ;es←ds:[si]

不存在存儲(chǔ)器向存儲(chǔ)器的傳送指令MOV例3.5:段寄存器傳送mov[si],dsmovax,es ;ax←esmovds,ax ;ds←ax←es

對(duì)段寄存器的操作有一些限制MOVMOV指令傳送功能MOV并非任意傳送立即數(shù)段寄存器DSESSSFSGS通用寄存器EAXEBXECXEDXEBPESPESIEDI存儲(chǔ)器非法傳送種種兩個(gè)操作數(shù)的類型不一致例如源操作數(shù)是字節(jié),而目的操作數(shù)是字;或相反兩個(gè)操作數(shù)不能都是存儲(chǔ)器傳送指令很靈活,但主存之間的直接傳送卻不允許段寄存器的操作有一些限制段寄存器屬專用寄存器,對(duì)他們的操作能力有限示例示例示例兩個(gè)操作數(shù)的類型要一致絕大多數(shù)雙操作數(shù)指令,除非特別說明,目的操作數(shù)與源操作數(shù)必須類型一致,否則為非法指令MOVAL,050AH;非法指令:050Ah為字,而AL為字節(jié)寄存器有明確的字節(jié)或字類型,有寄存器參與的指令其操作數(shù)類型就是寄存器的類型對(duì)于存儲(chǔ)器單元與立即數(shù)同時(shí)作為操作數(shù)的情況,必須顯式指明;byteptr指示字節(jié)類型,wordptr指示字類型第3章兩個(gè)操作數(shù)不能都是存儲(chǔ)器8086指令系統(tǒng)不允許兩個(gè)操作數(shù)都是存儲(chǔ)單元(除串操作指令),要實(shí)現(xiàn)這種傳送,可通過寄存器間接實(shí)現(xiàn)movax,buffer1;ax←buffer1(將buffer1內(nèi)容送ax)movbuffer2,ax;buffer2←ax;這里buffer1和buffer2是兩個(gè)字變量;實(shí)際表示直接尋址方式第3章要小心段寄存器的操作不允許立即數(shù)傳送給段寄存器MOVDS,100H;非法指令:立即數(shù)不能傳送段寄存器不允許直接改變CS值MOVCS,[SI]

;不允許使用的指令不允許段寄存器之間的直接數(shù)據(jù)傳送MOVDS,ES;非法指令:不允許段寄存器間傳送第3章2.交換指令XCHG(exchange)把兩個(gè)地方的數(shù)據(jù)進(jìn)行互換寄存器與寄存器之間對(duì)換數(shù)據(jù)寄存器與存儲(chǔ)器之間對(duì)換數(shù)據(jù)不能在存儲(chǔ)器與存儲(chǔ)器之間對(duì)換數(shù)據(jù)XCHGreg,reg/mem;reg

reg/mem例題3.7例題3.6例3.6:寄存器間交換movax,1234h

;ax=1234hmovbx,5678h ;bx=5678hxchgax,bx;ax=5678h,bx=1234hxchgah,al ;ax=7856hXCHG例3.7:寄存器與存儲(chǔ)器交換xchgax,[2000h]

;字交換;等同于

xchg[2000h],axxchgal,[2000h]

;字節(jié)交換;等同于

xchg[2000h],al

XCHG換碼指令執(zhí)行前: 主存建立一個(gè)字節(jié)量表格,含要轉(zhuǎn)換成的目的代碼 表格首地址存放于BX,AL存放相對(duì)表格首的位移量換碼指令執(zhí)行后:將AL寄存器的內(nèi)容轉(zhuǎn)換為目標(biāo)代碼3.換碼指令XLAT(translate)將BX指定的緩沖區(qū)中、AL指定的位移處的一個(gè)字節(jié)數(shù)據(jù)取出賦給ALXLAT

;al←ds:[bx+al]例題3.8例3.8:代碼轉(zhuǎn)換movbx,100hmoval,03hxlat

換碼指令沒有顯式的操作數(shù),但使用了BX和AL;因?yàn)閾Q碼指令使用了隱含尋址方式——采用默認(rèn)操作數(shù)XLAT3.1.2堆棧操作指令堆棧:后進(jìn)先出FILO,位于堆棧段;SS段寄存器記錄其段地址堆棧只有一個(gè)出口,即當(dāng)前棧頂;用堆棧指針寄存器SP指定堆棧和隊(duì)列堆棧:按照后進(jìn)先出(LIFO)的原則組織的存儲(chǔ)器空間(棧)隊(duì)列:按照先進(jìn)先出(FIFO)的原則組織的存儲(chǔ)器空間(堆)LIFOFIFO第3章堆棧的操作堆棧只有兩種基本操作:進(jìn)棧和出棧,對(duì)應(yīng)2類指令PUSH和POPWord1Word2Word3Word4Word5StackPUSHPOPPUSH

;進(jìn)棧指令先使堆棧指針SP減2,然后把一個(gè)字操作數(shù)存入堆棧頂部POP

;出棧指令把棧頂?shù)囊粋€(gè)字傳送至指定的目的操作數(shù),然后堆棧指針SP加21.進(jìn)棧指令PUSH(16位)pushaxpush[2000h]PUSHr16/m16/seg;SP←SP-2;SS:[SP]←r16/m16/segWordStackPUSHSP-21.進(jìn)棧指令PUSH(32位)pushEAXpush[EAX]PUSHr32/m32/seg;ESP←ESP-4;SS:[ESP]←r32/m32/segDWordStackPUSHESP-41.進(jìn)棧指令PUSHA與PUSHADAXStackPUSHASP-16CXDXBXSPBPSIDIEAXStackPUSHADSP-32ECXEDXEBXESPEBPESIEDI2.出棧指令POP(16位)popaxpop[2000h]POPr16/m16/seg;r16/m16/seg←SS:[SP];SP←SP+2WordStackPOPSP+22.出棧指令POP(32位)popEAXpop[EAX]POPr32/m32/seg;r32/m32/seg←SS:[ESP];ESP←ESP+4DWordStackPOPESP+42.出棧指令POPA與POPADAXStackPOPASP+16CXDXBXSPBPSIDIEAXStackPOPADESP+32ECXEDXEBXESPEBPESIEDI堆棧的特點(diǎn)堆棧操作的單位是字,進(jìn)棧和出棧只對(duì)字量字量數(shù)據(jù)從棧頂壓入和彈出時(shí),都是低地址字節(jié)送低字節(jié),高地址字節(jié)送高字節(jié)堆棧操作遵循先進(jìn)后出原則,但可用存儲(chǔ)器尋址方式隨機(jī)存取堆棧中的數(shù)據(jù)堆棧常用來臨時(shí)存放數(shù)據(jù)傳遞參數(shù)保存和恢復(fù)寄存器例題3.11例3.11:現(xiàn)場(chǎng)保護(hù)恢復(fù)pushax ;進(jìn)入子程序后pushbxpushds...popds ;返回主程序前popbxpopax3.1.3標(biāo)志傳送指令標(biāo)志寄存器傳送指令用來傳送標(biāo)志寄存器FLAGS的內(nèi)容標(biāo)志位操作指令直接對(duì)CF、DF、IF標(biāo)志進(jìn)行復(fù)位或置位1.標(biāo)志寄存器傳送標(biāo)志寄存器傳送指令用來傳送標(biāo)志寄存器FLAGS的內(nèi)容,方便進(jìn)行對(duì)各個(gè)標(biāo)志位的直接操作有2對(duì)4條指令低8位傳送:LAHF和SAHF16位傳送:PUSHF和POPF32位傳送:PUSHFD和POPFD標(biāo)志低字節(jié)進(jìn)出AH指令LAHF;AH←FLAGS的低字節(jié)LAHF指令將標(biāo)志寄存器的低字節(jié)送寄存器AHSF/ZF/AF/PF/CF狀態(tài)標(biāo)志位分別送入AH的第7/6/4/2/0位,而AH的第5/3/1位任意SAHF;FLAGS的低字節(jié)←AHSAHF將AH寄存器內(nèi)容送FLAGS的低字節(jié)用AH的第7/6/4/2/0位相應(yīng)設(shè)置SF/ZF/AF/PF/CF標(biāo)志標(biāo)志寄存器進(jìn)出堆棧指令PUSHF;SP←SP-2;SS:[SP]←FLAGSPUSHF指令將標(biāo)志寄存器的內(nèi)容壓入堆棧,同時(shí)棧頂指針SP減2POPF;FLAGS←SS:[SP];SP←SP+2POPF指令將棧頂字單元內(nèi)容送標(biāo)志寄存器,同時(shí)棧頂指針SP加2例題3.12標(biāo)志寄存器進(jìn)出堆棧指令PUSHFD;ESP←ESP-4;SS:[ESP]←EFLAGSPUSHFD指令將標(biāo)志寄存器的內(nèi)容壓入堆棧,同時(shí)棧頂指針ESP減4POPFD;EFLAGS←SS:[ESP];ESP←ESP+4POPFD指令將棧頂字單元內(nèi)容送標(biāo)志寄存器,同時(shí)棧頂指針ESP加4例3.12:置位單步標(biāo)志pushf ;保存全部標(biāo)志到堆棧popax ;堆棧中取出全部標(biāo)志orax,0100h ;設(shè)置D8=TF=1,

;ax其他位不變pushax ;將ax壓入堆棧popf

;FLAGS←AX;將堆棧內(nèi)容取到標(biāo)志寄存器2.標(biāo)志位操作標(biāo)志位操作指令直接對(duì)CF、DF、IF標(biāo)志進(jìn)行復(fù)位或置位,常用于特定的情況對(duì)標(biāo)志位進(jìn)行設(shè)置的指令CLCSTCCMCCLDSTDCLISTI進(jìn)位標(biāo)志操作指令用于任意設(shè)置進(jìn)位標(biāo)志CLC

;復(fù)位進(jìn)位標(biāo)志:CF←0STC

;置位進(jìn)位標(biāo)志:CF←1CMC

;求反進(jìn)位標(biāo)志:CF←~CF方向標(biāo)志操作指令串操作指令中,需要使用CLD

;復(fù)位方向標(biāo)志:DF←0STD

;置位方向標(biāo)志:DF←1中斷標(biāo)志操作指令在編寫中斷服務(wù)程序時(shí),需要控制可屏蔽中斷的允許和禁止CLI

;復(fù)位中斷標(biāo)志:DF←0STI ;置位中斷標(biāo)志:DF←13.1.4地址傳送指令地址傳送指令將存儲(chǔ)器單元的邏輯地址送至指定的寄存器有效地址傳送指令LEA指針傳送指令LDS、LES、LFS、LGS和LSS注意:LEA不是獲取存儲(chǔ)器單元的內(nèi)容有效地址傳送指令LEA(loadEA)將存儲(chǔ)器操作數(shù)的有效地址傳送至指定的16位或32位寄存器中例題3.13LEAr16/r32,mem;r16/r32←mem的有效地址EA例3.13:獲取有效地址movbx,0400hmovsi,3chleabx,[bx+si+0f62h];BX=0400h+003ch+0f62h=139EH

獲得主存單元的有效地址;不是物理地址,也不是該單元的內(nèi)容可以實(shí)現(xiàn)計(jì)算功能LEA指針傳送指令LDSr16/r32,mem;r16/r32←mem,;DS←mem+2LDS指令將主存中mem指定的字送至r16/r32,并將mem的下一字送DS寄存器LESr16/r32,mem;r16/r32←mem,;ES←mem+2LES指令將主存中mem指定的字送至r16/r32,并將mem的下一字送ES寄存器例題3.14LFSLGSLSS與此操作一樣例3.14:地址指針傳送movwordptr[3060h],0100hmovwordptr[3062h],1450hlesdi,[3060h] ;es=1450h,di=0100hldssi,[3060h] ;ds=1450h,si=0100h

mem指定主存的連續(xù)4個(gè)字節(jié)作為邏輯地址(32位的地址指針),送入DS:r16或ES:r163.1.5輸入輸出指令8086通過輸入輸出指令與外設(shè)進(jìn)行數(shù)據(jù)交換;呈現(xiàn)給程序員的外設(shè)是端口(Port)即I/O地址8086用于尋址外設(shè)端口的地址線為16條,端口最多為216=65536(64K)個(gè),端口號(hào)為0000H~FFFFH每個(gè)端口用于傳送一個(gè)字節(jié)的外設(shè)數(shù)據(jù)輸入輸出尋址方式8086的端口有64K個(gè),無需分段,設(shè)計(jì)有兩種尋址方式直接尋址:只用于尋址00H~FFH前256個(gè)端口,操作數(shù)i8表示端口號(hào)間接尋址:可用于尋址全部64K個(gè)端口,DX寄存器的值就是端口號(hào)大于FFH的端口只能采用間接尋址方式輸入指令I(lǐng)N將外設(shè)數(shù)據(jù)傳送給CPU內(nèi)的AL/AXINAL,i8;字節(jié)輸入:AL←I/O端口(i8直接尋址)INAL,DX;字節(jié)輸入:AL←I/O端口(DX間接尋址)INAX,i8;字輸入:AX←I/O端口(i8直接尋址)INAX,DX;字輸入:AX←I/O端口(DX間接尋址)例題3.15例3.15:輸入字量;直接尋址,字節(jié)量輸入inal,21hmovah,alinal,20h;直接尋址,字量輸入inax,20h;間接尋址,字量輸入movdx,20hinax,dxIN輸出指令OUT將CPU內(nèi)的AL/AX數(shù)據(jù)傳送給外設(shè)OUTi8,AL;字節(jié)輸出:I/O端口←AL(i8直接尋址)OUTDX,AL;字節(jié)輸出:I/O端口←AL(DX間接尋址)OUTi8,AX;字輸出:I/O端口←AX(i8直接尋址)OUTDX,AX;字輸出:I/O端口←AX(DX間接尋址)例題3.16例3.16:輸出字節(jié)量;間接尋址,字節(jié)量輸出movdx,3fchmoval,80houtdx,alOUT3.2算術(shù)運(yùn)算類指令四則運(yùn)算是計(jì)算機(jī)經(jīng)常進(jìn)行的一種操作。算術(shù)運(yùn)算指令實(shí)現(xiàn)二進(jìn)制(和十進(jìn)制)數(shù)據(jù)的四則運(yùn)算請(qǐng)注意算術(shù)運(yùn)算類指令對(duì)標(biāo)志的影響掌握:ADD/ADC/INC、SUB/SBB/DEC/NEG/CMP熟悉:MUL/IMUL、DIV/IDIV理解:CBW/CWD、DAA/DAS、AAA/AAS/AAM/AAD加法指令A(yù)DDADD指令將源與目的操作數(shù)相加,結(jié)果送到目的操作數(shù)ADD指令按狀態(tài)標(biāo)志的定義相應(yīng)設(shè)置ADDreg,imm/reg/mem

;reg←reg+imm/reg/memADDmem,imm/reg

;mem←mem+imm/reg例題3.17a例3.17a:加法運(yùn)算moval,0fbh ;al=0fbhaddal,07h

;al=02hmovwordptr[200h],4652h;[200h]=4652hmovbx,1feh

;bx=1fehaddal,bl ;al=00haddwordptr[bx+2],0f0f0h;[200h]=3742hADD帶進(jìn)位加法指令A(yù)DCADC指令將源與目的操作數(shù)相加,再加上進(jìn)位CF標(biāo)志,結(jié)果送到目的操作數(shù)ADC指令按狀態(tài)標(biāo)志的定義相應(yīng)設(shè)置ADC指令主要與ADD配合,實(shí)現(xiàn)多精度加法運(yùn)算ADCreg,imm/reg/mem

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

;mem←mem+imm/reg+CF例題3.17b例3.17b:雙字加法movax,4652h ;ax=4652haddax,0f0f0h ;ax=3742h,CF=1movdx,0234h ;dx=0234hadcdx,0f0f0h ;dx=f325h,CF=0;DX.AX=02344652H

+F0F0F0F0H

=F3253742HADC增量指令I(lǐng)NC(increment)INC指令對(duì)操作數(shù)加1(增量)INC指令不影響進(jìn)位CF標(biāo)志,按定義設(shè)置其他狀態(tài)標(biāo)志INCreg/mem;reg/mem←reg/mem+1incbxincbyteptr[bx]減法指令SUB(subtract)SUB指令將目的操作數(shù)減去源操作數(shù),結(jié)果送到目的操作數(shù)SUB指令按照定義相應(yīng)設(shè)置狀態(tài)標(biāo)志SUBreg,imm/reg/mem

;reg←reg-imm/reg/memSUBmem,imm/reg

;mem←mem-imm/reg例題3.18a例3.18a:減法運(yùn)算moval,0fbh ;al=0fbhsubal,07h

;al=0f4h,CF=0movwordptr[200h],4652h;[200h]=4652hmovbx,1feh

;bx=1fehsubal,bl ;al=0f6hsubwordptr[bx+2],0f0f0h;[200h]=5562h,CF=1SUB帶借位減法指令SBBSBB指令將目的操作數(shù)減去源操作數(shù),再減去借位CF(進(jìn)位),結(jié)果送到目的操作數(shù)。SBB指令按照定義相應(yīng)設(shè)置狀態(tài)標(biāo)志SBB指令主要與SUB配合,實(shí)現(xiàn)多精度減法運(yùn)算SBBreg,imm/reg/mem

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

;mem←mem-imm/reg-CF例題3.18b例3.18b:雙字減法movax,4652h ;ax=4652hsubax,0f0f0h ;ax=5562h,CF=1movdx,0234h ;dx=0234hsbbdx,0f0f0h ;dx=1143h,CF=1;DX.AX=02344652H

-F0F0F0F0H

=11435562HSBB減量指令DEC(decrement)DEC指令對(duì)操作數(shù)減1(減量)DEC指令不影響進(jìn)位CF標(biāo)志,按定義設(shè)置其他狀態(tài)標(biāo)志DECreg/mem;reg/mem←reg/mem-1deccxdecwordptr[si]INC指令和DEC指令都是單操作數(shù)指令主要用于對(duì)計(jì)數(shù)器和地址指針的調(diào)整求補(bǔ)指令NEG(negative)NEG指令對(duì)操作數(shù)執(zhí)行求補(bǔ)運(yùn)算:用零減去操作數(shù),然后結(jié)果返回操作數(shù)求補(bǔ)運(yùn)算也可以表達(dá)成:將操作數(shù)按位取反后加1NEG指令對(duì)標(biāo)志的影響與用零作減法的SUB指令一樣NEGreg/mem;reg/mem←0-reg/mem例題3.19例3.19:求補(bǔ)運(yùn)算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=0NEG比較指令CMP(compare)CMP指令將目的操作數(shù)減去源操作數(shù),按照定義相應(yīng)設(shè)置狀態(tài)標(biāo)志CMP指令執(zhí)行的功能與SUB指令,但結(jié)果不回送目的操作數(shù)CMPreg,imm/reg/mem

;reg-imm/reg/memCMPmem,imm/reg

;mem-imm/reg例題3.20例3.20:比較AL與100

cmpal,100

;al-100 jbbelow

;al<100,跳轉(zhuǎn)到below執(zhí)行

subal,100

;al≥100,al←al-100 incah

;ah←ah+1below: ...

執(zhí)行比較指令之后,可以根據(jù)標(biāo)志判斷兩個(gè)數(shù)是否相等、大小關(guān)系等CMP3.2.3乘法指令MULr8/m8;無符號(hào)字節(jié)乘法;AX←AL×r8/m8MULr16/m16;無符號(hào)字乘法;DX.AX←AX×r16/m16MULr32/m32;無符號(hào)字乘法;EDX.EAX←EAX×r32/m32IMULr8/m8;有符號(hào)字節(jié)乘法;AX←AL×r8/m8IMULr16/m16;有符號(hào)字乘法;DX.AX←AX×r16/m16IMULr32/m32;有符號(hào)字乘法;EDX.EAX←EAX×r32/m32例題3.21說明乘法指令的功能乘法指令分無符號(hào)和有符號(hào)乘法指令乘法指令的源操作數(shù)顯式給出,隱含使用另一個(gè)操作數(shù)AX和DX字節(jié)量相乘:AL與r8/m8相乘,得到16位的結(jié)果,存入AX字量相乘:AX與r16/m16相乘,得到32位的結(jié)果,其高字存入DX,低字存入AX雙字量相乘:EAX與r32/m32相乘,得到64位的結(jié)果,其高字存入EDX,低字存入EAX乘法指令利用OF和CF判斷乘積的高一半是否具有有效數(shù)值第3章乘法指令對(duì)標(biāo)志的影響乘法指令如下影響OF和CF標(biāo)志:MUL指令——若乘積的高一半(AH或DX)為0,則OF=CF=0;否則OF=CF=1IMUL指令——若乘積的高一半是低一半的符號(hào)擴(kuò)展,則OF=CF=0;否則均為1乘法指令對(duì)其他狀態(tài)標(biāo)志沒有定義

對(duì)標(biāo)志沒有定義:指令執(zhí)行后這些標(biāo)志是任意的、不可預(yù)測(cè)(就是誰也不知道是0還是1)對(duì)標(biāo)志沒有影響:指令執(zhí)行不改變標(biāo)志狀態(tài)第3章例3.21:乘法運(yùn)算moval,0b4h ;al=b4h=180movbl,11h ;bl=11h=17mulbl

;ax=Obf4h=3060;OF=CF=1,AX高8位不為0moval,0b4h ;al=b4h=-76movbl,11h ;bl=11h=17imulbl ;ax=faf4h=-1292;OF=CF=1,AX高8位含有效數(shù)字3.2.4除法指令DIVr8/m8

;無符號(hào)字節(jié)除法:AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余數(shù)DIVr16/m16 ;無符號(hào)字除法:;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余數(shù)DIVr32/m32 ;無符號(hào)字除法:;EAX←EDX.EAX÷r32/m32的商,EDX←EDX.EAX÷r32/m32的余數(shù)IDIVr8/m8 ;有符號(hào)字節(jié)除法:AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余數(shù)IDIVr16/m16

;有符號(hào)字除法:;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余數(shù)IDIVr32/m32

;有符號(hào)字除法:;EAX←EDX.EAX÷r32/m32的商,EDX←EDX.EAX÷r32/m32的余數(shù)例題3.22說明除法指令的功能除法指令分無符號(hào)和有符號(hào)除法指令除法指令的除數(shù)顯式給出,隱含使用另一個(gè)操作數(shù)AX和DX作為被除數(shù)字節(jié)量除法:AX除以r8/m8,8位商存入AL,8位余數(shù)存入AH字量除法:DX.AX除以r16/m16,16位商存入AX,16位余數(shù)存入DX雙字量除法:EDX.EAX除以r32/m32,32位商存入EAX,32位余數(shù)存入EDX除法指令對(duì)標(biāo)志沒有定義除法指令會(huì)產(chǎn)生結(jié)果溢出第3章除法錯(cuò)中斷當(dāng)被除數(shù)遠(yuǎn)大于除數(shù)時(shí),所得的商就有可能超出它所能表達(dá)的范圍。如果存放商的寄存器AL/AX不能表達(dá),便產(chǎn)生溢出,8086CPU中就產(chǎn)生編號(hào)為0的內(nèi)部中斷——除法錯(cuò)中斷對(duì)DIV指令,除數(shù)為0,或者在字節(jié)除時(shí)商超過8位,或者在字除時(shí)商超過16位對(duì)IDIV指令,除數(shù)為0,或者在字節(jié)除時(shí)商不在-128~127范圍內(nèi),或者在字除時(shí)商不在-32768~32767范圍內(nèi)第3章例3.22:除法運(yùn)算movax,0400h ;ax=400h=1024movbl,0b4h ;bl=b4h=180divbl

;商al=05h=5

;余數(shù)ah=7ch=124movax,0400h ;ax=400h=1024movbl,0b4h ;bl=b4h=-76idivbl

;商al=f3h=-13

;余數(shù)ah=24h=363.2.5符號(hào)擴(kuò)展指令CBW

;AL的符號(hào)擴(kuò)展至AH;如AL的最高有效位是0,則AH=00;AL的最高有效位為1,則AH=FFH。AL不變CWD

;AX的符號(hào)擴(kuò)展至DX;如AX的最高有效位是0,則DX=00;AX的最高有效位為1,則DX=FFFFH。AX不變什么是符號(hào)擴(kuò)展符號(hào)擴(kuò)展指令常用于獲得倍長(zhǎng)的數(shù)據(jù)例題3.23例題3.24CDQ

;EAX的符號(hào)擴(kuò)展至EDX;如EAX的最高有效位是0,則EDX=00000000;EAX的最高有效位為1,則EDX=FFFFFFFFH。EAX不變符號(hào)擴(kuò)展的概念符號(hào)擴(kuò)展是指用一個(gè)操作數(shù)的符號(hào)位(即最高位)形成另一個(gè)操作數(shù),后一個(gè)操作數(shù)的各位是全0(正數(shù))或全1(負(fù)數(shù))。符號(hào)擴(kuò)展不改變數(shù)據(jù)大小對(duì)于數(shù)據(jù)64H(表示數(shù)據(jù)100),其最高位D7為0,符號(hào)擴(kuò)展后高8位都是0,成為0064H(仍表示數(shù)據(jù)100)對(duì)于數(shù)據(jù)FF00H(表示有符號(hào)數(shù)-256),其最高位D15為1,符號(hào)擴(kuò)展后高16位都是1,成為FFFFFF00H(仍表示有符號(hào)數(shù)-256)第3章例3.23:符號(hào)擴(kuò)展moval,80h

;al=80hcbw

;ax=ff80haddal,255 ;al=7fhcbw

;ax=007fh例3.24:AX÷BXcwd

;DX.AX←AXidivbx ;AX←DX.AX÷BX

對(duì)有符號(hào)數(shù)除法,可以利用符號(hào)擴(kuò)展指令得到倍長(zhǎng)于除數(shù)的被除數(shù)對(duì)無符號(hào)數(shù)除法,采用直接使高8位或高16位清0,獲得倍長(zhǎng)的被除數(shù)。這就是零位擴(kuò)展3.2.6十進(jìn)制調(diào)整指令壓縮BCD碼就是通常的8421碼;它用4個(gè)二進(jìn)制位表示一個(gè)十進(jìn)制位,一個(gè)字節(jié)可以表示兩個(gè)十進(jìn)制位,即00~99非壓縮BCD碼用8個(gè)二進(jìn)制位表示一個(gè)十進(jìn)制位,只用低4個(gè)二進(jìn)制位表示一個(gè)十進(jìn)制位0~9,高4位任意,通常默認(rèn)為0十進(jìn)制數(shù)調(diào)整指令對(duì)二進(jìn)制運(yùn)算的結(jié)果進(jìn)行十進(jìn)制調(diào)整,以得到十進(jìn)制的運(yùn)算結(jié)果分成壓縮BCD碼和非壓縮BCD碼調(diào)整BCD碼(BinaryCodedDecimal)二進(jìn)制編碼的十進(jìn)制數(shù):一位十進(jìn)制數(shù)用4位二進(jìn)制編碼來表示8086支持壓縮BCD碼和非壓縮BCD碼的調(diào)整運(yùn)算真值 8 64二進(jìn)制編碼 08H

40H壓縮BCD碼 08H

64H非壓縮BCD碼 08H

0604H壓縮BCD碼加、減調(diào)整指令(ADDAL,i8/r8/m8)(ADCAL,i8/r8/m8)DAA;AL←將AL的加和調(diào)整為壓縮BCD碼(SUBAL,i8/r8/m8)(SBBAL,i8/r8/m8)DAS;AL←將AL的減差調(diào)整為壓縮BCD碼使用DAA或DAS指令前,應(yīng)先執(zhí)行以AL為目的操作數(shù)的加法或減法指令DAA和DAS指令對(duì)OF標(biāo)志無定義,按結(jié)果影響其他標(biāo)志,例如CF反映壓縮BCD碼相加或減的進(jìn)位或借位狀態(tài)例題3.25a例題3.25b例題3.26例3.25a:壓縮BCD加法moval,68h;al=68h,壓縮BCD碼表示真值68movbl,28h;bl=28h,壓縮BCD碼表示真值28addal,bl;二進(jìn)制加法:al=68h+28h=90hdaa

;十進(jìn)制調(diào)整:al=96h;實(shí)現(xiàn)壓縮BCD碼加法:68+28=96例3.25b:壓縮BCD減法moval,68h;al=68h,壓縮BCD碼表示真值68movbl,28h;bl=28h,壓縮BCD碼表示真值28subal,bl;二進(jìn)制減法:al=68h-28h=40hdas

;十進(jìn)制調(diào)整:al=40h;實(shí)現(xiàn)壓縮BCD碼加法:68-28=40例3.26:壓縮BCD減法movax,1234hmovbx,4612hsubal,bldas

;34-12=22,CF=0xchgal,ahsbbal,bhdas

;12-46=66,CF=1xchgal,ah ;11234-4612=6622非壓縮BCD碼加、減調(diào)整指令(ADDAL,i8/r8/m8)(ADCAL,i8/r8/m8)AAA;AL←將AL的加和調(diào)整為非壓縮BCD碼;AH←AH+調(diào)整的進(jìn)位(SUBAL,i8/r8/m8)(SBBAL,i8/r8/m8)AAS;AL←將AL的減差調(diào)整為非壓縮BCD碼;AH←AH-調(diào)整的借位使用AAA或AAS指令前,應(yīng)先執(zhí)行以AL為目的操作數(shù)的加法或減法指令A(yù)AA和AAS指令在調(diào)整中產(chǎn)生了進(jìn)位或借位,則AH要加上進(jìn)位或減去借位,同時(shí)CF=AF=1,否則CF=AF=0;它們對(duì)其他標(biāo)志無定義例題3.27a例題3.27b例3.27a:非壓縮BCD加movax,0608h;ax=0608h,非壓縮BCD碼表示真值68movbl,09h;bl=09h,非壓縮BCD碼表示真值9addal,bl;二進(jìn)制加法:al=08h+09h=11haaa;十進(jìn)制調(diào)整:ax=0707h;實(shí)現(xiàn)非壓縮BCD碼加法:68+9=77例3.27b:非壓縮BCD減movax,0608h;ax=0608h,非壓縮BCD碼表示真值68movbl,09h;bl=09h,非壓縮BCD碼表示真值9subal,bl;二進(jìn)制減法:al=08h-09h=ffhaas;十進(jìn)制調(diào)整:ax=0509h;實(shí)現(xiàn)非壓縮BCD碼減法:68-9=59非壓縮BCD碼乘、除調(diào)整指令(MULr8/m8)AAM;AX←將AX的乘積調(diào)整為非壓縮BCD碼AAD;AX←將AX中非壓縮BCD碼擴(kuò)展成二進(jìn)制數(shù)(DIVr8/m8)AAM指令跟在字節(jié)乘MUL之后,將乘積調(diào)整為非壓縮BCD碼AAD指令跟在字節(jié)除DIV之前,先將非壓縮BCD碼的被除數(shù)調(diào)整為二進(jìn)制數(shù)AAM和AAD指令根據(jù)結(jié)果設(shè)置SF、ZF和PF,但對(duì)OF、CF和AF無定義例題3.27c例題3.27d例3.27c:非壓縮BCD乘movax,0608h;ax=0608h,非壓縮BCD碼表示真值68movbl,09h;bl=09h,非壓縮BCD碼表示真值9mulbl;二進(jìn)制乘法:al=08h×09h=0048haam;十進(jìn)制調(diào)整:ax=0702h;實(shí)現(xiàn)非壓縮BCD碼乘法:8×9=72例3.27d:非壓縮BCD除movax,0608h;ax=0608h,非壓縮BCD碼表示真值68movbl,09h;bl=09h,非壓縮BCD碼表示真值9aam;二進(jìn)制擴(kuò)展:ax=68=0044hdivbl;除法運(yùn)算:商al=07h,余數(shù)ah=05h;實(shí)現(xiàn)非壓縮BCD碼初法:

68÷9=7(余5)教學(xué)提示在正確理解每條指令的功能基礎(chǔ)上,可以閱讀和編寫有實(shí)際意義的程序段多多閱讀程序段3.3位操作類指令位操作類指令以二進(jìn)制位為基本單位進(jìn)行數(shù)據(jù)的操作這是一類常用的指令,都應(yīng)該掌握注意這些指令對(duì)標(biāo)志位的影響1、邏輯運(yùn)算指令A(yù)NDORXORNOTTEST2

、位操作指令

BTBTSBTRBTCBSFBSR3、移位指令SHLSHRSAR4、循環(huán)移位指令ROLRORRCLRCR邏輯與指令A(yù)ND對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯與運(yùn)算,結(jié)果送到目的操作數(shù)AND指令設(shè)置CF=OF=0,根據(jù)結(jié)果設(shè)置SF、ZF和PF狀態(tài),而對(duì)AF未定義ANDreg,imm/reg/mem ;reg←reg∧imm/reg/memANDmem,imm/reg ;mem←mem∧imm/reg

只有相“與”的兩位都是1,結(jié)果才是1;否則,“與”的結(jié)果為0邏輯或指令OR對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯或運(yùn)算,結(jié)果送到目的操作數(shù)OR指令設(shè)置CF=OF=0,根據(jù)結(jié)果設(shè)置SF、ZF和PF狀態(tài),而對(duì)AF未定義ORreg,imm/reg/mem ;reg←reg∨imm/reg/memORmem,imm/reg

;mem←mem∨imm/reg

只要相“或”的兩位有一位是1,結(jié)果就是1;否則,結(jié)果為0邏輯異或指令XOR對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯異或運(yùn)算,結(jié)果送到目的操作數(shù)XOR指令設(shè)置CF=OF=0,根據(jù)結(jié)果設(shè)置SF、ZF和PF狀態(tài),而對(duì)AF未定義XORreg,imm/reg/mem ;reg←reg⊕imm/reg/memXORmem,imm/reg ;mem←mem⊕imm/reg

只有相“異或”的兩位不相同,結(jié)果才是1;否則,結(jié)果為0邏輯非指令NOT對(duì)一個(gè)操作數(shù)執(zhí)行邏輯非運(yùn)算NOT指令是一個(gè)單操作數(shù)指令NOT指令不影響標(biāo)志位NOTreg/mem ;reg/mem←~reg/mem

按位取反,原來是“0”的位變?yōu)椤?”;原來是“1”的位變?yōu)椤?”例題:邏輯運(yùn)算moval,45h ;邏輯與al=01handal,31h

;CF=OF=0,SF=0、ZF=0、PF=0moval,45h

;邏輯或al=75horal,31h

;CF=OF=0,SF=0、ZF=0、PF=0moval,45h

;邏輯異或al=74hxoral,31h

;CF=OF=0,SF=0、ZF=0、PF=1moval,45h

;邏輯非al=0bahnotal

;標(biāo)志不變例題:邏輯指令應(yīng)用;AND指令可用于復(fù)位某些位(同0相與),不影響其他位:將BL中D3和D0位清0,其他位不變andbl,11110110B;OR指令可用于置位某些位(同1相或),不影響其他位:將BL中D3和D0位置1,其他位不變orbl,00001001B;XOR指令可用于求反某些位(同1相異或),不影響其他位:將BL中D3和D0位求反,其他不變xorbl,00001001B測(cè)試指令TEST對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯與運(yùn)算,結(jié)果不回送到目的操作數(shù)TEST指令設(shè)置CF=OF=0,根據(jù)結(jié)果設(shè)置SF、ZF和PF狀態(tài),而對(duì)AF未定義TESTreg,imm/reg/mem

;reg∧imm/reg/memTESTmem,imm/reg ;mem∧imm/reg只有相“與”的兩位都是1,結(jié)果才是1;否則,“與”的結(jié)果為0例3.32:測(cè)試為0或1testal,01h

;測(cè)試AL的最低位D0jnzthere ;標(biāo)志ZF=0,即D0=1

;則程序轉(zhuǎn)移到there... ;否則ZF=1,即D0=0,順序執(zhí)行there:...TEST指令通常用于檢測(cè)一些條件是否滿足,但又不希望改變?cè)僮鲾?shù)的情況TEST位測(cè)試指令BT位測(cè)試,將測(cè)試位的值賦給CFBTmem/r,imm/rBTS位測(cè)試,位值賦給CF并設(shè)置1BTSmem/r,imm/rBTR位測(cè)試,位值賦給CF并設(shè)置0BTRmem/r,imm/rBTC位測(cè)試,位值賦給CF后變反BTCmem/r,imm/r僅僅影響CF目的操作數(shù)mem/reg

必須是字或雙字位的計(jì)數(shù):從右向左計(jì)數(shù),從0開始計(jì)數(shù)示例:

movax,2311hmovcx,15btax,cx;測(cè)試第15位,將結(jié)果送CFbtrax,2;測(cè)試第2位,將結(jié)果送CF,并清0btsax,3

;測(cè)試第3位,將結(jié)果送CF,并置1btax,199注意:源操作數(shù)的值要小于目的操作數(shù)的位個(gè)數(shù)X位掃描指令目的是檢索源操作數(shù)中第一個(gè)“1”的位置,如遇到第一個(gè)為1的位,則將ZF設(shè)置為0,

溫馨提示

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