大三上限選匯編語言課件第3章_第1頁
大三上限選匯編語言課件第3章_第2頁
大三上限選匯編語言課件第3章_第3頁
大三上限選匯編語言課件第3章_第4頁
大三上限選匯編語言課件第3章_第5頁
已閱讀5頁,還剩135頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

3.380x86的指令系統(tǒng)80x86的指令系統(tǒng)中共有136種基本指令,可以分成6個(gè)功能組:

數(shù)據(jù)傳送(Datatransfer)25

算術(shù)運(yùn)算(Arithmetic)21

邏輯運(yùn)算和移位指令(Logic&Shift)21

串處理(Stringmanipulation)7

控制轉(zhuǎn)移(ControlTransfer) 47

處理機(jī)控制(ProcessorControl)15先介紹以下內(nèi)容:1.

學(xué)習(xí)指令的要點(diǎn)2.

指令中操作數(shù)的表示3.

書寫指令注意事項(xiàng)先介紹以下內(nèi)容:1.

指令助記符表2.

學(xué)習(xí)指令的要點(diǎn)3.

利用DEBUG程序,學(xué)習(xí)指令系統(tǒng)4.

指令中操作數(shù)的表示5.

書寫指令注意事項(xiàng)1.指令助記符表1.學(xué)習(xí)指令的要點(diǎn)從以下幾個(gè)方面來掌握一條指令:

指令的助記符

指令的格式:操作數(shù)的個(gè)數(shù)、類型(B,W,DW)

執(zhí)行的操作:指令執(zhí)行后的結(jié)果包括:哪些寄存器、內(nèi)存單元的值發(fā)生了變化對標(biāo)志位有無影響,哪些受影響

特點(diǎn)及注意事項(xiàng)只介紹常用的指令,其他需要時(shí)可自學(xué)。重點(diǎn)關(guān)注:指令的匯編格式指令的基本功能指令支持的尋址方式指令的執(zhí)行對標(biāo)志位的影響指令的特殊要求D:\>DEBUG

-A

;匯編指令0AF8:0100MOVAL,B5

0AF8:0102ADDAL,8F

0AF8:0104

-R

;顯示指令執(zhí)行前各寄存器的值A(chǔ)X=0000BX=0000CX=0000DX=0000、、、、、、CS=0AF8IP=0100NVUP

EIPLNZNA

PO

NC-T=1002

;執(zhí)行指令,查看結(jié)果AX=0044BX=0000CX=0000DX=0000、、、、、、CS=0AF8IP=0104OVUPEIPL

NZ

ACPECY0AF8:01042080FC01AND[BX+SI+01FC],AL-

10110101

+

10001111進(jìn)位1

111111

01000100編程完成B5h+8Fh=?學(xué)習(xí)加法ADD指令及其對狀態(tài)標(biāo)志位的影響。3.利用DEBUG學(xué)習(xí)指令系統(tǒng)(示例)2.指令中操作數(shù)的表示符號表示內(nèi)容data立即數(shù)操作數(shù)reg通用寄存器操作數(shù)8位:AH、AL、BH、BL、CH、CL、DH、DL16位:AX、BX、CX、DX、BP、SP、SI、DIsegreg段寄存器CS、DS、SS、ESmem或[]存儲器操作數(shù)(5種尋址方式)src源操作數(shù)dst目的操作數(shù)

(

)注釋時(shí)表示寄存器、存儲器、端口的內(nèi)容oprd1oprd2兩操作數(shù)3.書寫指令注意事項(xiàng):不區(qū)分字母的大小寫。下列寫法表示同一條指令:MOVAX,1ABDHmovax,1abdh

不添加指令系統(tǒng)沒有的指令,即不自創(chuàng)助記符。將MOVAL,0寫成MOVEAL,0JMPlable寫成JUMPlable

注意操作數(shù)的范圍對字節(jié)操作指令0~FFH0~255對字操作指令0~FFFFH0~65535

MOVAL,260

MOVAX,70000MOVAL,1FFHMOVAL,2ABCDH

對無操作數(shù)指令,不添加操作數(shù)。

STCAL

對單操作數(shù)指令,操作數(shù)不能是立即數(shù)。

IMUL6

對雙操作數(shù)指令①不能兩個(gè)同為存儲器操作數(shù)

MOV[DI],[SI]

②目的操作數(shù)不能是立即數(shù)

ADD3,AL

兩個(gè)操作數(shù)的類型應(yīng)相同

SUBAX,BL

若value定義為字類型存儲器變量:

MOVCL,value[BX]

內(nèi)存操作數(shù)的屬性應(yīng)明確。

MOV[BX],0MOVbyteptr[BX],0MOVwordptr[BX],0MOV[BX],ALMOV[BX],AXA、B、C、D、E、F開頭的十六進(jìn)制數(shù)前面加0,與H結(jié)尾的標(biāo)識符區(qū)別。如寄存器名:AH、BH、CH、

DH

變量名:abcdH等例

movAL,0AHmovAL,AHmovBX,0abcdHCS和IP的值只在控制轉(zhuǎn)移指令中修改。對非控制轉(zhuǎn)移指令,取完指令后IP值自動指向下條指令。段寄存器CS的值,只在MOV、PUSH中可作操作數(shù),且這兩條指令執(zhí)行結(jié)果不改變CS值。MOVAX,CSPUSHCSIP、PSW兩個(gè)寄存器不作為操作數(shù)在指令中出現(xiàn)。movIP,1234HmovPSW,0F0FHPSW狀態(tài)寄存器的值由指令執(zhí)行后確定,不同的指令對各標(biāo)志的影響不同。

數(shù)據(jù)傳送是最基本、最重要的一種操作實(shí)際程序中,使用的比例最高

changePROC

LEASI,num+2MOVCL,num+1MOVCH,0MOVAX,0MOVDI,10next:MULDI

MOVBH,0MOVBL,[SI]ANDBL,0FHADDAX,BXINCSILOOPnextzero:MOVBX,AXRETchangeENDP

匯編子程例:寄存器寄存器寄存器內(nèi)存單元寄存器I/O端口設(shè)置寄存器、內(nèi)存單元的初始值3.3.1

數(shù)據(jù)傳送指令

按傳送內(nèi)容,可分為四類:

通用數(shù)據(jù)傳送指令

累加器專用傳送指令

地址傳送指令

標(biāo)志寄存器傳送指令

特點(diǎn):

1.除POPF/FD、SAHF外,其他傳送指令對標(biāo)志位均無影響

2.唯一允許以段寄存器做操作數(shù)的指令且只有MOV、PUSH、POP這三條允許通用傳送指令(8) MOV MOVSX MOVZX PUSH POP PUSHA/PUSHAD POPA/POPAD XCHG

傳送帶符號擴(kuò)展傳送帶零擴(kuò)展傳送進(jìn)棧出棧所有寄存器進(jìn)棧所有寄存器出棧交換(1)MOV傳送指令格式

MOVDST,SRC執(zhí)行

(DST)←(SRC)reg/mem/segreg←regreg/segreg←memreg/mem←segregreg/mem←data

可實(shí)現(xiàn)例:①reg/mem/segreg←reg通用寄存器/存儲器/段寄存器←通用寄存器

MOVAL,BLMOV[BX],ALMOVDS,AX②reg/segreg←mem通用寄存器/段寄存器←存儲器

MOVAL,[BX]MOVDS,[BX+SI]

③reg/mem←segreg通用寄存器/存儲器←段寄存器

MOVBX,CSMOV[BX],DS

④reg/mem←data通用寄存器/存儲器←立即數(shù)

MOVAl,9MOVBX,OFFSETbufferMOVBYTEPTR[value],0MOVWORDPTR[BX],1MOV指令特點(diǎn)及注意事項(xiàng):

雙操作數(shù)指令(注意雙操作指令的特點(diǎn))可進(jìn)行字節(jié)或字傳送不允許存儲器傳送到存儲器MOV[BX],valueMOV[DI],[SI]MOVAX,valueMOV[BX],AXMOVAL,[SI]MOV[DI],AL

可對DS、ES、SS賦值但不允許立即數(shù)直接傳送給段寄存器MOVDS,AXMOVES,[BX]MOVDS,1000HMOVAX,1000HMOVDS,AX

CS不能做目的操作數(shù),不能通過傳送指令改變CS的值

MOVCS,AX

不允許段寄存器傳送到段寄存器

MOVES,DSMOVAX,DSMOVES,AXD:\MASM>DEBUG-A1693:0100MOVES,DS^Error1693:0100MOVAX,DS1693:0102MOVES,AX1693:0104-例編程將CL寄存器的內(nèi)容傳送到200:100H單元中。MOVAX,200HMOVDS,AX;(DS)=200HMOV[100H

],CL;(02100H)=(CL)編程1:MOVAX,200HMOVDS,AX;(DS)=200HMOVDI,100H;(DI)=100HMOV[DI

],CL;(02100H)=(CL)編程2:MOV[200:100H],CL

MOV指令應(yīng)用(自學(xué))例:實(shí)現(xiàn)將AREA1開始的100個(gè)數(shù)據(jù)傳送到AREA2開始的單元?!瑼REA1:AREA2:100個(gè)數(shù)據(jù)分析題意:

①可以用200條MOV指令來完成100個(gè)數(shù)據(jù)傳送,指令操作重復(fù),每個(gè)數(shù)據(jù)傳送后的地址是變化的。②可以利用循環(huán), 但每循環(huán)一次要修改地址(源地址和目的地址),必須把地址放在寄存器當(dāng)中,用寄存器間接尋址來尋找操作數(shù).得到如下程序:

MOVSI,OFFSETAREA1 MOVDI,OFFSETAREA2 MOVCX,100AGAIN: MOVAL,[SI] MOV[DI],AL

INCSI ;修改地址指針

INCDI ;修改地址指針

DECCX ;修改個(gè)數(shù)

JNZAGAIN

…MOVSX

帶符號擴(kuò)展傳送MOVZX

帶零擴(kuò)展傳送格式:MOVSX/

MOVZX

DST,SRC執(zhí)行的操作:(DST)

符號擴(kuò)展(SRC)例:

MOVSXEAX,CLMOVSXEDX,[EDI]MOVZXDX,ALMOVZXEAX,[EDI]注意:

1.目的操作數(shù)必須是16位或32位寄存器

2.源操作數(shù)的長度一定要小于目的操作數(shù)

3.MOVSX的源操作數(shù)應(yīng)是有符號數(shù),而MOVZX的源操作數(shù)應(yīng)是無符號數(shù)什么是堆棧,為什么需要堆棧堆棧是按照先進(jìn)后出原則組織的一段內(nèi)存區(qū)域存在于堆棧段中,SP在任何時(shí)候都指向棧頂。通常用于存放一些重要數(shù)據(jù),

如:程序的地址、或是需要恢復(fù)的數(shù)據(jù)。為方便數(shù)據(jù)的存放和恢復(fù),設(shè)置專門的指針,指向堆棧中要操作的單元。段值由SS給出,偏移地址由SP給出

SS→堆棧段寄存器(stacksegment)SP→堆棧指針寄存器(stackpoint)堆棧:“先進(jìn)后出”的存儲區(qū),堆棧使用的場合用堆棧保存恢復(fù)信息

子程序的調(diào)用、返回以及中斷調(diào)用、返回

用堆棧傳送數(shù)據(jù)(程序設(shè)計(jì)中介紹)注意事項(xiàng)

堆棧是一重要數(shù)據(jù)結(jié)構(gòu),使用堆棧應(yīng)有明確目的。不亂用堆棧操作,不亂修改堆棧內(nèi)容。PUSH、POP、PUSHF、POPF、CALL、RET、INT、IRET

亂修改SS和SP的內(nèi)容包括亂用BP參與的存儲器操作數(shù)

亂用指令

進(jìn)棧指令:PUSHSRC

執(zhí)行操作:(SP)

(SP)-2((SP)+1,(SP))

(SRC)

把一個(gè)字從源操作數(shù)(src)

由SP指向堆棧頂部。特點(diǎn):

單操作數(shù)指令操作數(shù)為16位,可以是reg/segreg/mem,不可以是datareg:AX,BX,CX,DX,SI,DI,BP,BXsegreg:CS,DS,ES,SSmem:字類型例:假設(shè)(AX)=2107H,執(zhí)行

PUSHAX(SP)

低地址高地址(SP)

07H21H低地址高地址進(jìn)棧方向********PUSHAX執(zhí)行前PUSHAX執(zhí)行后D:\MASM>DEBUG-A

;匯編兩條指令1693:0100MOVAX,12341693:0103PUSHAX1693:0104-R

;顯示指令執(zhí)行前寄存器值A(chǔ)X=0000

BX=0000CX=0000DX=0000

SP=FFEE

BP=0000SI=0000DI=0000DS=1693ES=1693SS=1693CS=1693IP=0100NVUPEIPLNZNAPONC1693:0100B83412MOVAX,1234-T=1002

;執(zhí)行CS:100開始處的兩條指令

….AX=1234

BX=0000CX=0000DX=0000

SP=FFEC

BP=0000SI=0000DI=0000DS=1693ES=1693SS=1693CS=1693IP=0104NVUPEIPLNZNAPONC1693:010403C6ADDAX,SI-DSS:FFECL10

;查看棧頂內(nèi)容1693:FFE0341200004...1693:FFF0FFFFFFFFFFFFFFFF-FFFFFFFFFFFFFFFF

.........…-例利用DEBUG學(xué)習(xí)PUSH指令注意相關(guān)寄存器和內(nèi)存單元內(nèi)容的變化出棧指令:POPDST

執(zhí)行操作:(DST)

(SP)+1,(SP))(SP)

(SP)+2把現(xiàn)行SP所指向堆棧頂部的一個(gè)字

指定的目的操作數(shù)(dest),同時(shí)進(jìn)行修改堆棧指針的操作。特點(diǎn):單操作數(shù)指令操作數(shù)為16位,可以是reg/segreg/mem,不可以是datareg:AX,BX,CX,DX,SI,DI,BP,BXsegreg:DS,ES,SS,不允許是CSmem:字類型例:POPBX(SP)

低地址高地址(SP)

07H21H低地址高地址出棧方向07H21H

(BX)=2107HPOPBX執(zhí)行前POPBX執(zhí)行后********-A

1693:0100MOVBP,SP;取當(dāng)前棧頂?shù)刂?/p>

1693:0102MOVWORDPTR[BP],1234;用MOV指令使棧頂內(nèi)容為1234H1693:0107POPBX;出棧指令1693:0108-R

;查看指令執(zhí)行前狀態(tài)AX=0000BX=0000CX=0000DX=0000SP=FFEE

BP=0000SI=0000DI=0000DS=1693ES=1693SS=1693CS=1693IP=0100NVUPEIPLNZNAPONC1693:010089E5MOVBP,SP-T=100

;執(zhí)行CS:100處的第一條mov指令A(yù)X=0000BX=0000CX=0000DX=0000SP=FFEE

BP=FFEESI=0000DI=0000DS=1693ES=1693SS=1693CS=1693IP=0102NVUPEIPLNZNAPONC1693:0102C746003412MOVWORDPTR[BP+00],1234SS:FFEE=0000-T

;執(zhí)行下一條mov指令A(yù)X=0000BX=0000CX=0000DX=0000SP=FFEE

BP=FFEESI=0000DI=0000DS=1693ES=1693SS=1693CS=1693IP=0107NVUPEIPLNZNAPONC1693:01075BPOPBX-T

;執(zhí)行pop指令,注意BX,SP的變化AX=0000BX=1234CX=0000DX=0000SP=FFF0BP=FFEESI=0000DI=0000DS=1693ES=1693SS=1693CS=1693IP=0108NVUPEIPLNZNAPONC1693:0108F5CMC-例在DEBUG下學(xué)習(xí)POP指令PUSHA/PUSHADPOPA/POPAD所有16位/32位寄存器進(jìn)棧所有16位/32位寄存器出棧執(zhí)行操作進(jìn)棧順序AX,CX,DX,BX,SP,BP,SI,DIEAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI

(SP)←(SP)-16(32)出棧順序DI,SI,BP,SP,BX,DX,CX,AXEDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX(SP)←(SP)+16(32)

交換指令:XCHGOPR1,OPR2

執(zhí)行操作:(OPR1)

(OPR2)例:XCHGBX,[BP+SI]XCHGAL,BH注意:

*

可進(jìn)行字或字節(jié)操作,不影響標(biāo)志位

*

不允許對立即數(shù)、段寄存器做操作數(shù)

XCHGAX,4

XCHGBX,DS

輸入指令(I/O

CPU)

長格式:INAL,PORT

(字節(jié))

INAX,PORT

(字)

INEAX,PORT

(雙字)

累加器專用傳送指令(只限使用AX或AL)執(zhí)行操作:(AL)

(PORT)(字節(jié))

(AX)

(PORT+1,PORT)(字)

(AX)

(PORT+3,PORT+2,PORT+1,PORT)(雙字)

短格式:INAL,DX

(字節(jié))

INAX,DX

(字)

INEAX,DX

(雙字)執(zhí)行操作:(AL)((DX))(字節(jié))

(AX)((DX)+1,(DX))(字)

(AX)((DX)+3,(DX)+2,(DX)+1,(DX))

(雙字)

長格式:OUTPORT,AL

(字節(jié))

OUTPORT,AX

(字)

OUTPORT,EAX

(雙字)執(zhí)行操作:(PORT)

(AL)(字節(jié))

(PORT+1,PORT)

(AX)(字)

(PORT+3,PORT+2,PORT+1,PORT)

(EAX)

(雙字)輸出指令(CPU

I/O)

短格式:OUTDX,AL

(字節(jié))

OUTDX,AX

(字)

OUTDX,EAX

(雙字)執(zhí)行操作:((DX))

(AL)(字節(jié))

((DX)+1,(DX))

(AX)(字)

((DX)+3,(DX)+2,(DX)+1,(DX))

(AX)

(雙字)注意:*

不影響標(biāo)志位*

前256個(gè)端口號00H~FFH可直接在指令中指定(長格式)*如果端口號

256,端口號

DX(短格式)例:INAX,28H;MOVDX,28H;INAX,DXMOVDATA_WORD,AX例:MOVDX,3FCHINAX,DX例:OUT5,AL例:測試某狀態(tài)寄存器(端口號27H)的第2位是否為1INAL,27HTESTAL,00000100BJNZERROR;若第2位為1,轉(zhuǎn)ERROR處理Sound程序

movdx,100

inal,61handal,11111100bsound:xoral,2

out61h,almovcx,140hwait1:loopwait1decdxjnesound設(shè)備控制寄存器端口61H1/00

控制其它外部設(shè)備與門放大器2號定時(shí)器門控10(BX)

30HF004031HF0041(AL)=332HF004233HF0043TABLE(DS)=F000H換碼指令:XLAT

或XLATOPR執(zhí)行操作:(AL)

((BX)+(AL))表格符號地址(首地址),只是為了提高可讀性而設(shè)置,匯編時(shí)仍用BX。例:MOVBX,OFFSETTABLE;(BX)=0040HMOVAL,3XLATTABLE

指令執(zhí)行后(AL)=33H注意:

*

不影響標(biāo)志位*

字節(jié)表格(長度不超過256)

首地址

(BX)*

需轉(zhuǎn)換代碼(AL)XLAT指令使用方法:先建立一個(gè)字節(jié)表格;表格首偏移地址存入BX;需要轉(zhuǎn)換代碼的序號(相對與表格首地址位移量)存入AL;

(表中第一個(gè)元素的序號為0)執(zhí)行XLAT指令后,表中指定序號的元素存于AL中。

(AL)為轉(zhuǎn)換的代碼。XLAT指令應(yīng)用:若把字符的掃描碼轉(zhuǎn)換成ASCII碼;或數(shù)字0~9轉(zhuǎn)換成7段數(shù)碼所需要的相應(yīng)代碼(字形碼)等就要用XLAT指令。例:內(nèi)存的數(shù)據(jù)段中有一張十六進(jìn)制數(shù)字的ASCII碼表。

首地址為:Hex_table,欲查出表中第10個(gè)元素(‘A’)執(zhí)行指令序列:MOVBX,OFFSETHex_tableMOVAL,0AHXLATHex_table假設(shè): (DS)=F000H,

Hex_table=0040H

(AL)=0AH執(zhí)行XLAT以后:(AL)=41H=(F004AH), 即“A”的ASCII碼。30H31H32H...39H41H42H...46H...Hex_tableHex_table+1Hex_table+2Hex_table+0AHHex_table+0BHHex_table+0FH'F''B''A''9''1''2''0'16進(jìn)制數(shù)的ASCII碼表

地址傳送指令

有效地址送寄存器指令:LEAREG,SRC

執(zhí)行操作:(REG)

SRC

指針?biāo)图拇嫫骱虳S指令:LDSREG,SRC

執(zhí)行操作:(REG)

(SRC)(DS)

(SRC+2)

4個(gè)相繼字節(jié)

寄存器(通常是SI)、DS

指針?biāo)图拇嫫骱虴S指令:LESREG,SRC

執(zhí)行操作:(REG)

(SRC)(ES)

(SRC+2)

4個(gè)相繼字節(jié)

寄存器(通常是DI)、ES例:LEABX,[BX+SI+0F62H]

LDSSI,[10H]

LESDI,[BX]40H00H00H30H

TABLE(DS):1000HMOVBX,TABLE;(BX)=0040HMOVBX,OFFSETTABLE

;(BX)=1000HLEABX,TABLE

;(BX)=1000HLDSBX,TABLE;(BX)=0040H

;(DS)=3000HLESBX,TABLE;(BX)=0040H

;(ES)=3000H注意:

*

不影響標(biāo)志位

*

REG不能是段寄存器

*

SRC必須為存儲器尋址方式

標(biāo)志寄存器傳送指令

標(biāo)志送AH指令:LAHF

執(zhí)行操作:(AH)

(PSW的低字節(jié))

AH送標(biāo)志寄存器指令:SAHF

執(zhí)行操作:(PSW的低字節(jié))

(AH)

標(biāo)志進(jìn)棧指令:PUSHF

執(zhí)行操作:(SP)

(SP)-2((SP)+1,(SP))

(PSW)

標(biāo)志出棧指令:

POPF

執(zhí)行操作:(PSW)

((SP)+1,(SP))(SP)

(SP)+2*影響標(biāo)志位

類型轉(zhuǎn)換指令

CBWAL

AX

執(zhí)行操作:若(AL)的最高有效位為0,則(AH)=00H

若(AL)的最高有效位為1,則(AH)=0FFH

CWDAX

(DX,AX)

執(zhí)行操作:若(AX)的最高有效位為0,則(DX)=0000H

若(AX)的最高有效位為1,則(DX)=0FFFFH

例:(AX)=0BA45HCBW;(AX)=0045HCWD;(DX)=0FFFFH(AX)=0BA45H注意:

*

無操作數(shù)指令

*隱含對AL或AX進(jìn)行符號擴(kuò)展

*不影響條件標(biāo)志位

加法指令

ADD、ADC、INC

減法指令

SUB、SBB、DEC、NEG、CMP

乘法指令

MUL、IMUL

除法指令

DIV、IDIV

十進(jìn)制調(diào)整指令

DAA、DAS、

AAA、AAS、AAM、AAD3.3.2算術(shù)指令

加法指令

加法指令:ADDDST,SRC

執(zhí)行操作:(DST)

(SRC)+(DST)

帶進(jìn)位加法指令:ADCDST,SRC

執(zhí)行操作:(DST)

(SRC)+(DST)+CF

加1指令:INCOPR

執(zhí)行操作:(OPR)

(OPR)+1注意:*

除INC指令不影響CF標(biāo)志外,均對條件標(biāo)志位有影響。加法指令對條件標(biāo)志位(CF/OF/ZF/SF)的影響:CF位表示無符號數(shù)相加的溢出。OF位表示帶符號數(shù)相加的溢出。1結(jié)果為負(fù)0否則SF=1結(jié)果為00否則ZF=1和的最高有效位有向高位的進(jìn)位0否則CF=1兩個(gè)操作數(shù)符號相同,而結(jié)果符號與之相反0否則OF=n=8bit帶符號數(shù)(-128~127)無符號數(shù)(0~255)

00000100+0000101100001111帶:(+4)+(+11)=+15OF=0無:4+11=15CF=0帶符號數(shù)和無符號數(shù)都不溢出00001001+0111110010000101

帶:(+9)+(+124)=-123OF=1

無:9+124=133CF=0帶符號數(shù)溢出無符號數(shù)溢出00000111+1111101100000010帶:(+7)+(-5)=+2OF=0無:7+251=2CF=1帶符號數(shù)和無符號數(shù)都溢出10000111+1111010101111100帶:(-121)+(-11)=+124OF=1無:135+245=124CF=1例:雙精度數(shù)的加法

(DX)=0002H(AX)=0F365H(BX)=0005H(CX)=0E024H

指令序列

(1)ADDAX,CX

(2)ADCDX,BX

(1)執(zhí)行后,(AX)=0D389H

CF=1OF=0SF=1ZF=0(2)執(zhí)行后,(DX)=0008HCF=0OF=0SF=0ZF=0

減法指令減法指令:SUBDST,SRC

執(zhí)行操作:(DST)

(DST)-(SRC)帶借位減法指令:SBBDST,SRC

執(zhí)行操作:(DST)

(DST)-(SRC)-CF減1指令:DECOPR

執(zhí)行操作:(OPR)

(OPR)-1求補(bǔ)指令:NEGOPR

執(zhí)行操作:(OPR)

-(OPR)比較指令:CMPOPR1,OPR2

執(zhí)行操作:(OPR1)-(OPR2)注意:*除DEC指令不影響

CF標(biāo)志外,均對條件標(biāo)志位有影響。減法指令對條件標(biāo)志位(CF/OF/ZF/SF)的影響:CF

位表示無符號數(shù)減法的溢出。OF

位表示帶符號數(shù)減法的溢出。1被減數(shù)的最高有效位有向高位的借位0否則CF=1兩個(gè)操作數(shù)符號相反,而結(jié)果的符號與減數(shù)相同0否則OF=1減法轉(zhuǎn)換為加法運(yùn)算時(shí)無進(jìn)位0否則CF=或NEG指令對CF/OF的影響:0操作數(shù)為01否則CF=1操作數(shù)為-128(字節(jié)運(yùn)算)或操作數(shù)為-32768(字運(yùn)算)0否則OF=例:x、y、z均為雙精度數(shù),分別存放在地址為X,X+2;

Y,Y+2;Z,Z+2的存儲單元中,用指令序列實(shí)現(xiàn)

w

x+y+24-z

,并用W,W+2單元存放wMOVAX,XMOVDX,X+2ADDAX,YADCDX,Y+2;x+yADDAX,24ADCDX,0;x+y+24SUBAX,ZSBBDX,Z+2;x+y+24-zMOVW,AXMOVW+2,DX;結(jié)果存入W,W+2單元

乘法指令

無符號數(shù)乘法指令:MULSRC

執(zhí)行操作:

字節(jié)操作數(shù)(AX)

(AL)*(SRC)

字操作數(shù)(DX,AX)

(AX)*(SRC)

雙字操作(EDX,EAX)

(EAX)*(SRC)

帶符號數(shù)乘法指令:IMULSRC注意:

*AL(AX、EAX)為隱含的乘數(shù)寄存器。*

AX((DX,AX)、(EDX,EAX))為隱含的乘積寄存器。*

SRC不能為立即數(shù)。*除CF和OF外,對條件標(biāo)志位無定義。乘法指令對CF/OF的影響:例:(AX)=16A5H,(BX)=0611H

(1)

IMULBL

;(AX)(AL)*(BL)

;A5*11

5B*11=060B

F9F5

;

(AX)=0F9F5H

CF=OF=1(2)

MULBX

;(DX,AX)(AX)*(BX)

;16A5*0611=00895EF5

;

(DX)=0089H(AX)=5EF5H

CF=OF=100乘積的高一半為零11否則MUL指令:CF/OF=00乘積的高一半是低一半的符號擴(kuò)展11否則

IMUL指令:CF/OF=對于80286+,還有(1)雙操作數(shù)的IMUL格式:IMUL REG,SRC執(zhí)行的操作:字操作:(REG16)(REG16)*SRC雙字操作:(REG32)(REG32)*SRC注:

1、SRC與REG長度要一致

2、SRC可以是任一種尋址方式

3、SRC為立即數(shù)時(shí),可以是8位、16位、32位立即數(shù)對于80286+,還有(2)三操作數(shù)的IMUL格式:IMUL REG,SRC,IMM執(zhí)行的操作:字操作:(REG16)SRC*IMM雙字操作:(REG32)SRC*IMM注:

1、SRC與REG長度要一致

2、SRC可以是除立即數(shù)以外的任一種尋址方式3、IMM(立即數(shù)),可以是8位、16位、32位立即數(shù)三種IMUL的區(qū)別1、乘積字長不同

單操作數(shù)時(shí)乘積字長是源和目的操作數(shù)字長的二倍雙操作數(shù)和三操作數(shù)時(shí)乘積字長與源和目的操作數(shù)字長相同2、溢出位OF的意義不同單操作數(shù)時(shí)OF為1,乘積結(jié)果也是正確的雙操作數(shù)和三操作數(shù)時(shí)乘積結(jié)果不正確

除法指令

無符號數(shù)除法指令:DIVSRC

執(zhí)行操作:

字節(jié)操作(AL)

(AX)/(SRC)的商

(AH)

(AX)/(SRC)的余數(shù)字操作(AX)

(DX,AX)/(SRC)的商

(DX)

(DX,AX)/(SRC)的余數(shù)雙字操作(EAX)

(EDX,EAX)/(SRC)的商

(EDX)

(EDX,EAX)/(SRC)的余數(shù)

帶符號數(shù)除法指令:IDIVSRC注意:

*AX、(DX,AX)、(EDX,EAX)為隱含的被除數(shù)寄存器。

*

AL、(AX)、(EAX)為隱含的商寄存器。

*

AH、(DX)、(EDX)為隱含的余數(shù)寄存器。

*

SRC不能為立即數(shù)。

*

對所有條件標(biāo)志位均無定義。例:x,y,z,v均為16位帶符號數(shù),計(jì)算

(v-(x*y+z–540))/xMOVAX,XIMULY;x*yMOVCX,AXMOVBX,DXMOVAX,ZCWDADDCX,AXADCBX,DX;x*y+zSUBCX,540SBBBX,0;x*y+z-540MOVAX,VCWDSUBAX,CXSBBDX,BX;v-(x*y+z-540)IDIVX;(v-(x*y+z-540))/x

十進(jìn)制調(diào)整指令BCD碼:用二進(jìn)制編碼的十進(jìn)制數(shù),又稱二--十進(jìn)制數(shù)壓縮的BCD碼:用4位二進(jìn)制數(shù)表示1位十進(jìn)制數(shù)

例:(59)10=(01011001)BCD非壓縮的BCD碼:用8位二進(jìn)制數(shù)表示1位十進(jìn)制數(shù)例:(59)10=(0000010100001001)BCD數(shù)字的ASCII碼是一種非壓縮的BCD碼

DIGIT ASCII BCD0 30H 001100001 31H 001100012 32H 00110010… … …9 39H 00111001

十進(jìn)制調(diào)整指令

BCD碼:用二進(jìn)制編碼的十進(jìn)制數(shù),又稱二--十進(jìn)制數(shù)

壓縮的BCD碼:用4位二進(jìn)制數(shù)表示1位十進(jìn)制數(shù)例:(59)10=(01011001)BCD非壓縮的BCD碼:用8位二進(jìn)制數(shù)表示1位十進(jìn)制數(shù)例:(59)10=(0000010100001001)BCD數(shù)字的ASCII碼是一種非壓縮的BCD碼DIGIT ASCII BCD0 30H 001100001 31H 001100012 32H 00110010… … …9 39H 00111001例:寫出(3590)10的壓縮BCD碼和非壓縮BCD碼,并分別把它們存入數(shù)據(jù)區(qū)PAKED和UNPAK。壓縮BCD: (3590)10=(0011010110010000)BCD非壓縮BCD:

(3590)10=(00000011000001010000100100000000)BCDPAKED90H35HUNPAK00H09H05H03H壓縮的BCD碼調(diào)整指令加法的十進(jìn)制調(diào)整指令:DAA執(zhí)行操作:(AL)

(AL)壓縮BCD減法的十進(jìn)制調(diào)整指令:DAS執(zhí)行操作:(AL)

(AL)壓縮BCD19壓縮BCD:00011001+08+000010002700100001+110

(00100111)BCD

AF=1問題的提出:

注意:

*

隱含的操作寄存器為AL*

緊接在加減指令之后使用*影響條件標(biāo)志位(對OF無定義)調(diào)整方法:AF=1或(AL)0~3=A~F,則(AL)

(AL)

06H,AF=1CF=1或(AL)4~7=A~F,則(AL)

(AL)

60H,CF=1(DAA做‘+’,DAS做‘-’)例: DATASEGMENT

BCD1 DB 34H,18H;(1834)BCD BCD2 DB 89H,27H;(2789)BCD BCD3 DB 2DUP(?) DATAENDS(1)BCD3

BCD1+BCD2 ;(4623)BCD

(2)BCD3

BCD1-BCD2;(9045)BCD

=-955(1) MOV AL,BCD1;(AL)=34H

ADD AL,BCD2

;(AL)=34+89=BDH

DAA

;(AL)=BD+60+06=23HAF=CF=1

MOV BCD3,AL;(BCD3)=23H MOV AL,BCD1+1;(AL)=18H

ADC AL,BCD2+1;(AL)=18+27+1=40H

AF=1CF=0 DAA

;(AL)=40+06=46H

MOV BCD3+1,AL;(BCD3+1)=46H(2) MOV AL,BCD1 ;(AL)=34H

SUB AL,BCD2 ;(AL)=34-89=ABH

DAS ;(AL)=AB-60-06=45HAF=CF=1

MOV BCD3,AL;(BCD3)=45H MOV AL,BCD1+1;(AL)=18H

SBB AL,BCD2+1;(AL)=18-27-1=F0H

DAS ;(AL)=F0-60=90H

MOV BCD3+1,AL;(BCD3+1)=90H非壓縮的BCD調(diào)整指令加法調(diào)整指令:AAA(AL)

(AL)非壓縮BCD減法調(diào)整指令:AAS(AL)

(AL)非壓縮BCD注意:*

隱含的操作寄存器為AL*

緊接在加減指令之后使用*除AF、CF外,對其它條件標(biāo)志位無定義調(diào)整方法:若(AL)0~3=0~9,且AF=0,則(AL)4~7=0,AF

CF=0若(AL)0~3=A~F,或AF=1,則(AL)

(AL)±6,(AL)4~7=0(AH)

(AH)±1,AF

CF=1(AAA做‘+’,AAS做‘-’)乘法調(diào)整指令:AAM(AL)

(AX)非壓縮BCD

注意:*

隱含的操作寄存器為AL*

緊接在MUL指令之后使用*對OF、CF、AF無定義調(diào)整方法:

(AL)除以0AH,商

(AH),余數(shù)(AL)除法調(diào)整指令:AAD

被除數(shù)(AX)=(0000xxxx0000xxxx)非壓縮BCD

除數(shù)=(0000xxxx)非壓縮BCD

在DIV指令之前:

(AL)2

0AH×(AH)+(AL) (AH)2

0例:(AX)=0504H(BL)=03H

(1)(AL)*(BL)

MULBL;(AX)=000CHAAM;(AH)=01H(AL)=02H(2)(AX)/(BL)

AAD;(AH)=00H(AL)=36H DIVBL;(AH)=00H(AL)=12H AAM;(AH)=01H(AL)=08H

邏輯運(yùn)算指令位測試并修改指令位掃描指令移位指令3.3.3邏輯指令邏輯非指令:NOTOPR*OPR不能為立即數(shù)

執(zhí)行操作:(OPR)

(OPR)*不影響標(biāo)志位

邏輯與指令:ANDDST,SRC執(zhí)行操作:(DST)

(DST)

(SRC)邏輯或指令:ORDST,SRC執(zhí)行操作:(DST)

(DST)

(SRC)異或指令:XORDST,SRC執(zhí)行操作:(DST)

(DST)

(SRC)測試指令:TESTOPR1,OPR2

執(zhí)行操作:(OPR1)

(OPR2)CFOFSFZFPFAF00***無定義

根據(jù)運(yùn)算結(jié)果設(shè)置邏輯運(yùn)算指令例:屏蔽AL的0、1兩位

ANDAL,0FCH例:置AL的第5位為1

ORAL,20H

例:使AL的0、1位變反

XORAL,3例:測試某些位是0是1

TESTAL,1JZEVEN

********AND11111100******00

********OR00100000**1*****

********XOR00000011

********位測試并修改指令(適用于386+)位測試指令BT DST,SRC執(zhí)行的操作:把DST中由SRC中指定位的值送往CF位測試并置1指令BTS DST,SRC執(zhí)行的操作:把DST中由SRC中指定位的值送往CF,并將DST中該位的值置1位測試并置0指令BTR DST,SRC執(zhí)行的操作:把DST中由SRC中指定位的值送往CF,并將DST中該位的值置0位測試并取反指令BTC DST,SRC執(zhí)行的操作:把DST中由SRC中指定位的值送往CF,并將DST中該位的值取反例BT AX,4指令執(zhí)行前(AX)=1234H指令執(zhí)行后(CF)=1,(AX)=1234HBTC AX,4指令執(zhí)行前(AX)=1224H指令執(zhí)行后(CF)=0,(AX)=1234H位掃描指令(適用于386+)正向位掃描指令BSF REG,SRC執(zhí)行的操作:從位0開始自右向左掃描SRC,目的是檢索第一個(gè)為1的位,如遇到第一個(gè)為1的位則將ZF位置0,并把該位的位位置裝入目的寄存器;如SRC為0,則將ZF位置1,目的寄存器無定義。反向位掃描指令BSR REG,SRC執(zhí)行的操作:從最高位開始自左向右掃描SRC,目的是檢索第

溫馨提示

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

最新文檔

評論

0/150

提交評論