微機(jī)原理及應(yīng)用-chap4-2013_第1頁
微機(jī)原理及應(yīng)用-chap4-2013_第2頁
微機(jī)原理及應(yīng)用-chap4-2013_第3頁
微機(jī)原理及應(yīng)用-chap4-2013_第4頁
微機(jī)原理及應(yīng)用-chap4-2013_第5頁
已閱讀5頁,還剩169頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第四章8086指令系統(tǒng)4.1匯編語言指令的格式與尋址方式4.2數(shù)據(jù)傳輸類指令4.3算術(shù)加法類指令4.4邏輯操作類指令4.5程序轉(zhuǎn)移類指令4.6字符串操作指令(了解)4.7處理器控制類指令(了解)Chap4指令系統(tǒng)根據(jù)設(shè)計(jì)使某型計(jì)算機(jī)所具有的指令的集合便是計(jì)算機(jī)的指令系統(tǒng)。指令的表達(dá)形式:機(jī)器碼指令和匯編語言指令。①用二進(jìn)制代碼表示的指令稱為機(jī)器碼指令或目標(biāo)代碼指令。②因?yàn)闄C(jī)器碼指令難以記憶和編程,就將指令操作功能的英文縮寫作為指令的符號(hào),稱為助記符。用助記符表示的指令便于記憶和編程,但不能被計(jì)算機(jī)直接識(shí)別和執(zhí)行,必須經(jīng)過匯編轉(zhuǎn)換為機(jī)器碼后才能執(zhí)行,匯編語言指令由此而得名。

4.1匯編語言指令的格式和尋址方式[標(biāo)號(hào)]:(助記符)[操作數(shù)][,操作數(shù)][;注釋]START:MOVAX,DATA;將數(shù)據(jù)段地址送AX寄存器1.標(biāo)號(hào)是給該指令所在地址取的名字,必須后跟“:”,它可以缺省,是可供選擇的標(biāo)識(shí)符。2.指令助記符是指令功能的代表符號(hào),它是指令語句中的關(guān)鍵字段,不可缺省,它表示本指令的操作功能。3.操作數(shù)是參加指令操作的數(shù)據(jù),可缺省源操作數(shù)——指令中參與操作的數(shù)據(jù),源地址目的操作數(shù)——指令操作結(jié)果,目的地址4.注釋可缺省,必須用“;”指明。一、

8086匯編語言指令格式MOVBX,1000H;將1000H送BXINCCX ;將CX內(nèi)容加1NOP ;空操作二、

8086的尋址方式尋址方式——尋找操作數(shù)所在地址的方式。七種立即數(shù)尋址寄存器尋址直接尋址寄存器間接尋址基址尋址變址尋址基址加變址尋址存儲(chǔ)單元或某個(gè)寄存器e.g.MOVAL,05H;將05H送入ALMOVAX,3064H;3064H→AX,64H→AL,30H→AH1.立即數(shù)尋址操作數(shù)就在指令中,跟在操作碼后面,稱為立即數(shù)。在指令格式中,立即數(shù)一般為源操作數(shù)。操作數(shù)在CPU內(nèi)部寄存器中,指令指定寄存器名稱,存取此類操作數(shù)在CPU內(nèi)部執(zhí)行,速度快。2.寄存器尋址

對于16位操作數(shù),寄存器可以是:

AX,BX,CX,DX,SP,BP,SI,DI,DS,CS,ES,SS

對于8位操作數(shù),寄存器可以是:

AL,AH,BL,BH,CL,CH,DL,DH

可以對源操作數(shù)采用寄存器尋址,也可以對目的操作數(shù)采用寄存器尋址,還可以兩者都采用寄存器尋址方式。e.g.指令執(zhí)行前:(AX)=3064H (SS)=1234H

MOVSS,AX指令執(zhí)行后:(SS)=3064H

(AX)保持不變。

指令執(zhí)行前:指令執(zhí)行后:寄存器尋址方式八位寄存器:AH,AL,BH,BH,BL,CH,CL,DH,DL十六位通用寄存器:AX,BX,CX,DX,SP,BP,SI,DI堆棧指針 SP指令指針 IP(或PC)標(biāo)志位 Flags目的和源變址寄存器 DI,SI段寄存器 CS,DS,ES,SS通用寄存器 rAL或AX(取決于操作數(shù)長度)acc指令系統(tǒng)使用的符號(hào):src,dest

源,目的操作數(shù)(下列尋址方式都可以用)

[BX+SI+n],[BX+DI+n],[BP+SI+n],[BP+DI+n] [SI+n], [DI+n],[BP+n],[BX+n] [N], r

[] 存儲(chǔ)器單元的內(nèi)容(正常在數(shù)據(jù)段)ES:[] 附加存儲(chǔ)器段的內(nèi)容OPRD 操作數(shù)

Seg

段寄存器(CS,DS,ES,SS)im

立即數(shù)(n8位, nn16位,nnnn32位)

物理地址:

PA=(DS)×16﹢EA3.直接尋址注意:(1)直接尋址方式適用于處理單個(gè)變量。(2)直接尋址方式隱含的段寄存器是DS,8086允許段跨越,即允許使用CSSSES作為段寄存器,這時(shí),必須在令中特別標(biāo)明。操作數(shù)一般存放在存儲(chǔ)器的數(shù)據(jù)段(DS段)中,而操作數(shù)的有效地址(偏移量)EA由指令給出。

e.g.MOVAX,[3100H](DS)=6000H,(63100H)=3050H則:(AX)=3050H另:可用符號(hào)地址代替數(shù)值地址。MOVAX,VALUE或MOVAX,[VALUE]VALUE——有效操作數(shù)單元的符號(hào)地址。如:VALUE在附加段中,則應(yīng)指定段跨越。MOVAX,ES:VALUE或MOVAX,ES:[VALUE]直接尋址方式操作數(shù)在存儲(chǔ)器(內(nèi)存)中,操作數(shù)地址的16位偏移量包含在:BP、BX、SI、DI寄存器中。4.寄存器間接尋址(1)若選擇SI、DI、BX作為間接尋址

操作數(shù)一般在現(xiàn)行數(shù)據(jù)段區(qū)域中,用(DS)作為段地址。即操作數(shù)物理地址為:物理地址PA=16d×(DS)+(BX)物理地址PA=16d×(DS)+(SI)物理地址PA=16d×(DS)+(DI)e.g.MOVBX,[DI](DS)=6000H(DI)=2000HPA=62000H(62000H)=50A0H(BX)=50A0H直接尋址方式:MOVBX,[2000H]寄存器間接尋址方式(2)若選擇寄存器BP作為間接尋址操作數(shù)在堆棧段區(qū)域中,用SS寄存器的內(nèi)容作為段地址。操作數(shù)物理地址:

PA=(SS)×16+(BP)e.g.MOV[BP],AX執(zhí)行前:(SS)=1000H, (BP)=3000H, (AX)=1234H執(zhí)行后:PA=13000H(13000H)=1234H寄存器間接尋址方式(3)用SI、DI、BX、BP作為間接尋址允許段跨越指令中可以指定段跨越前綴來取得其他段中的數(shù)據(jù)。e.g.MOVES:[DI],AXMOVDX,DS:[BP]這種尋址方法可以用于表格處理。操作數(shù)的有效地址是一個(gè)基址寄存器的內(nèi)容和指令中指定位移量(displacement)之和。EA=BXBP+8位位移量16位位移量5.基址尋址(BX,BP)

用BX寄存器進(jìn)行基址尋址時(shí),默認(rèn)的段寄存器為數(shù)據(jù)段DS。用BP寄存器進(jìn)行基址尋址時(shí),默認(rèn)的段寄存器為堆棧段SS。

e.g.MOVAX,COUNT[BP]MOVAX,[COUNT+BP]MOVAX,COUNT+[BP]

COUNT為16位位移量。指令執(zhí)行前:(SS)=5000H,(BP)=3000H,COUNT=2040H,(AX)=1234H指令執(zhí)行后:

EA=5040HPA=55040H(55040H)=5548H(AX)=5548H

基址尋址方式

MOVAX,COUNT[BP]操作數(shù)的有效地址是一個(gè)變址寄存器的內(nèi)容和指令中指定的8位或16位位移量之和,變址寄存器名均有指令指定。EA=SIDI+8位位移量16位位移量6.變址尋址(DI,SI)

所用寄存器為SI和DI,它們分別稱為源變址寄存器和目的變址寄存器。這兩個(gè)寄存器中的內(nèi)容在串操作指令執(zhí)行過程中會(huì)自動(dòng)修改,以指向下一個(gè)操作數(shù)。默認(rèn)為段寄存器為DS。e.g.MOVAX,[DI+COUNT]orMOVAX,COUNT[DI]執(zhí)行指令前:

(DS)=3200H,COUNT=0456H,(DI)=1094H(334EAH)=67H(334EBH)=45H執(zhí)行指令后:

EA=14EAH PA=334EAH (AX)=4567H變址尋址方式

MOVAX,COUNT[DI]操作數(shù)有效地址是一個(gè)基址寄存器和一個(gè)變址寄存器的內(nèi)容和8位或16位位移量之和。EA=SIDI+8位位移量16位位移量BXBP+7.基址加變址尋址e.g.MOVAX,MASK[BX][DI]MOVAX,MASK[BX+DI]MOVAX,[MASX+BX+DI]執(zhí)行指令前:(DS)=3000H(BX)=1346H(DI)=0500HMASK=1234H(32A7AH)=4050H執(zhí)行指令后:EA=2A7AHPA=32A7AH(AX)=4050H基址加變址MOVAX,[MASK+BX+DI]用途:這種尋址方式為堆棧處理提供方便:

(BP)

棧頂(一般BP可指向棧頂)從棧頂?shù)綌?shù)組的首地址可以用位移量表示(MASK).

變址寄存器(SI)或(DI)——指向數(shù)組中某個(gè)元素?!偷刂犯叩刂穂BP]棧頂DI位移量A(0)A(1)A(2)A(n)8086尋址方式小結(jié)立即數(shù)尋址寄存器尋址直接尋址寄存器間接尋址基址尋址變址尋址基址加變址尋址可執(zhí)行目標(biāo)文件:“.EXE”目標(biāo)代碼文件:“.OBJ”,沒有確定的物理地址,“.ASM”若有錯(cuò),給出信息源程序文件:“.ASM”“.asm”——編輯edit匯編得到結(jié)果,觀察結(jié)果是否正確,錯(cuò)誤鏈接若干.OBJ調(diào)試MS-DOS下7.1概述附:(1)DOS命令行操作過程:C:\WINDOWS\>cd\C:\>cd

masn(進(jìn)入masn文件夾)C:\MASN>edit(編輯源文件)C:\MASN>masm

文件名.asm

(匯編,生成.obj目標(biāo)文件)C:\MASN>link文件名.obj

(鏈接,生成.exe可執(zhí)行文件)C:\MASN>debug文件名.exe(調(diào)試可執(zhí)行文件)-u(反匯編,記錄數(shù)據(jù)段段基址的值)-g(連續(xù)執(zhí)行)-d數(shù)據(jù)段段基址:0(顯示數(shù)據(jù)段數(shù)據(jù))-q(退出DEBUG)c:\masm>exit(退出命令行操作)************************************************datasegment

;數(shù)據(jù)段開始xdb4

ydb3

zdb?

dataends;數(shù)據(jù)段結(jié)束*************************************************codesegment;代碼段開始assumecs:code,ds:datastart:mov

ax,data

;主程序開始

mov

ds,ax

;數(shù)據(jù)段段基址→DS

mov

al,x

;x→al(al=4)

addal,y

;al+y→al(al=7)

mov

z,al

;al→z(x+y=7→z)

addz,30h;結(jié)果轉(zhuǎn)換為ASCII碼(z=37h)

mov

dl,z;z→dl(dl=37h)

movah,2;ah=2

int21h;2號(hào)調(diào)用,顯示輸出結(jié)果

movah,4ch;4ch號(hào)調(diào)用,

int21h;過程終止返回操作系統(tǒng)

codeends

;代碼段結(jié)束**********************************************************

endstart;主程序結(jié)束7.2偽指令和宏指令格式:[名字]定義符[參數(shù)1][;注釋]一、偽指令語句無冒號(hào)作用:指導(dǎo)匯編程序進(jìn)行匯編,不產(chǎn)生目標(biāo)代碼,不占用內(nèi)存功能:提供如下信息:如何分段,段的定義,段間關(guān)系,模塊定義,模塊間關(guān)系,數(shù)據(jù)定義,開始匯編,結(jié)束匯編不可缺省常數(shù)、字符串、常量名、變量名,標(biāo)號(hào),專用符號(hào)1.符號(hào)定義偽指令2.數(shù)據(jù)定義偽指令3.段定義偽指令4.段寄存器說明偽指令5.過程定義偽指令6.模塊定義偽指令7.定位偽指令偽指令等值語句

符號(hào)名EQU表達(dá)式表達(dá)式類型:常數(shù)或數(shù)值,地址,變量、標(biāo)號(hào)、寄存器、指令助記符1.符號(hào)定義偽指令(EQU,=)e.g.COUNTEQU5NUMEQUCOUNT+5e.g.ADDREQUDS:[DI+7]e.g.LABLEEQUSTART+BETCNTEQUBXCBDEQUSUB注:EQU定義的符號(hào)名不能被重新定義

等號(hào)語句

符號(hào)名=表達(dá)式e.g.NUM=6NUM=NUM+2注:與EQU區(qū)別在于符號(hào)名可以重新定義

數(shù)據(jù)定義語句符號(hào)名Dn

表達(dá)式DB、DW、DD、DQ、DT字節(jié)、字、雙字、4字、5字的變量。

2.數(shù)據(jù)定義偽指令(DB,DW,DD,DQ)表達(dá)式類型:(1)數(shù)值常數(shù):十進(jìn)制、八進(jìn)制、十六進(jìn)制、二進(jìn)制等,缺省形式是十進(jìn)制;存儲(chǔ)為二進(jìn)制補(bǔ)碼形式(2)字符常量,用單引號(hào)括起來,被存儲(chǔ)的是該字符的ASCII碼;(3)符號(hào)常量,必須是預(yù)先已定義的符號(hào);(4)符號(hào)“?”,表示預(yù)留空間,內(nèi)容不定;

e.g.定義賦初值的變量

xxDB1,-1,0fcH

yyDW1,-1,0fcH

zzDD1,-1,0fcH注意:(1)DB定義的數(shù)據(jù),每個(gè)數(shù)據(jù)元素占據(jù)1個(gè)存儲(chǔ)單元;DW定義的數(shù)據(jù),每個(gè)數(shù)據(jù)元素占據(jù)2個(gè)存儲(chǔ)單元;(2)字?jǐn)?shù)據(jù)存儲(chǔ)時(shí),低字節(jié)存儲(chǔ)在低地址單元中,高字節(jié)存儲(chǔ)在高地址單元中;e.g.定義字符串變量(只能用DB定義)str1DB'TsingHua'str2DB'INPUT:',0dH,0aH,'$'注意:3個(gè)及其以上的字符,只能用DB定義str1DW‘a(chǎn)bcd’;錯(cuò)str2DD‘a(chǎn)bcd’;錯(cuò)str1DW‘a(chǎn)b’,‘cd’;對,每組字符串中前一字符作高字節(jié),后一字符作低字節(jié)。str2DD‘a(chǎn)b’;對,前一字符存放于第二字節(jié),后一字符存放于第一字節(jié),兩個(gè)高字節(jié)存放00H。str1str25473696e67487561494e5055543a0d0a24‘T’‘s’‘i’‘n’‘g’‘H’‘u’‘a(chǎn)’‘I’‘N’‘P’‘U’‘T’‘:’0dH0aH‘$’e.g.利用DW偽指令可存放偏移地址,DD偽指令可存放偏移地址和段地址

XXDWOFFSETXLISTDDLABELOFFSETX為XX在其段內(nèi)的偏移地址LABEL為雙字,一字為偏移地址,一字為段地址當(dāng)e.g.表達(dá)式中出現(xiàn)‘?’,分配并保留存儲(chǔ)空間

ABCDB?,?DEFDW?,50,?----32H00H--ABCDEFe.g.D1DB3DUP(11,?)D2DW2DUP(4,?)D3DB2DUP(‘AB’,2,DUP(8))0BH-0BH-0BH-D104H00H--04H00H--D241H42H08H08H41H42H08H08HD3

數(shù)據(jù)復(fù)制語句重復(fù)的次數(shù)重復(fù)的內(nèi)容nDUP(表達(dá)式)段名

SEGMENT

[定位類型][組合類型][‘類別’]…段名

ENDS

[定位類型]說明段的起始地址應(yīng)有怎樣的邊界值BYTE:********************B,即段可以從任何地址開始;WORD:*******************0B,即段的起始地址必須為偶地址;PARA:****************0000B,即段從節(jié)邊界開始,每16個(gè)字節(jié)為1小段,所以,其起始地址必為16的倍數(shù)。PAGE:************00000000B,即段從頁邊界開始,每256個(gè)字節(jié)為1頁,所以,其起始地址必為256的倍數(shù)。

3.段定義偽指令PUBLIC:將同類別名段組裝在一起形成一個(gè)邏輯段;STACK:與PUBLIC一樣,只用于堆棧段。在匯編及連接后,系統(tǒng)自動(dòng)為SS及SP分配值,在可執(zhí)行程序中,SP初值指向棧底。COMMON:同名段從同一個(gè)內(nèi)存地址開始裝入。所以,各個(gè)邏輯段將發(fā)生覆蓋。連接以后,該段長度取決于同名段中最長的那個(gè),而內(nèi)容有效的是最后裝入的那個(gè)。MEMORY:與PUBLIC同義,只不過MEMORY定義的段裝在所有同名段的最后。若連接時(shí)出現(xiàn)多個(gè)MEMORY,則最先遇到的段按組合類型MEMORY處理,其他段組合類型按PUBLIC處理。ATexp:段地址為表達(dá)式exp的值(長度為16位)。此項(xiàng)不能用于代碼段。e.g.AT7000H;定位的段地址為7000H,不用于代碼段[組合類型]說明程序連接時(shí)的段合并方法[‘類別’]:不能與程序中變量、標(biāo)號(hào)和其它符號(hào)名相同。匯編程序鏈接時(shí)只使同類別的段發(fā)生關(guān)聯(lián),并組成段組的名字,如‘STACK’,‘CODE’。ASSUME

段寄存器名:段名[,段寄存器名:段名…]

e.g.ASSUMEDS:DSEG,CS:CSEG,ES:ESEG,SS:SESGe.g.ASSUMECS:CODE,DS:DATA,ES:DATAAttention:該偽指令只是指示各邏輯段使用段寄存器的情況,并沒有對段寄存器的內(nèi)容進(jìn)行賦值。DS、ES的值必須在程序段中用指令語句進(jìn)行賦值,而CS、SS由系統(tǒng)負(fù)責(zé)設(shè)置,程序中也可對SS進(jìn)行賦值,但不允許對CS賦值。4.段寄存器說明偽指令例

用程序?qū)崿F(xiàn)1234H+5678H

dataSEGMENTvalueDW1234H,5678HresultDW?

dataENDS

codeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;給DS賦值

MOVDS,AXMOVAX,value;取數(shù)

ADDAX,value+2;兩數(shù)相加

MOVresult,AX;保存結(jié)果

MOVAH,4CH;返回DOSINT21H

codeENDSENDstart34H12H78H56H--

value

result注意:PROC與ENDP必須成對出現(xiàn);NEAR時(shí)表示段內(nèi)調(diào)用,F(xiàn)AR表示段間調(diào)用,未指定時(shí),認(rèn)為是NEAR一個(gè)過程中可以有一個(gè)以上的返回指令RET,它們不必放在過程的最后。調(diào)用時(shí)Call過程名過程名

PROC

類型屬性[FAR,NEAR]…

RET…過程名

ENDP

5.過程(子程序)定義偽指令注意:NAME和END成對出現(xiàn)程序開始可以用NAME或TITLE為模塊取名字標(biāo)號(hào)指示程序開始執(zhí)行的起始地址,如果多個(gè)程序模塊相連接,則只有主程序要使用標(biāo)號(hào),其他子程序模塊則只用END而不必指定標(biāo)號(hào)。NAME模塊名

…END[標(biāo)號(hào)]6.模塊定義偽指令功能:指定其后的程序段或數(shù)據(jù)塊的起始地址的偏移量。數(shù)值表達(dá)式的值是一個(gè)無符號(hào)數(shù)。ORG數(shù)值表達(dá)式自動(dòng)排版語句

PAGE行數(shù),行字?jǐn)?shù)建立標(biāo)題語句

TITLE標(biāo)題建立小標(biāo)題語句

SUBTIL小標(biāo)題7.定位偽指令(ORG)8.列表偽指令1.宏定義和宏名字(宏指令)宏名字MACRO[形式參數(shù)1,形式參數(shù)2,…]…ENDM宏定義:為需要多次重復(fù)書寫的程序段確立(定義)一個(gè)名字。宏調(diào)用:經(jīng)過宏定義的程序段在此后重復(fù)書寫時(shí)用宏名字代替。宏展開:匯編時(shí),匯編程序遇到宏名字將其對應(yīng)的宏體展開。宏體二、宏指令語句

宏指令是程序中具有獨(dú)立功能的一段程序代碼。在匯編語言中,如果需要多次使用同一段程序,可以將這個(gè)程序段定義(宏定義)為一個(gè)宏指令,然后每次需要時(shí),即可簡單地用宏指令名來代替(宏調(diào)用),避免重復(fù)書寫,也使程序簡潔、易讀。e.g.實(shí)現(xiàn)兩個(gè)八位二進(jìn)制數(shù)相乘,結(jié)果送BX所指單元MULTPLYMACROOPR1,OPR2PUSHAXMOVAL,OPR1IMULOPR2MOV[BX],AXPOPAXENDM宏名字形式參數(shù)宏體宏調(diào)用…MULTPLY3AH,06H…MULTPLY0C2H,6BH…宏展開…PUSHAXMOVAL,3AHIMUL06HMOV[BX],AXPOPAX…

注意:宏調(diào)用前必須進(jìn)行宏定義宏調(diào)用與子程序調(diào)用完全不同

子程序在執(zhí)行時(shí),每調(diào)用一次都要保護(hù)和恢復(fù)返回地址及寄存器的內(nèi)容等,這些操作都額外增加了時(shí)間。因而導(dǎo)致CPU執(zhí)行程序的時(shí)間長,速度慢。而宏指令在執(zhí)行時(shí)不存在保護(hù)和恢復(fù)返回地址及寄存器內(nèi)容的問題,執(zhí)行的時(shí)間短,速度快。因而從程序執(zhí)行時(shí)間長短這個(gè)角度來說,宏指令優(yōu)于子程序。

當(dāng)要重復(fù)執(zhí)行的程序不長,重復(fù)次數(shù)又多時(shí),速度是主要問題,通常用宏指令;而要重復(fù)執(zhí)行的程序較長,重復(fù)次數(shù)又不是太多時(shí),額外操作所附加的時(shí)間就不明顯了,節(jié)省內(nèi)存空間應(yīng)視為主要問題,通常采用子程序結(jié)構(gòu)。8086的指令系統(tǒng)8086的指令系統(tǒng)中共有92種基本指令,可以分成6個(gè)功能組:1. 數(shù)據(jù)傳輸2. 算術(shù)運(yùn)算3. 邏輯運(yùn)算和移位指令4. 程序轉(zhuǎn)移5. 字符串操作(了解)6. 處理器控制(了解)八位寄存器:AH,AL,BH,BH,BL,CH,CL,DH,DL十六位通用寄存器:AX,BX,CX,DX,SP,BP,SI,DI堆棧指針 SP指令指針 IP(或PC)標(biāo)志位 Flags目的和源變址寄存器 DI,SI段寄存器 CS,DS,ES,SS通用寄存器 rAL或AX(取決于操作數(shù)長度)acc指令系統(tǒng)使用的符號(hào):src,dest

源,目的操作數(shù)(下列尋址方式都可以用)

[BX+SI+n],[BX+DI+n],[BP+SI+n],[BP+DI+n] [SI+n], [DI+n],[BP+n],[BX+n] [N], r

[] 存儲(chǔ)器單元的內(nèi)容(正常在數(shù)據(jù)段)ES:[] 附加存儲(chǔ)器段的內(nèi)容OPRD 操作數(shù)

Seg

段寄存器(CS,DS,ES,SS)im

立即數(shù)(n8位, nn16位,nnnn32位)功能:

負(fù)責(zé)把數(shù)據(jù)、地址或立即數(shù)傳送到寄存器或存儲(chǔ)單元。特點(diǎn):

它是計(jì)算機(jī)最基本、最重要的一種操作,使用比例最高。種類(分四種):4.2數(shù)據(jù)傳送指令通用傳送指令輸入輸出指令目標(biāo)地址傳送指令標(biāo)志位傳送指令8086提供方便靈活的通用的傳送操作,適用于大多數(shù)操作數(shù)。一、

通用傳送指令

通用傳送指令(除了XCHG以外)是唯一允許以段寄存器為操作數(shù)的指令。通用傳送指令包括:

1、傳輸指令MOV 2、堆棧操作指令PUSHPOP 3、交換指令XCHG 4、換碼指令XLAT

MOV dest, src;(dest)

(src)

目的 源 目的

源1.MOV功能:(1)把一個(gè)字節(jié)(B)或一個(gè)字(W)操作數(shù)由源傳送至目的。(2)實(shí)現(xiàn):

寄存器

寄存器/存儲(chǔ)器立即數(shù)

寄存器/存儲(chǔ)器寄存器/存儲(chǔ)器

段寄存器①CPU內(nèi)部寄存器之間的數(shù)據(jù)的任意傳送(除了代碼段寄存器CS和指令指針I(yè)P以外)。MOVDL,CH ;8位寄存器

8位寄存器MOVAX,DX;16位寄存器

16位寄存器MOVSI,BP;16位寄存器

16位寄存器MOVDS,BX ;通用寄存器段寄存器MOVAX,CS

;段寄存器

通用寄存器

段寄存器之間不能傳送。 MOVES,DS;錯(cuò)

MOVAX,DS MOVES,AX;對。立即數(shù)傳送至CPU內(nèi)部通用(專用)寄存器組

用于給寄存器(AX、BX、CX、DX、BP、SP、SI、DI)賦初值。

不能直接給段寄存器賦值例: MOVCL,04H ;立即數(shù)

8位寄存器MOVAX,03FFH ;立即數(shù)

16位寄存器MOVWORDPTR[SI],057BH;立即數(shù)存儲(chǔ)器MOVBYTEPTRMEM,5;立即數(shù)存儲(chǔ)器例:MOVDS,2000H錯(cuò)。MOVAX,2000HMOVDS,AX對

CPU內(nèi)部寄存器(除CS和IP外)與存儲(chǔ)器(所有尋址方式)之間數(shù)據(jù)傳送??梢詫?shí)現(xiàn)一字節(jié)或一個(gè)字的傳送。MOVMEM,AX ;累加器

存儲(chǔ)器,直接尋址MOVMEM,DS;段寄存器

存儲(chǔ)器,直接尋址MOV[BX],CX;寄存器

存儲(chǔ)器,基址尋址MOVAX,[SI];存儲(chǔ)器

累加器,變址尋址MOVDS,MEM;存儲(chǔ)器

段寄存器,直接尋址MOVCX,[BX][SI];存儲(chǔ)器

累加器,基址加變址

存儲(chǔ)單元(內(nèi)存)之間不能直接傳送 MOVMEM2,MEM1錯(cuò)

MOVAX,MEM1對

MOVMEM2,AX對注意CS和IP的使用:CS和IP不能作為目的操作數(shù),可以作為源操作數(shù)。例: MOVCS,AX;錯(cuò)

MOVAX,CS;對。

MOVIP,AX;錯(cuò)

MOVAX,IP;對。(1)CS和IP(2)段地址的默認(rèn)

BX、SI、DI尋址默認(rèn)段地址寄存器為DS,

BP尋址默認(rèn)段地址寄存器SS。(3)【了解】凡是遇到給SS賦值指令,系統(tǒng)自動(dòng)禁止外部中斷,執(zhí)行本條指令和下條指令后,恢復(fù)對SS寄存器賦值前的中斷開放情況。這樣做為了允許程序員連續(xù)用兩條指令分別對SS和SP寄存器賦值,同時(shí)又防止堆??臻g變動(dòng)過程出現(xiàn)中斷。在修改SS和SP的指令之間不要插入其他指令。(4) 所有通用傳送指令不影響標(biāo)志位。(除SAHF、POPF指令以外)。堆棧操作指令。(1)堆棧堆?!凑障冗M(jìn)后出原則組織的一段內(nèi)存區(qū)域,特點(diǎn):

①下推式的(規(guī)定堆棧設(shè)置在堆棧段內(nèi))改變SP的內(nèi)容②隨著推入堆棧內(nèi)容增加,SP的值減小。③先進(jìn)后出工作原則(LastInFirstOut簡稱LIFO)2.PUSH,POP堆棧在內(nèi)存中的情況:可以用一條立即數(shù)傳送指令給SP賦值,確定SP在SS段中的初始位置。例:設(shè):(SS)=9000H,堆棧段為64KBMOVSP,0E200H;(SP)=0E200H則:整個(gè)堆棧段的物理地址范圍為:90000H~9FFFFH

棧頂?shù)奈锢淼刂窞椋?E200H堆棧在內(nèi)存中的情況如右圖所示:堆棧在內(nèi)存中的情況(2)堆棧操作指令

(堆棧操作指令有兩條):入棧指令格式:PUSHsrc ;(SP)

(SP)-2

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

(src)修改堆棧指針,把一個(gè)字的源操作數(shù)

壓入堆棧頂部e.g.PUSHAX

出棧指令

格式:POPdest ; (dest)

((SP)+1,(SP))

;(SP)

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

指定的目的操作數(shù),同時(shí)進(jìn)行修改堆棧指針的操作。

e.g.POPBX(3)堆棧用途:

存放CPU寄存器或存儲(chǔ)器中暫時(shí)不使用的數(shù)據(jù),使用數(shù)據(jù)時(shí)將其彈出;調(diào)用子程序,響應(yīng)中斷時(shí)都要用到堆棧。調(diào)用子程序(或過程)或發(fā)生中斷時(shí)要保護(hù)斷點(diǎn)的地址,子程序或中斷返回時(shí)恢復(fù)斷點(diǎn)。注意:SP——堆棧指針,始終指向棧頂。

SP初值用MOVSP,im來設(shè)定。

存放CPU寄存器或存儲(chǔ)器中暫時(shí)不使用的數(shù)據(jù),PUSHAX ;將(AX)入棧(AX)(AX)使用數(shù)據(jù)時(shí)將其彈出:

POPBX

調(diào)用子程序(或過程)或發(fā)生中斷時(shí)要保護(hù)斷點(diǎn)的地址,子程序或中斷返回時(shí)恢復(fù)斷點(diǎn)。子程序嵌套斷點(diǎn)地址壓入和彈出情況

應(yīng)用時(shí)注意:①堆棧操作都按字操作。②PUSH,POP指令的操作數(shù)可能有三種:寄存器(通用寄存器,地址指針,變址寄存器),段寄存器(CS除外,PUSHCS合法,POPCS非法),存儲(chǔ)器。③執(zhí)行PUSH指令,(SP)-2

(SP),低字節(jié)放在低地址,高字節(jié)放在高地址。隨著推入堆棧內(nèi)容增加,堆棧就擴(kuò)展,SP的值減少,但SP總是指向棧頂。④堆棧工作原則后進(jìn)先出。

PUSH,POP指令應(yīng)該成對使用,保持堆棧原有狀態(tài)。堆棧應(yīng)用舉例:

例:用BP的基址指令代替POP指令

…MOVBP,SPPUSHAXPUSHBXPUSHCX …MOVCX,[BP-6]

MOVBX,[BP-4]MOVAX,[BP-2] …ADDSP,6例:壓入堆棧的內(nèi)容與彈出內(nèi)容順序相反…PUSH AXPUSHBXPUSHCX…POPCXPOPBXPOPAX 格式:XCHGdest,src ;(dest)

(src)把一個(gè)字節(jié)或一個(gè)字的源操作數(shù)與目的操作數(shù)相交換。3.交換指令XCHG

寄存器之間、寄存器和存儲(chǔ)器之間

允許字或字節(jié)操作,不影響標(biāo)志位?!链鎯?chǔ)器之間不能交換,兩個(gè)操作數(shù)中必須有一個(gè)在寄存器中;×

段寄存器不能作為一個(gè)操作數(shù);應(yīng)用舉例:

XCHGBL,DL XCHGAX,SI XCHGCOUNT[DI],AX

XCHG[BX],[DI] (錯(cuò))

XCHGDS,AX(錯(cuò))該指令不影響標(biāo)志位。格式:XLAT;(AL)←((BX)+(AL))起始地址預(yù)存在BX中,AL中存放的是偏移地址。XLAT指令使用方法:

先建立一個(gè)字節(jié)表格;

表格首偏移地址存入BX;

需要轉(zhuǎn)換代碼的序號(hào)(相對與表格首地址位移量)存入AL;(表中第一個(gè)元素的序號(hào)為0)

執(zhí)行XLAT指令后,表中指定序號(hào)的元素存于AL中。(AL)為轉(zhuǎn)換的代碼。4.換碼指令XLATXLAT指令應(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,0AHXLAT假設(shè): (DS)=0F000H,

Hex_table=0040H

(AL)=0AH執(zhí)行XLAT以后:(AL)=41H=(0F004AH), 即“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碼表輸入輸出指令共兩條,用于CPU和外設(shè)之間的數(shù)據(jù)傳送

1.IN

2.OUT

輸入指令用于CPU從外設(shè)端口接收數(shù)據(jù)(讀),

輸出指令用于CPU向外設(shè)端口發(fā)送數(shù)據(jù)(寫)。

無論接受還是發(fā)送數(shù)據(jù),必須通過累加器AX(字)或AL(字節(jié)),又稱累加器專用傳送指令。

輸入、輸出指令不影響標(biāo)志位。二、

輸入輸出指令

每個(gè)外設(shè)要占幾個(gè)端口:數(shù)據(jù)口,狀態(tài)口和控制口。每個(gè)端口像存儲(chǔ)單元一樣要賦予一個(gè)地址,稱端口地址。信息交換要通過端口:在IBMPC機(jī)里,可以配接許多外部設(shè)備,每個(gè)外設(shè)與CPU之間交換數(shù)據(jù)、狀態(tài)信息和控制命令,每一種信息交換都要通過一個(gè)端口來進(jìn)行。端口數(shù):外部設(shè)備最多有65536=64K個(gè)I/O端口。 由A0~A15譯碼形成。端口號(hào):端口號(hào)(即外設(shè)端口地址)為

0000H~FFFFH。直接尋址方式:外設(shè)端口地址(端口號(hào))直接用8位立即數(shù)給出,尋址范圍00H~FFH(0~255)間接尋址方式:當(dāng)端口地址(端口號(hào))>255(FFH)時(shí),只能使用間接尋址方式。必須先把端口號(hào)放到DX寄存器中,通過DX尋址。格式:INacc,port;(acc)

(port)具體形式有四種:

INAL,data8;端口地址8位,輸入一個(gè)字節(jié)

INAX,data8;端口地址8位,輸入一個(gè)字

INAL,DX ;端口地址16位,輸入一個(gè)字節(jié)

INAX,DX ;端口地址16位,輸入一個(gè)字必須通過累加器AX(字)或AL(節(jié))輸入數(shù)據(jù)。In輸入指令(外設(shè)→CPU,CPU讀取外設(shè)數(shù)據(jù))格式:OUTport,acc ;(port)

(acc)具體形式有四種:

OUTdata8,AL;端口地址8位,輸出一個(gè)字節(jié)

OUTdata8,AX;端口地址8位,輸出一個(gè)字

OUTDX,AL;端口地址16位,輸出一個(gè)字節(jié)

OUTDX,AX;端口地址16位,輸出一個(gè)字必須通過累加器AX(字)或AL(字節(jié))輸出數(shù)據(jù)。Out輸出指令(CPU→外設(shè),CPU向外設(shè)寫數(shù)據(jù))例1:實(shí)現(xiàn)端口(28H)→(DATA_WORD)

INAX,28H MOVDATA_WORD,AX例2:從端口3FCH送一個(gè)字到AX寄存器

MOVDX,3FCH INAX,DX;(AL)←(3FCH), (AH)←(3FDH)

例3:實(shí)現(xiàn)將(AL)→端口(05H) OUT5,AL;(05H)←(AL)三、

目的地址傳送指令8086/8088提供三條專用傳輸?shù)刂反a指令,傳送操作數(shù)的段地址和偏移地址。其中:源操作數(shù):為內(nèi)存單元目的操作數(shù):寄存器(通用,專用)1、LEA(LoadEffectiveAddress)2、LDS(LoadpointerusingDS)3、LES(LoadpointerusingES)格式:LEAreg16,mem16;EA(reg16)功能:取有效地址(偏移地址),用于寫進(jìn)地址指針。把指令中指定的存儲(chǔ)器操作數(shù)有效地址裝入指定的寄存器。例:設(shè)(BX)=0400H,(SI)=003CH LEABX,[BX+SI+0F62H]執(zhí)行指令后:

EA=(BX)+(SI)+0F62H=0400H+003CH+0F62H=139EH(BX)=139EH1.LEA注意:設(shè)

(DS)=3000H BUFFER=1000H (31000H)=0040H(1)LEA指令與MOV的區(qū)別

LEABX,BUFFER

;(BX)=1000H MOVBX,BUFFER

;(BX)=0040HLEA指令與MOV等價(jià)

LEABX,BUFFER;(BX)=1000HMOVBX,OFFSETBUFFER

;(BX)=1000H(2)LEA

指令中的目標(biāo)寄存器必須是16位的通用寄存器,源操作數(shù)必須是一個(gè)存儲(chǔ)器(內(nèi)存)。(3)請思考下列指令的正、誤

LEADX,[BX][SI] LEADX,AX格式:LDSreg16,mem32;(reg16)←(EA) (DS)←((EA)+2))功能:將指令指定32位(4B)地址指針?biāo)椭噶钪付拇嫫骱虳S(取段地址和偏移地址)。將指令指定mem32單元的前兩個(gè)單元內(nèi)容(16位偏移量)裝入指定通用寄存器,把后兩個(gè)單元內(nèi)容(段地址)裝入到DS段寄存器。用于寫遠(yuǎn)地址指針。2.LDS例:假設(shè):

(DS)=0C000H指令: LDSSI,[0010H]執(zhí)行指令后:(SI)=0180H(DS)=2000H

格式:LESreg16,mem32;(reg16)←(EA) ;(ES)←((EA)+2))功能:與LDS類似。將指令指定mem32單元的前兩個(gè)單元內(nèi)容(16位偏移量)裝入指定通用寄存器,把后兩個(gè)單元內(nèi)容(段地址)裝入到ES段寄存器。用于寫遠(yuǎn)地址指針。3.LES例:假設(shè):

(DS)=B000H (BX)=080AH指令: LESDI,[BX]執(zhí)行指令后: (DI)=05A2H (ES)=4000H綜合舉例:設(shè):

(DS)=5000HTABLE=1000H分析下列指令執(zhí)行結(jié)果:

(1)MOVBX,TABLE(2)MOVBX,OFFSETTABLE(3)LEABX,TABLE(4)LESBX,TABLE(5)LDSBX,TABLE采用了隱含寄存器(AH、Flags)操作數(shù)方式。8086有四條標(biāo)志傳送操作指令:1. LAHF2. SAHF3. PUSHF4. POPF

四、

標(biāo)志傳送指令格式:LAHF;(AH)←(PSW的低字節(jié))功能:標(biāo)志寄存器低八位

(AH)。LAHF指令操作圖示意1.LAHF2. SAHF

格式:SAHF;(PSW的低字節(jié))←(AH) 功能:(AH)送標(biāo)志寄存器低八位。3. PUSHF

格式:PUSHF ;(SP)←(SP)-2

((SP)+1,(SP))←(PSW) 功能:標(biāo)志進(jìn)棧。4. POPF

格式:POPF;(PSW)←((SP)+1,(SP)) (SP)←(SP)+2

功能:標(biāo)志出棧。注意:(1)標(biāo)志位的影響LAHF、PUSHF不影響標(biāo)志位,SAHF、POPF由裝入的值確定標(biāo)志位的值,即影響標(biāo)志位。(2)PUSHF、POPF用于保護(hù)調(diào)用過程前(PSW),過程返回后恢復(fù)。例:

PUSHAX PUSHCX PUSHF CALLTRANS

POPFPOPCXPOPAX…內(nèi)容:

8086/8088提供加、減、乘、除、轉(zhuǎn)換五種基本算術(shù)操作;

利用十進(jìn)制調(diào)整指令和ASCII調(diào)整指令對BCD碼表示的十進(jìn)制數(shù)進(jìn)行算術(shù)運(yùn)算;

對帶符號(hào)數(shù)與無符號(hào)數(shù)進(jìn)行乘、除運(yùn)算。(一)加法指令(Arithmetic)(二)減法指令(Subtraction)(三)乘法指令(Multiplication)(四)除法指令(Division)(五)轉(zhuǎn)換指令4.3算術(shù)運(yùn)算指令特點(diǎn):

大部分都影響標(biāo)志位,不同指令影響不同:(1)加、減法指令影響SF,ZF,AF,PF,CF,OF;(2)加1和減1指令不影響CF;(3)乘法指令影響CF,OF;(4)除法指令使大部分標(biāo)志位的狀態(tài)不確定;(5)對BCD碼調(diào)整指令對標(biāo)志位的影響不同;(6)轉(zhuǎn)換指令對標(biāo)志位無影響

都可以用于字節(jié)、字的運(yùn)算;

雙操作數(shù)指令除源為立即數(shù)外,其余必須有一個(gè)操作數(shù) 為寄存器;單操作數(shù)指令不能為立即數(shù)。

一、

加法指令8086具有3種加法操作指令:1.ADD(Addition)加法指令2.ADC(Addwithcarry)帶進(jìn)位加法指令3.INC(Incrementby1)加1指令1.ADD加法指令指令格式:ADDdest,src;(dest)←(dest)+(src)Src:立即數(shù),寄存器,存儲(chǔ)器Dest:寄存器,存儲(chǔ)器e.g.ADDCL,10;寄存器+立即數(shù)ADDDX,SI;寄存器+寄存器ADDAX,MEM;寄存器+存儲(chǔ)器ADDDATA[BX],AL;存儲(chǔ)器+寄存器ADDBYTEPTRALPHA[DI],30H;存儲(chǔ)器+立即數(shù)特點(diǎn):

可以進(jìn)行8位、16位的無符號(hào)數(shù)和帶符號(hào)數(shù)的加法運(yùn)算;源操作數(shù)和目標(biāo)操作數(shù)不能同時(shí)為存儲(chǔ)器,不能為段寄存器;

指令影響標(biāo)志位的情況:OF=1, 8位帶符號(hào)數(shù)相加,和超出范圍(-128~+127),16位帶符號(hào)數(shù)相加,和超出范圍(-32768~+32767);CF=1,8位無符號(hào)數(shù)相加,和超過255,

16位無符號(hào)數(shù)相加,和超過65535。其他條件標(biāo)志(SF,AF,PF,ZF)根據(jù)定義設(shè)定。e.g. MOVAL,7EH ;(AL)=7EH MOVBL,5BH ;(BL)=5BH ADDAL,BL ;(AL)=7EH+5BH=D9H影響標(biāo)志位的情況: SF=1 ,結(jié)果最高位=1ZF=0 ,結(jié)果不等于0AF=1 ,D3位向D4有進(jìn)位PF=0 ,”1”的個(gè)數(shù)為奇數(shù)CF=0 ,無進(jìn)位OF=1 ,和超過+127(兩個(gè)正數(shù)相加,結(jié)果為負(fù);反之亦是)格式:ADCdest,src

;(dest)←(dest)+(src)+CF

CF:

進(jìn)位標(biāo)志CF的現(xiàn)行值(上條指令CF值)特點(diǎn):與ADD同。用途:主要用于多字節(jié)運(yùn)算中。類型舉例:

ADCCX,300 ;寄存器+立即數(shù)+CF ADCAL,BL ;寄存器+寄存器+CF ADCDX,COUNT[SI] ;寄存器+存儲(chǔ)器+CF ADCBLOCK[DI],BX ;存儲(chǔ)器+寄存器+CFADCBYTEPTRMEM,6 ;存儲(chǔ)器+立即數(shù)+CF2.ADC帶進(jìn)位加法指令【例】設(shè)DX=4652H,執(zhí)行指令A(yù)DDDX,7A08H后,DX=?,CF=?,SF=?,ZF=?,OF=?根據(jù)計(jì)算:DX=C05AH,結(jié)果不為0,ZF=0;運(yùn)算結(jié)果沒有進(jìn)位,CF=0;運(yùn)算結(jié)果的最高位為1,SF=1;加數(shù)、被加數(shù)均為正數(shù),而結(jié)果為負(fù)數(shù),產(chǎn)生溢出,OF=1。格式:INCdest

;(B/W),(dest)←(dest)+1

dest:寄存器、存儲(chǔ)器。不能是段寄存器。功能:對指定的目標(biāo)操作數(shù)+1

操作數(shù)單元。用途:用于在循環(huán)程序中修改地址指針和循環(huán)次數(shù)。標(biāo)志位影響情況:影響SF,ZF,AF,PF,OF。

不影響CF。3.INC加1指令例:

INCDL ;8位寄存器+1

INCSI

;16位寄存器+1

INCBYTEPTR[BX][SI]

;存儲(chǔ)器+1(字節(jié)操作)

INCWORDPTR[DI]

;存儲(chǔ)器+1(字操作)

INCDS ;錯(cuò)操作數(shù)類型:可以是寄存器,存儲(chǔ)器。不能是段寄存器。

8086有5條減法指令:1、SUB(Subtraction)減法指令2、SBB(Subtractionwithborrow)帶進(jìn)位減法指令3、DEC(Decrementby1)減1指令4、NEG(Negate)求補(bǔ)指令5、CMP(Compare)比較指令二、

減法指令(Subtraction)指令格式::SUBdest,src;(dest)←(dest)-(src)

Src:立即數(shù),寄存器,存儲(chǔ)器。

Dest:寄存器,存儲(chǔ)器。例: SUBAL,37H ;寄存器-立即數(shù)SUBBX,DX ;寄存器-寄存器SUBCX,VAR1 ;寄存器-存儲(chǔ)器 SUBARRAY[SI],AX ;存儲(chǔ)器-寄存器SUBWORDPTRALPHA[BX][DI],512H;存儲(chǔ)器減立即數(shù)1.SUB減法指令例: SBBBX,100H ;寄存器-立即數(shù)-CFSBBCX,DX ;寄存器-寄存器-CFSBBAL,DATA1[SI] ;寄存器-存儲(chǔ)器-CFSBBDISP[BP],BL ;存儲(chǔ)器-寄存器-CFSBBBYTEPTRALPHA[SI+6],96H;存儲(chǔ)器-立即數(shù)-CF指令格式:SBBdest,src;(dest)←(dest)-(src)-CF

CF:進(jìn)位標(biāo)志CF的現(xiàn)行值(上條指令CF值)

Src:立即數(shù),寄存器,存儲(chǔ)器。

dest:寄存器,存儲(chǔ)器。指令影響標(biāo)志位、B/W數(shù)運(yùn)算情況同SBB用途:用于多字節(jié)數(shù)相減2.SBB帶借位減法指令指令格式:

DECdest;(B/W) (dest)←(dest)-1

dest:寄存器、存儲(chǔ)器。不能是段寄存器。功能:對指定的目標(biāo)操作數(shù)-1

操作數(shù)單元。用途:用于在循環(huán)程序中修改地址指針和循環(huán)次數(shù)。標(biāo)志位影響情況:影響SF,ZF,AF,PF,OF。

不影響CF。3.DEC減1指令指令格式:

NEGdest;B/W,(dest)←0-(dest)

dest:寄存器 、存儲(chǔ)器。操作:把操作數(shù)按位求反后末位+1。(dest)←0FFFFH-(dest)+1影響標(biāo)志:AF、CF、OF、PF、SF、ZF。CF: 操作數(shù)為0時(shí)求補(bǔ),CF=0;一般使CF=1.OF:對-128或-32768求補(bǔ),OF=1;否則OF=0.4.NEG(Negate)求補(bǔ)指令MOVAX,0FF64H;(AH=0FFH,AL=64H)NEGAL;AX=0FF9CH(0-64H=9CH)SUBAL,9DH;AX=0FFFFH(9CH-9DH=0FFH)NEGAX;AX=0001H(0-0FFFFH=1H)DECAL;AX=0NEGAX;AX=0例1:

例2

設(shè)DL=78H,執(zhí)行指令NEGDL后,DL=?,CF=?,SF=?,ZF=?,OF=?分析:求補(bǔ)有兩種方法:一是將0減去源操作數(shù);二是將源操作數(shù)求反后再加1。執(zhí)行NEG指令后,OF=0。此外,計(jì)算機(jī)內(nèi)部采用第一種方法,所以CF=1。

運(yùn)行結(jié)果:DL=88H,CF=1,SF=1,ZF=0,OF=0。指令格式:

CMPdest,src

;B/W(dest)-(src)

結(jié)果不送,影響標(biāo)志位。src:立即數(shù),寄存器,存儲(chǔ)器。dest:寄存器,存儲(chǔ)器。影響標(biāo)志:AF、CF、OF、PF、SF、ZF。

CMPAL,0AH ;寄存器與立即數(shù)比較CMPCX,DI ;寄存器與寄存器比較CMPAX,AREA1 ;寄存器與存儲(chǔ)器比較CMP[BX+5],SI ;存儲(chǔ)器與寄存器比較CMPWORDPTRALPHAGAMMA,100H;存儲(chǔ)器與立即數(shù)比較5.CMP比較指令

用比較指令來比較兩個(gè)數(shù)之間的關(guān)系:

兩者是否相等,兩個(gè)數(shù)中哪個(gè)大。(1)根據(jù)ZF標(biāo)志,判斷兩者是否相等;(2) 根據(jù)CF標(biāo)志,判斷兩個(gè)無符號(hào)數(shù)的大??;(3) 用SF、OF標(biāo)志,判斷兩個(gè)帶符號(hào)數(shù)的大小。

(1)根據(jù)Z標(biāo)志,可判斷兩者是否相等例:CMPAX,BX

ZF=1,(AX)=(BX),兩者相等

ZF=0,(AX)=(BX),兩者不相等(2) 根據(jù)CF標(biāo)志,判斷兩個(gè)無符號(hào)數(shù)的大小例:比較AX,BX寄存器,將大數(shù)

(AX)

CMPAX,BX JNCNEXT;CF=0轉(zhuǎn)NEXT XCHGAX,BXNEXT:……CF=0,(AX)>(BX);CF=1,(AX)<(BX)CMP指令應(yīng)用舉例:帶符號(hào)數(shù)找最大值思路:

第一個(gè)數(shù)取出

(AX),

取出第二個(gè)數(shù)(第二個(gè)字單元內(nèi)容)與(AX)比較: (AX)>第二個(gè)數(shù),不做交換,否則,(第二個(gè)字單元內(nèi)容)

(AX)。再取第三個(gè)數(shù),

經(jīng)過99次比較,在(AX)中得到最大數(shù)。

若自BLOCK開始的內(nèi)存緩沖區(qū)中,有100個(gè)帶符號(hào)數(shù)。找出最大值。并存放到MAX單元中。指令助記符格式操作無符號(hào)數(shù)乘MULMUL

srcsrc為字節(jié):AX←AL×srcsrc為字:DXAX←AX×src符號(hào)數(shù)乘IMULIMUL

src無符號(hào)數(shù)除DIVDIV

srcsrc為字節(jié):AL←AX÷(src)的商,AH←AX÷(src)的余數(shù)src為字:AX←DXAX÷(src)的商,DX←DXAX÷(src)的余數(shù)符號(hào)數(shù)除IDIVIDIV

srcsrc可以為:reg,mem,不允許為立即數(shù)。三、

乘除指令(1)乘法指令MUL、IMUL8086/8088可實(shí)施字節(jié)與字節(jié)乘、字與字乘,指令中給出乘數(shù),被乘數(shù)隱含。乘數(shù)可以是寄存器或內(nèi)存操作數(shù),不能為立即數(shù)。

字節(jié)乘時(shí),被乘數(shù)隱含為寄存器AL,乘積的高8位存于寄存器AH中,低8位存于寄存器AL中。字乘時(shí),被乘數(shù)隱含為寄存器AX,乘積的高16位存于寄存器DX中,低16位存于寄存器AX中。

乘法指令僅影響標(biāo)志位OF,CF,對其它標(biāo)志位無定義。無符號(hào)數(shù)乘時(shí),當(dāng)積的高8位(字節(jié)乘)或積的高16位(字乘)為0,則OF=CF=0;如果不為0,則OF=CF=1。符號(hào)數(shù)乘時(shí),當(dāng)積的高8位(字節(jié)乘)或積的高16位(字乘)是低字節(jié)(字節(jié)乘)或低字(字乘)的符號(hào)擴(kuò)展時(shí),OF=CF=0;否則,OF=CF=1。

【例】64H×0A5H(1)無符號(hào)數(shù)乘,即100×165=16500DMOVAL,64H;AL=64H=100DMOVBL,0A5H;BL=0A5H=165DMULBL;AX=4074H=16500D,OF=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(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

提交評論