匯編語言程序設(shè)計(jì)第3章尋址方式_第1頁
匯編語言程序設(shè)計(jì)第3章尋址方式_第2頁
匯編語言程序設(shè)計(jì)第3章尋址方式_第3頁
匯編語言程序設(shè)計(jì)第3章尋址方式_第4頁
匯編語言程序設(shè)計(jì)第3章尋址方式_第5頁
已閱讀5頁,還剩113頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

計(jì)算機(jī)是通過執(zhí)行指令序列來解決問題的,因而每種計(jì)算機(jī)都有一組指令集供給用戶使用,這組指令集就稱為計(jì)算機(jī)的指令系統(tǒng)。

指令系統(tǒng)即一組指令的集合。第3章80x86的指令系統(tǒng)和尋址方式

指令系統(tǒng)(百度百科)

計(jì)算機(jī)所能執(zhí)行的全部指令的集合,它描述了計(jì)算機(jī)內(nèi)全部的控制信息和“邏輯判斷”能力。不同計(jì)算機(jī)的指令系統(tǒng)包含的指令種類和數(shù)目也不同。一般均包含算術(shù)運(yùn)算型、邏輯運(yùn)算型、數(shù)據(jù)傳送型、判定和控制型、輸入和輸出型等指令。指令系統(tǒng)是表征一臺(tái)計(jì)算機(jī)性能的重要因素,它的格式與功能不僅直接影響到機(jī)器的硬件結(jié)構(gòu),而且也直接影響到系統(tǒng)軟件,影響到機(jī)器的適用范圍。

指令微機(jī)完成規(guī)定操作的命令,一條指令就是機(jī)器語言的一個(gè)語句,它是一組有意義的二進(jìn)制代碼。

一條指令通常由操作碼字段和操作數(shù)字段兩部分組成。指令的格式:

[名字:]操作碼[操作數(shù)[,操作數(shù)]][;注釋]其中,操作碼用助記符表示,指明了指令的操作性質(zhì)及功能,操作碼字段在機(jī)器里的表示比較簡(jiǎn)單,只需對(duì)每一種操作指定確定的二進(jìn)制代碼即可。地址碼則給出了操作數(shù)或操作數(shù)的地址。

操作數(shù)

計(jì)算機(jī)在運(yùn)行過程需要的數(shù)據(jù)稱為操作數(shù),用符號(hào)或符號(hào)地址來表示操作數(shù)或操作數(shù)的地址。指令的操作數(shù)字段的情況比較復(fù)雜,可以在指令中,寄存器中或存儲(chǔ)單元中。如果操作數(shù)在存儲(chǔ)器里,一個(gè)存儲(chǔ)單元20位的物理地址如何求得呢?另外,操作數(shù)常常不是單個(gè)的數(shù),往往是成組的以表格或數(shù)組的形式存放在存儲(chǔ)器的某一區(qū)域,在這種情況下,指令用什么方式來指定操作數(shù)地址更好呢?

尋址方式

根據(jù)指令內(nèi)容確定操作數(shù)地址的過程稱為尋址。80x86的尋址方式有:與數(shù)據(jù)有關(guān)的尋址方式

用來確定操作數(shù)地址從而找到操作數(shù)。與轉(zhuǎn)移地址有關(guān)的尋址方式

用來確定轉(zhuǎn)移指令及CALL指令的轉(zhuǎn)向地址。本節(jié)數(shù)據(jù)尋址方式的討論中均以MOV傳送指令為例,指令中逗號(hào)之前的操作數(shù)為目的操作數(shù),逗號(hào)后面的操作數(shù)為源操作數(shù)。如:

MOVAX,BX

;AX為目的操作數(shù),BX為源操作數(shù);指令的執(zhí)行結(jié)果是將BX的內(nèi)容傳到AX中去。1.8086的尋址方式

與數(shù)據(jù)有關(guān)的尋址方式:以MOV

指令為例立即尋址MOVAX,3069H寄存器尋址MOVAL,BH直接尋址MOVAX,[2000H]寄存器間接尋址MOVAX,[BX]

寄存器相對(duì)尋址MOVAX,COUNT[SI]

基址變址尋址MOVAX,[BP][DI]相對(duì)基址變址尋址MOVAX,MASK[BX][SI]存儲(chǔ)器尋址(1)立即尋址方式*——操作數(shù)在指令中給出指令格式:MOVAL,5MOVAX,3064HMOVAL,‘A’*

只能用于

SRC字段

MOV40H,AL

*SRC和DST的字長(zhǎng)一致

MOVAH,3064H

請(qǐng)參看教材P.36(2)寄存器尋址方式*—操作數(shù)在指定的寄存器中

MOVAX,BXMOVAL,BHMOVAX,3064H*

字節(jié)寄存器只有

AHALBHBLCHCLDHDL*SRC和DST的字長(zhǎng)一致

MOVAH,BX

*

CS不能用

MOV指令改變

MOVCS,AX

請(qǐng)參看教材P.36-P.38邏輯地址、段地址、偏移地址、有效地址(EA)和物理地址之間的關(guān)系如何?有效地址的組成成分有四種:位移量基址變址比例因子請(qǐng)參看教材P.38、P.39表3.1除上述兩種尋址方式外,以下各種尋址方式的操作數(shù)都在除代碼段以外的存儲(chǔ)區(qū)中。各種訪存類型下所對(duì)應(yīng)的段的默認(rèn)選擇關(guān)系?改變系統(tǒng)所指定的默認(rèn)段采用什么方法?請(qǐng)參看教材P.39和表3.2默認(rèn)的段寄存器訪問存儲(chǔ)器的方式可跨越的段寄存器偏移地址取指令

CS無IP堆棧操作

SS無SP一般數(shù)據(jù)訪問

DSCSESSS有效地址EABP作為基址的尋址

SSCSDSESBP串操作的源操作數(shù)

DSCSESSSSI串操作的目的操作數(shù)

ES無DI段寄存器的使用規(guī)定50(3)直接尋址方式*—有效地址EA由指令直接給出

例:MOVAX,[2000H]

EA=2000H,假設(shè)(DS)=3000H,那么PA=32000H*

隱含的段為數(shù)據(jù)段DS*

可使用段跨越前綴

MOVAX,ES:[2000H]*

操作數(shù)地址可由變量(符號(hào)地址)表示,但要注意VALUEDB10變量的屬性MOVAH,VALUE

MOVAX,VALUE

MOVAX,WORDPTRVALUE

5030

32000AHAL30(AX)=3050H請(qǐng)參看教材P.39-P.40(4)寄存器間接尋址*—EA在基址寄存器(BX/BP)

或變址寄存器(SI/DI)中

MOVAX,[BX]PA=16d(DS)+(BX)MOVAX,ES:[BX]PA=16d(ES)+(BX)MOVAX,[BP]PA=16d(SS)+(BP)*不允許使用AX、CX、DX存放EAMOVAX,[CX]

*

SRC和DST的字長(zhǎng)一致

MOVDL,[BX];[BX]指示一個(gè)字節(jié)單元

MOVDX,[BX];[BX]指示一個(gè)字單元*

適于數(shù)組、字符串、表格的處理請(qǐng)參看教材P.40-P.41

有效地址=(BX)(BP)8位(SI)16位(DI)+位移量(5)寄存器相對(duì)尋址方式*指令格式:MOVAX,COUNT[SI]或

MOVAX,[COUNT+SI]

假設(shè)(DS)=3000H,(SI)=2000H,COUNT=3000H,

則:PA=35000H

假設(shè)(35000H)=1234H,那么(AX)=1234H*適于數(shù)組、字符串、表格的處理請(qǐng)參看教材P.40(BX)(SI)(BP)(DI)(6)基址變址尋址方式*指令格式:

MOVAX,[BX][DI]MOVAX,[BX+DI]MOVAX,ES:[BX][SI]*適于數(shù)組、字符串、表格的處理*必須是一個(gè)基址寄存器和一個(gè)變址寄存器的組合

MOVAX,[BX][BP]

MOVAX,[SI][DI]

有效地址=+請(qǐng)參看教材P.41-P.42(7)相對(duì)基址變址尋址方式

MOVAX,MASK[BX][SI]

MOVAX,MASK[BX+SI]

或MOVAX,[MASK+BX+SI]

有效地址=(BX)(SI)8位(BP)(DI)16位++位移量請(qǐng)參看教材P.42-P.43直接寫出變量名是直接尋址方式變量名加減一個(gè)常量還是直接尋址方式變量名和一個(gè)寄存器則是寄存器相對(duì)尋址方式利用offset后跟一個(gè)變量名則是立即數(shù)尋址方式[BX+SI+16]去掉16=[BX+SI][BX+SI+16]去掉SI=[BX+16][BX+SI+16]去掉SI+16=[BX]尋址方式小結(jié)1:1、區(qū)別MOVAX,126

和MOVAX,[126]2、區(qū)別MOVAX,BX

和MOVAX,[BX]3、在雙操作數(shù)中,源和目的操作數(shù)的地址不能同時(shí)為存儲(chǔ)器尋址。4、段跨越前綴可修改操作數(shù)所在的段,不能用CS做段跨越前綴。

尋址方式小結(jié)2:例:編寫一段顯示字符串STRING的程序

DATASEGMENTSTRINGDB‘HAPPYNEWYEAR!’,0DH,0AH,‘$’COUNTDW17DATAENDS(1)直接尋址

movdl,string

movah,2

int21h;顯示字符‘H’

movdl,string+1

movah,2

int21h;顯示字符‘A’::(2)寄存器間接尋址

mov

cx,count;mov

cx,17

mov

bx,offsetstring;string的偏址

bxNext:movdl,[bx]

movah,2

int21h;顯示一個(gè)字符

incbxloopnext;循環(huán)指令(3)寄存器相對(duì)尋址

mov

cx,count;mov

cx,17

mov

si,0Next:movdl,string[si];movdl,[string+si]

movah,2

int21h;顯示一個(gè)字符

incsiloopnext;循環(huán)指令(4)基址變址尋址

mov

cx,count;mov

cx,17

mov

bx,offsetstring;string的偏址

bx

mov

si,0Next:movdl,[bx][si];movdl,[bx+si]

movah,2

int21h;顯示一個(gè)字符

incsiloopnext;循環(huán)指令(5)DOS顯示字符串功能

mov

dx,offsetstring;string的偏址

dx

;leadx,string

movah,9

int21h;顯示一串字符80x86新增的尋址方式

EA=(基址寄存器)+(變址寄存器)

比例因子+位移量(1)比例變址尋址方式

例:MOVEAX,COUNT[ESI

4](2)基址比例變址尋址方式

例:MOVECX,[EAX][EDI

4]

(3)相對(duì)基址比例變址尋址方式

例:MOVEAX,TABLE[EBP][EDI

4]▲16位和32位尋址的差異地址成分16位尋址32位尋址基址寄存器BX、BP任何32位通用寄存器變址寄存器SI、DI除ESP外的任何32位通用寄存器比例因子11、2、4、83.1.2與轉(zhuǎn)移地址有關(guān)的尋址方式:段內(nèi)尋址段內(nèi)直接尋址JMPNEARPTRNEXT

段內(nèi)間接尋址JMPTABLE[BX]

段間尋址

段間直接尋址JMPFARPTRNEXT

段間間接尋址JMPDWORDPTR[BX]用來確定轉(zhuǎn)移指令及轉(zhuǎn)子(CALL)指令的轉(zhuǎn)向地址。(1)段內(nèi)直接尋址轉(zhuǎn)向的有效地址=當(dāng)前(IP)+位移量(8bit/16bit)

例:JMPNEARPTRNEXT近轉(zhuǎn)移-32768~+32767

JMPSHORTNEXT

短轉(zhuǎn)移-128~+127

位移量為-0BH,0F5H是位移量的補(bǔ)嗎。當(dāng)前(IP)(2)段內(nèi)間接尋址

轉(zhuǎn)向的有效地址是一個(gè)寄存器或存儲(chǔ)單元的內(nèi)容。(可用除立即數(shù)以外的任何一種數(shù)據(jù)尋址方式得到)

例:TABLE=20A2H(BX)=1256H(SI)=528EH(DS)=2000H(232F8H)=3280H(264E4H)=2450H

JMPBX;(IP)=1256H

JMPTABLE[BX]JMPWORDPTRTABLE[BX];(IP)=3280H

JMP[BX][SI]JMPWORDPTR[BX][SI];(IP)=2450H請(qǐng)參看教材P.45code1segment……

jmp

farptrnext……code1endscode2segment……next:…...……code2ends(3)段間直接尋址

用指令中提供的轉(zhuǎn)向段地址和偏移地址取代CS和IP

例:請(qǐng)參看教材P.46(4)段間間接尋址

用存儲(chǔ)器中的兩個(gè)相繼字的內(nèi)容取代CS和IP

(存儲(chǔ)單元的地址可用存儲(chǔ)器尋址方式得到)

例:

JMPDWORDPTR[INTERS+BX]

PA=(DS)×24+(BX)+INTERS(PA+1,PA)→IP(PA+3,PA+2)→CS請(qǐng)參看教材P.46第3章練習(xí)Page107

3.13.33.53.73.113.13

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

算術(shù)指令

邏輯指令

串處理指令

控制轉(zhuǎn)移指令

處理機(jī)控制與雜項(xiàng)操作指令3.38086的指令系統(tǒng)重點(diǎn)關(guān)注:指令的匯編格式指令的基本功能指令支持的尋址方式指令的執(zhí)行對(duì)標(biāo)志位的影響指令的特殊要求學(xué)習(xí)指令的注意事項(xiàng)指令的功能——該指令能夠?qū)崿F(xiàn)何種操作。指令支持的尋址方式——該指令中的操作數(shù)可以采用何種尋址方式指令對(duì)標(biāo)志的影響——該指令執(zhí)行后是否對(duì)各個(gè)標(biāo)志位有影響,以及如何影響其他方面——該指令其他需要特別注意的地方,如指令執(zhí)行時(shí)的約定設(shè)置、必須預(yù)置的參數(shù)、隱含使用的寄存器等

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

MOV、MOVSX、MOVZX(386)

PUSH、POP、PUSHA、POPA(286)

PUSHAD、POPAD(386)

XCHG

累加器專用傳送指令

IN、OUT、XLAT請(qǐng)參看教材P.473.3.1數(shù)據(jù)傳送指令1:

地址傳送指令

LEA、LDS、LES、LFS、LGS、LSS(386)

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

LAHF、SAHFPUSHF、POPFPUSHFD、POPFD(386)

類型轉(zhuǎn)換指令

CBW、CWD、CDQ(386)

BSWAP(486)數(shù)據(jù)傳送指令2:傳送指令:MOVDST,SRC執(zhí)行操作:(DST)(SRC)

1、通用數(shù)據(jù)傳送指令請(qǐng)參看教材P.48-P.49MOV指令的機(jī)器語言可以有7種格式:

MOVmem/reg1,mem/reg2MOVreg,dataMOVac,memMOVmem,acMOVsegreg,mem/regMOVmem/reg,segregMOVmem/reg,dataDST、SRC不能同時(shí)為段寄存器

MOVDS,ES

立即數(shù)不能直接送段寄存器

MOVDS,2000H

*DST不能是立即數(shù)和CS*DST、SRC不能同時(shí)為存儲(chǔ)器尋址*不影響標(biāo)志位注意:MOVAX,DSEGMOVDS,AX請(qǐng)參看教材P.48-P.49例3.20-3.24

簡(jiǎn)單了解(2)MOVSX和(3)MOVZX(4)進(jìn)棧指令:PUSHSRC

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

(SP)–2((SP)+1,(SP))

(SRC)PUSH指令可以有4種格式:PUSHregPUSHmemPUSHdataPUSHsegreg但8086不允許使用立即數(shù)尋址方式。

(5)出棧指令:POPDST執(zhí)行操作:(DST)

((SP)+1,(SP))

(SP)

(SP)+2POP指令允許的格式有:POP

regPOP

memPOP

segreg(CS除外)堆棧:‘先進(jìn)后出’的存儲(chǔ)區(qū),段地址存放在SS中,SP在任何時(shí)候都指向棧頂,進(jìn)出棧后自動(dòng)修改SP。注意:

*堆棧操作必須以字為單位。

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

*不能用立即尋址方式

PUSH1234H

*DST不能是CSPOPCS

請(qǐng)參看教材P.50-P.51例3.29:假設(shè)(AX)=2107H,執(zhí)行

PUSHAX********(SP)

PUSHAX執(zhí)行前(SP)

********07H21H低地址

高地址PUSHAX執(zhí)行后進(jìn)棧方向(SP)

********07H21HPOPBX執(zhí)行前(SP)

********07H21H低地址

高地址

POPBX執(zhí)行后

(BX)=2107H例3.30:POPBX出棧方向例:PUSHDSSUBAX,AXPUSHAX…………RET例:PUSHAXPUSHBXPUSHCX……;其間用到AX、BX、CXPOPCX;后進(jìn)先出

POPBXPOPAX(6)PUSHAAX,CX,DX,BX,指令執(zhí)行前的SP,BP,SI,DI。PUSHAD(7)

POPASP出棧后如何處理?

POPAD請(qǐng)參看教材P.52(8)XCHG交換指令

交換指令:XCHGOPR1,OPR2

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

(OPR2)注意:

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

*兩個(gè)操作數(shù)必須有一個(gè)在寄存器中*不允許使用段寄存器

例:XCHGBX,[BP+SI]XCHGAL,BH請(qǐng)參看教材P.52-P.532、累加器專用傳送指令(只限使用AX或AL)

輸入指令I(lǐng)N(I/O

CPU)

長(zhǎng)格式:INAL,PORT(字節(jié))

INAX,PORT(字)執(zhí)行操作:(AL)

(PORT)(字節(jié))

(AX)

(PORT+1,PORT)(字)

短格式:INAL,DX(字節(jié))

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

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

輸出指令OUT(CPU

I/O)長(zhǎng)格式:OUTPORT,AL(字節(jié))

OUTPORT,AX(字)執(zhí)行操作:(PORT)

(AL)(字節(jié))

(PORT+1,PORT)

(AX)(字)短格式:OUTDX,AL(字節(jié))

OUTDX,AX(字)執(zhí)行操作:((DX))

(AL)(字節(jié))

((DX)+1,(DX))

(AX)(字)請(qǐng)參看教材P.54注意:*不影響標(biāo)志位*前256個(gè)端口號(hào)00H~FFH可直接在指令中指定(長(zhǎng)格式)*

如果端口號(hào)

256,端口號(hào)

DX(短格式)例3.36:INAX,28H MOVDATA_WORD,AX例3.37:MOVDX,3FCHINAX,DX例3.38:OUT5,AL例:Sound程序

mov

dx,100inal,61handal,11111100bsound:

xoral,2;101out61h,al;ONOFFON

mov

cx,140h;脈寬Wait1:loopwait1

dec

dx

jnesound設(shè)備控制寄存器端口61H1/00控制其它外部設(shè)備與門放大器2號(hào)定時(shí)器門控10(3)換碼指令:XLAT或XLATOPR執(zhí)行操作:(AL)

((BX)+(AL))注意:

*不影響標(biāo)志位*字節(jié)表格(長(zhǎng)度不超過256)

首地址

(BX)*需轉(zhuǎn)換的代碼位移量(AL)請(qǐng)參看教材P.55例:MOVBX,OFFSETTABLE;(BX)=0040HMOVAL,3XLATTABLE

指令執(zhí)行后(AL)=33H33HF0043(BX)

30HF0040TABLE31HF0041(AL)=332HF0042(DS)=F000H3、地址傳送指令

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

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

SRC

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

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

(SRC)(DS)

(SRC+2)

相繼二字

寄存器、DS

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

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

(SRC)(ES)

(SRC+2)

相繼二字

寄存器、ES請(qǐng)參看教材P.55表3.4以上內(nèi)容例3.40:LEABX,[BX+SI+0F62H]

LDSSI,[10H]

LESDI,[BX]40H00H00H30HTABLE(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必須為存儲(chǔ)器尋址方式請(qǐng)參看教材P.55例3.414、標(biāo)志寄存器傳送指令

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

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

(FLAGS的低字節(jié))

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

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

(AH)

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

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

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

(FLAGS)

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

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

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

(SP)+2*影響標(biāo)志位請(qǐng)參看教材P.585、類型轉(zhuǎn)換指令

CBWAL

AX

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

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

CWDAX

(DX,AX)

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

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

例:(AX)=0BA45HCBW;(AX)=0045HCWD;(DX)=0FFFFH(AX)=0BA45H注意:*無操作數(shù)指令*隱含對(duì)AL或AX進(jìn)行符號(hào)擴(kuò)展*不影響條件標(biāo)志位請(qǐng)參看教材P.58算術(shù)指令:

加法指令

ADD、ADC、INC、XADD(486)

減法指令

SUB、SBB、DEC、NEG、CMP

CMPXCHG(486)、CMPXCHG8B(Pentium)

乘法指令

MUL、IMUL

除法指令

DIV、IDIV

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

DAA、DAS(壓縮的BCD碼調(diào)整指令)

AAA、AAS、AAM、AAD(非壓縮)

加法指令

加法指令: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)志外,均對(duì)條件標(biāo)志位有影響。請(qǐng)參看教材P.59加法指令對(duì)條件標(biāo)志位的影響1結(jié)果為負(fù)0否則SF=1結(jié)果為00否則ZF=1和的最高有效位有向高位的進(jìn)位0否則CF=1兩個(gè)操作數(shù)符號(hào)相同,而結(jié)果符號(hào)與之相反0否則OF=那么,CF和OF的區(qū)別是什么呢?CF位表示無符號(hào)數(shù)相加的溢出。OF位表示帶符號(hào)數(shù)相加的溢出。請(qǐng)參看教材P.59下-P.60上說明

00001001+0111110010000101

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

無:9+124=133CF=0

00000111+11111011100000010帶:(+7)+(-5)=+2OF=0無:7+251=2CF=1

10000111+11110101101111100帶:(-121)+(-11)=+124OF=1無:135+245=124CF=1舉例:n=8bit帶符號(hào)數(shù)(-128~127),無符號(hào)數(shù)(0~255)

00000100+0000101100001111帶:(+4)+(+11)=+15OF=0無:4+11=15CF=0帶符號(hào)數(shù)和無符號(hào)數(shù)都不溢出帶符號(hào)數(shù)溢出無符號(hào)數(shù)溢出帶符號(hào)數(shù)和無符號(hào)數(shù)都溢出請(qǐng)參看教材P.60下-P.61上例3.45例3.46:雙精度數(shù)的加法

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

指令序列

ADDAX,CX;(1)ADCDX,BX;(2)

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

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

因此,結(jié)果正確。請(qǐng)參看教材P.61

減法指令減法指令:SUBDST,SRC執(zhí)行操作:(DST)

(DST)-(SRC)帶借位減法指令:SBBDST,SRC執(zhí)行操作:(DST)

(DST)-(SRC)-CF減1指令:DECOPR執(zhí)行操作:(OPR)

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

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

-(OPR)

把操作數(shù)按位求反后末位加1。比較指令:CMPOPR1,OPR2執(zhí)行操作:(OPR1)-(OPR2)注意:*除DEC指令不影響

CF標(biāo)志外,均對(duì)條件標(biāo)志位有影響。請(qǐng)參看教材P.62減法指令對(duì)條件標(biāo)志位(CF/OF/ZF/SF)的影響:CF位表示無符號(hào)數(shù)減法的溢出。OF位表示帶符號(hào)數(shù)減法的溢出。1被減數(shù)的最高有效位有向高位的借位0否則CF=1兩個(gè)操作數(shù)符號(hào)相反,而結(jié)果的符號(hào)與減數(shù)相同0否則OF=1減法轉(zhuǎn)換為加法運(yùn)算時(shí)無進(jìn)位0否則CF=或請(qǐng)參看教材P.63上NEG指令對(duì)CF/OF的影響0操作數(shù)為01否則CF=1操作數(shù)為-128(字節(jié)運(yùn)算)或操作數(shù)為-32768(字運(yùn)算)0否則OF=

00011110+00011111NEG指令對(duì)CF/OF的影響0操作數(shù)為01否則CF=1操作數(shù)為-128(字節(jié)運(yùn)算)或操作數(shù)為-32768(字運(yùn)算)0否則OF=

00001111+000110000

10000111+00011000例3.48SUB[SI+14H],0136H例3.49SUBDH,[BP+4]請(qǐng)參看教材P.63例3.50:x、y、z均為雙精度數(shù),分別存放在地址為X,X+2;

Y,Y+2;Z,Z+2的存儲(chǔ)單元中,用指令序列實(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單元請(qǐng)參看教材P.643、乘法指令

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

帶符號(hào)數(shù)乘法指令:IMULSRC

執(zhí)行操作:字節(jié)操作數(shù)(AX)

(AL)*(SRC)

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

(AX)*(SRC)注意:

*AL(AX)為隱含的乘數(shù)寄存器。*AX(DX,AX)為隱含的乘積寄存器。*SRC不能為立即數(shù)。*除CF和OF外,對(duì)條件標(biāo)志位無定義。請(qǐng)參看教材P.64-P.65乘法指令對(duì)CF/OF的影響:例3.52:(AL)=0B4H,(BL)=11H

(1)

IMULBL

;(AX)(AL)*(BL)

;B4*11CC*11=0FAF4H-1292D

;

(AX)=0FAF4H

CF=OF=1(2)

MULBL

;(AX)(AL)*(BL)

;B4*11

=0BF4H=3060D

;(AX)=0BF4H

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

IMUL指令:CF,OF=

除法指令

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

帶符號(hào)數(shù)除法指令:IDIVSRC

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

(AX)/(SRC)的商

(AH)

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

(AX)

(DX,AX)/(SRC)的商

(DX)

(DX,AX)/(SRC)的余數(shù)注意:

*AX(DX,AX)為隱含的被除數(shù)寄存器。*AL(AX)為隱含的商寄存器。*AH(DX)為隱含的余數(shù)寄存器。*SRC不能為立即數(shù)。*對(duì)所有條件標(biāo)志位均無定義。如何判別結(jié)果有效?請(qǐng)參看教材P.66-P.67例:x,y,z,v均為16位帶符號(hào)數(shù),計(jì)算

(v-(x*y+z–540))/xMOVAX,XIMULY;x*y→(DX,AX)MOVCX,AXMOVBX,DXMOVAX,ZCWD;Z→(DX,AX)ADDCX,AXADCBX,DX;x*y+z→(BX,CX)SUBCX,540SBBBX,0;x*y+z-540MOVAX,VCWD;V→(DX,AX)SUBAX,CXSBBDX,BX;v-(x*y+z-540)IDIVX;(v-(x*y+z-540))/x→(AX)

余數(shù)→(DX)

十進(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 00111001UNPAK00H09H05H03H例:寫出(3590)10的壓縮BCD碼和非壓縮BCD碼,并分別把它們存入數(shù)據(jù)區(qū)PAKED和UNPAK壓縮BCD: (3590)10=(0011010110010000)BCD非壓縮BCD:

(3590)10=(00000011000001010000100100000000)BCDPAKED90H35H問題的提出:十進(jìn)制調(diào)整指令19壓縮BCD:00011001

2700100001+110

+08+00001000

(00100111)BCDAF=1(1)壓縮的BCD碼調(diào)整指令●DAA加法的十進(jìn)制調(diào)整指令●DAS減法的十進(jìn)制調(diào)整指令(2)非壓縮的BCD碼調(diào)整指令(了解)●AAA加法的ASCII碼調(diào)整指令●AAS減法的ASCII碼調(diào)整指令●AAM乘法的ASCII碼調(diào)整指令●AAD除法的ASCII碼調(diào)整指令壓縮BCD運(yùn)算舉例:(1)MOVAL,BCD1;BCD1=34H

ADDAL,BCD2;BCD2=59H,(AL)=8DH

DAA;8DH+06H=93H

MOVBCD3,AL;BCD3=93H(2)MOVAL,BCD1;BCD1=34H

SUBAL,BCD2;BCD2=59H,(AL)=0DBH

DAS;0DBH-60H-06H=75H

MOVBCD3,AL;BCD3=75=-25(10n’補(bǔ)碼)非壓縮BCD運(yùn)算舉例:(1)MULBL;(AX)=(AL)×(BL)=08×09

AAM;(AL)/0AH=48H/0AH→0702(2)AAD;(AX)→(AH)×0AH+(AL)=48H

DIVBL;(AL)=(AX)/(BL)=48H/4=12HAAM;(AL)/0AH=12H/0AH=0108第3章作業(yè)Page109

3.14~3.17

邏輯指令:

邏輯運(yùn)算指令

AND、OR、NOT、XOR、TEST

移位指令

SHL、SHR、SAL、SAR、

ROL、ROR、RCL、RCR請(qǐng)參看教材P.68下請(qǐng)參看教材P.68下邏輯非指令: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)測(cè)試指令:TESTOPR1,OPR2

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

(OPR2)CFOFSFZFPFAF00***無定義

根據(jù)運(yùn)算結(jié)果設(shè)置

邏輯運(yùn)算指令請(qǐng)參看教材P.69至少有一個(gè)操作數(shù)必須存放在寄存器中,另一個(gè)操作數(shù)可以使用任意尋址方式,只有源操作數(shù)可以為立即數(shù)例:屏蔽AL的第0、1兩位

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

ORAL,20H

例:使AL的第0、1位變反

XORAL,3例:測(cè)試某些位是0是1

TESTAL,1JZEVEN

********

OR00100000**1*****

******01XOR00000011

******10

********

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

AND000000010000000*請(qǐng)參看教材P.69-P.69的例題?用AND指令可以使操作數(shù)的某些位被屏蔽,把AND指令的源操作數(shù)設(shè)置成一個(gè)立即數(shù),并把需要屏蔽的位設(shè)為0。?用OR指令可以使操作數(shù)的某些位置1,把OR指令的源操作數(shù)設(shè)置成一個(gè)立即數(shù),并把需要置1的位設(shè)為1。?用TEST指令測(cè)試操作數(shù)的某位是否為0,把TEST指令的源操作數(shù)設(shè)置成一個(gè)立即數(shù),其中需要測(cè)試的位應(yīng)設(shè)為1。?要測(cè)試操作數(shù)的某位是否為1,則可先把該操作數(shù)求反,然后用TEST指令測(cè)試。

?用XOR指令可以使操作數(shù)的某些位變反,把XOR指令的源操作數(shù)設(shè)置成一個(gè)立即數(shù),并把需要變反的位置1。?XOR指令還可以用來測(cè)試某一操作數(shù)是否與另一確定的操作數(shù)相等。如:XORAX,042EHJZMATCH?由于邏輯指令執(zhí)行后,CF=0,因此,很多程序中經(jīng)常用到寄存器自身“與”,“或”,“異或”等操作,其主要目的是使CF清0。

CF0邏輯左移SHLOPR,CNT邏輯右移SHROPR,CNT算術(shù)左移SALOPR,CNT(同邏輯左移)算術(shù)右移SAROPR,CNT

0CFCF

4.移位指令循環(huán)左移ROLOPR,CNT循環(huán)右移ROROPR,CNT帶進(jìn)位循環(huán)左移RCLOPR,CNT帶進(jìn)位循環(huán)右移RCROPR,CNTCF

CFCFCF注意:

*OPR可用除立即數(shù)以外的任何尋址方式*CNT=1,SHLOPR,1CNT>1,MOVCL,CNTSHLOPR,CL;以SHL為例*條件標(biāo)志位:

CF=移入的數(shù)值

1CNT=1時(shí),最高有效位的值發(fā)生變化0CNT=1時(shí),最高有效位的值不變移位指令:

SF、ZF、PF根據(jù)移位結(jié)果設(shè)置,AF無定義循環(huán)移位指令:

不影響SF、ZF、PF、AFOF=請(qǐng)參看教材P.73下請(qǐng)參看教材P.74-P.75的例題例:(AX)=0012H,(BX)=0034H,把它們裝配成(AX)=1234H

例:(BX)=84F0H(1)(BX)為無符號(hào)數(shù),求

(BX)/2

SHRBX,1

;(BX)=4278H(2)(BX)為帶符號(hào)數(shù),求

(BX)×2

SALBX,1

;(BX)=09E0H,OF=1(3)(BX)為帶符號(hào)數(shù),求

(BX)/4MOVCL,2 SARBX,CL;(BX)=0E13CHMOVCL,8ROLAX,CLADDAX,BX

0000

(SP)MOVCH,4;循環(huán)次數(shù)MOVCL,4;移位次數(shù)NEXT:ROLBX,CLMOVAX,BXANDAX,0FHPUSHAXDECCHJNZNEXT00080004000F(3)(BX)=84F0H,把

(BX)

中的16位數(shù)每4位壓入堆棧3.3.4串處理指令:

設(shè)置方向標(biāo)志指令

CLD、STD

串處理指令

串重復(fù)前綴

MOVSB/MOVSWREPSTOSB/STOSWREPE/REPZLODSB/LODSWREPNE/REPNZCMPSB/CMPSWSCASB/SCASW

請(qǐng)參看教材P.75與REP配合工作的MOVS/STOS

溫馨提示

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