微型計算機原理與匯編語言-第4章-80x86指令系統(tǒng)_第1頁
微型計算機原理與匯編語言-第4章-80x86指令系統(tǒng)_第2頁
微型計算機原理與匯編語言-第4章-80x86指令系統(tǒng)_第3頁
微型計算機原理與匯編語言-第4章-80x86指令系統(tǒng)_第4頁
微型計算機原理與匯編語言-第4章-80x86指令系統(tǒng)_第5頁
已閱讀5頁,還剩86頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

教學(xué)內(nèi)容

本章重點介紹8086指令格式和尋址方式,包括操作數(shù)的尋址方式和轉(zhuǎn)移地址的尋址方式;然后介紹8086指令系統(tǒng),包括數(shù)據(jù)傳送、算術(shù)運算、位操作、串操作、控制轉(zhuǎn)移以及處理器控制等六大類指令。具體內(nèi)容如下:1、8086/8088指令格式2、8086/8088指令系統(tǒng)的尋址方式3、8086/8088指令系統(tǒng)第4章80x86指令系統(tǒng)學(xué)習(xí)要求

指令系統(tǒng)是程序員編寫程序的基礎(chǔ),因此很好地掌握本章內(nèi)容是后續(xù)進(jìn)一步學(xué)習(xí)匯編語言程序設(shè)計的關(guān)鍵。通過本章學(xué)習(xí),應(yīng)該達(dá)到如下要求:1、了解8086/8088指令格式。2、熟練掌握8086/8088的尋址方式。3、掌握8086/8088指令系統(tǒng)中的各種指令的名稱、功能及對操作數(shù)尋址方式的約定。第4章80x86指令系統(tǒng)4.18086/8088指令系統(tǒng)

4.1.18086/8088指令格式

4.1.28086/8088指令系統(tǒng)的尋址方式4.1.38086/8088指令系統(tǒng)

計算機是通過執(zhí)行指令序列來完成用戶的特定任務(wù)的,因此每種計算機都有一組指令集供用戶使用。這組指令集就稱為計算機的指令系統(tǒng)。指令系統(tǒng)中的每一條指令都對應(yīng)著微處理器要完成的一種規(guī)定的操作,這在設(shè)計微處理器時就事先規(guī)定好了,所以指令系統(tǒng)是表征一臺計算機性能的重要因素,它的格式與規(guī)模將直接影響到機器的硬件結(jié)構(gòu)。指令系統(tǒng)是程序員編寫程序的基礎(chǔ),因此很好地掌握指令系統(tǒng)的有關(guān)知識是后續(xù)進(jìn)一步學(xué)習(xí)的關(guān)鍵。4.18086/8088指令系統(tǒng)用匯編語言編寫的匯編語言程序輸入計算機后,必須由“匯編程序”將它翻譯成由機器指令(指令碼)組成的機器語言程序,才能由計算機識別并執(zhí)行。因此匯編語言程序需由匯編程序翻譯成可執(zhí)行的機器語言程序,一般來說,這一過程不必由人來干預(yù)。我們這里只介紹一下基本原理,以便在必要時也可以手工完成類似的工作。4.1.18086/8088指令格式一般來說指令是由兩部分組成,即操作碼和操作數(shù)。在指令中操作碼是不可缺少的,但操作數(shù)可以沒有,也可以有一個操作數(shù)或兩個操作數(shù)。操作碼操作數(shù)用來描述該指令的操作對象給出該指令應(yīng)完成何種操作根據(jù)操作數(shù)的個數(shù),指令格式可分為以下幾種:1.零操作數(shù)指令指令格式中沒有操作數(shù)或操作數(shù)是隱含約定的。2.一操作數(shù)指令指令格式中有一個操作數(shù),或還有一個隱含的操作數(shù)(實際上是雙操作數(shù))。3.二操作數(shù)指令指令中有兩個操作數(shù),其中一個為目的操作數(shù),另一個為源操作數(shù)。由此可見,操作數(shù)可分為源操作數(shù)和目的操作數(shù)。源操作數(shù):只能讀取的操作數(shù)。目的操作數(shù):即可讀取又可寫入(存放操作結(jié)果)的操作數(shù)。操作數(shù)又可分為兩大類:數(shù)據(jù)操作數(shù)和地址操作數(shù)。一條指令中的信息按其含義分成若干個信息段,每一信息段占一個字節(jié)或多個字節(jié),且按一定的順序排列,這便于CPU解釋執(zhí)行。以8086/8088指令編碼格式為例,它采用1~6個字節(jié)的變字長指令格式:其指令由1~6個字節(jié)組成,它包括操作碼(第一字節(jié))、尋址方式(第二字節(jié))和操作數(shù)(第三到第六字節(jié))三部分組成。opcodeopcodeMod字節(jié)opcodeMod字節(jié)opcodeMod字節(jié)opcodeMod字節(jié)opcodeMod字節(jié)Data/dispdisp(低)Data/disp(低)Data/disp(高)disp(高)disp(低)disp(高)DataData(低)Data(高)操作碼部分尋址方式部分操作數(shù)部分disp(低)/Data(低)disp(高)/Data(高)Data(低)Data(高)modregr/mWDOP765432100172目的操作數(shù)源操作數(shù)源操作數(shù)目的操作數(shù)D=1D=0000001010011100101110111ALCLDLBLAHCHDHBHAXCXDXBXSPBPSIDIregW=0W=1寄存器尋址BX+SI+disp8BX+DI+disp8BP+SI+disp8BP+DI+disp8SI+disp8DI+disp8BP+disp8BX+disp8BX+SI+disp16BX+DI+disp16BP+SI+disp16BP+DI+disp16SI+disp16DI+disp16BP+disp16BX+disp16BX+SIBX+DIBP+SIBP+DISIDI直接地址BX000001010011100101110111ALCLDLBLAHCHDHBHAXCXDXBXSPBPSIDIW=0W=1寄存器尋址mod=11modr/m存儲器地址有效地址的計算公式mod=00mod=01mod=10雙操作數(shù)指令中各字段定義例4.1寫出下面指令的機器語言編碼。

MOV[BX+DI-6H],CL指令碼為:88H、49H、FAHOPCODEDWmodr/mregdisp81000100100100100例4.2寫出下面指令的機器語言編碼。

ADDAX,[BX+DI+0826H]000000DWmodr/mregDisp-L000000

1110001000Disp-H03H81H26H08H4.1.28086/8088指令系統(tǒng)的尋址方式所謂尋址方式就是尋找操作數(shù)存放地址(位置)的方法。在8086/8088系統(tǒng)中操作數(shù)存放的位置有以下4種:⑴操作數(shù)包含在指令字節(jié)中。即指令格式中操作數(shù)部分就是操作數(shù)本身。這種操作數(shù)叫立即數(shù)操作數(shù)。⑵操作數(shù)存放在CPU的某個內(nèi)部寄存器中。這種操作數(shù)叫寄存器操作數(shù)。⑶操作數(shù)在內(nèi)存的數(shù)據(jù)區(qū)中。這種操作數(shù)叫存儲器操作數(shù)。⑷操作數(shù)來自或送到I/O端口。這種操作數(shù)叫I/O操作數(shù)。

在8086/8088系統(tǒng)中,操作數(shù)又可分為兩大類:數(shù)據(jù)操作數(shù)和地址操作數(shù)。因此,尋址方式也分為數(shù)據(jù)尋址方式和地址尋址方式兩大類。數(shù)據(jù)的尋址方式1)立即數(shù)尋址方式例如:MOVAL,80HMOVAX,1234HAL操作碼字節(jié)80H程序存儲器指令碼操作碼字節(jié)12H程序存儲器AL指令碼AH34H12H34H80H80H12H34HMOVAL,80HMOVAX,1234H56782)寄存器尋址方式例如:INCBX MOVAX,CX89C1程序存儲器AXCX56785678指令碼(包括操作數(shù))3)存儲器尋址方式存儲器尋址方式的操作數(shù)存放在存儲器單元中。因此,要存取操作數(shù)就必須知道其存儲器的單元地址。在指令中可以直接給出或間接給出操作數(shù)的地址,以達(dá)到存取操作數(shù)的目的。指令中給出的地址只是操作數(shù)的有效地址(EA),并且是放在方括號(“[]”)中。若要從存儲器中存取操作數(shù)還須得到實際的地址(物理地址)。物理地址=段地址左移四位+有效地址物理地址=CSDSSSES×10H+EA有效地址可以由以下三種地址分量組成:●位移量:它是存放在指令中的一個8位或16位的數(shù)?!窕罚核谴娣旁诨芳拇嫫鰾X或BP中的內(nèi)容。●變址:它是存放在變址寄存器SI或DI中的內(nèi)容。對于某條具體指令,這三個地址分量可有不同的組合。正是因為這三種地址分量有不同的組合,才使得對存儲器操作數(shù)的尋址產(chǎn)生了若干種不同的方式。⑴直接尋址方式

MOVAL,[1064]21064HDS:20000H20000H21064HAL操作碼641045…代碼段數(shù)據(jù)段4545+1064HEA=16位disp5040……MAX⑵寄存器間接尋址

MOVAX,[SI] MOV[BX],AL30000HDS:30000HSI:2000H+32000H32000H40505040……64HMAL30000HDS:30000HBX:1000H+31000H31000H64H64HMOVAX,[SI]MOV[BX],ALEA=(BX)(DI)(SI)⑶寄存器相對尋址 MOVCL,[BX+1064H]22064H22064H641045…代碼段數(shù)據(jù)段操作碼…CL4545+1064H21000HBX:1000HDS:20000H20000HEA=(BX)(BP)(DI)(SI)+8位disp16位disp⑷基址加變址尋址方式

MOVAH,[BP][SI]56H……MAH40000HSS:40000HBP:2000H+43200H43200HSI:1200H56H56HEA=(BX)(BP)+(DI)(SI)⑸基址加變址相對尋址 MOV[BX+DI+1234H],AHEA=(BX)(BP)+(DI)(SI)+8位disp16位disp3412…代碼段數(shù)據(jù)段操作碼…45AH40000HDS:40000HBX:0200H+DI:0010H1234H454541444H41444H存儲器尋址方式小結(jié)偏移地址隱含的允許超越的操作數(shù)(有效地址)段寄存器段寄存器3.寄存器[SI/DI/BX+disp](SI)/(DI)/(BX)+dispDSCSESSS相對尋址2.寄存器[BX]/[SI]/[DI]寄存器值DSCSESSS間接尋址1.直接尋址[disp]dispDSCSESSS4.基址變址[BX+SI/DI](BX)+(SI)/(DI)DSCSESSS尋址[BP+SI/DI](BP)+(SI)/(DI)

SSCSESDS5.基址-變址[BX+SI/DI+disp](BX)+(SI)/(DI)+dispDSCSESSS相對尋址[BP+SI/DI+disp](BP)+(SI)/(DI)+dispSSCSESDS五.舉例例:設(shè)當(dāng)前有關(guān)寄存器的內(nèi)容為:(BX)=6000H,(BP)=4000H,(SI)=2000H,(DS)=3000H,(ES)=3500H,(SS)=5000H,試確定下列指令中存儲器方式的操作數(shù)在內(nèi)存中的邏輯地址和物理地址。邏輯地址物理地址3000:052030520H直接尋址MOVAX,[BX]MOVAX,[0520H]MOVAX,ES:[BX+SI+0050H]MOVAX,[BP+6060H]寄存器間接尋址3000:600036000H寄存器相對尋址寄存器相對尋址MOVAX,[SI+1000H]3000:300033000H5000:A0605A060H3500:80503D050H基址-變址相對尋址4)I/O端口尋址方式⑴直接端口尋址方式

INAL,21H21HAL操作碼21H代碼段80……01H02HI/O接口8080⑵間接端口尋址方式

OUTDX,AL……0001H0002HI/O接口80AL1234DX1234H80802.地址的尋址方式地址的尋址方式其實是程序轉(zhuǎn)移地址的尋址方式,也就是找出程序轉(zhuǎn)移的目的地址。轉(zhuǎn)移地址可以在段內(nèi)(稱段內(nèi)轉(zhuǎn)移),也可以跨段(稱段間轉(zhuǎn)移)。尋求轉(zhuǎn)移地址的方法有以下四種:1)段內(nèi)直接尋址轉(zhuǎn)移的地址是當(dāng)前IP內(nèi)容和指令規(guī)定的8位或16位位移量之和。當(dāng)位移量是8位時,稱為短程轉(zhuǎn)移;位移量是16位時稱為近程轉(zhuǎn)移。這種尋址方式適用于條件轉(zhuǎn)移或無條件轉(zhuǎn)移類指令。但條件轉(zhuǎn)移只有8位位移量的短程轉(zhuǎn)移。+IPEA有效轉(zhuǎn)移地址opcode位移量PM(CS)×10H+EA位移量2)段內(nèi)間接尋址方式程序轉(zhuǎn)移的地址存放在寄存器或存儲器單元中。指令執(zhí)行時,用寄存器或存儲器單元的內(nèi)容來更新IP的內(nèi)容。DMIP寄存器IP3)段間直接尋址方式這種尋址方式是指令碼中直接給出16位的段地址和16位的偏移地址用來更新當(dāng)前的CS和IP內(nèi)容。opcodePM偏移量段地址CSIP4)段間間接尋址方式這種尋址方式是由指令碼的尋址方式字節(jié)求出存放轉(zhuǎn)移地址的連續(xù)兩個字的地址。其低位字地址單元中存放的是偏移地址,高位字地址單元中存放的是轉(zhuǎn)移段地址。DMCSIP段地址偏移量4.1.38086/8088指令系統(tǒng)8086/8088CPU指令系統(tǒng)包含有133條基本指令。按其功能可以分為6類,它們是:⑴數(shù)據(jù)傳送類指令⑵算術(shù)運算類指令⑶位操作類指令⑷串操作類指令⑸程序控制類指令⑹處理器控制類指令。一、數(shù)據(jù)傳送類指令數(shù)據(jù)傳送類指令是將數(shù)據(jù)、地址或立即數(shù)傳送到寄存器或存儲器單元中。它又可分為通用數(shù)據(jù)傳送指令、累加器專用指令、目的地址傳送指令和標(biāo)志傳送指令等四組。(一)通用數(shù)據(jù)傳送指令1.最基本的傳送指令指令格式及操作:

MOVdst,src ;(dst)←(src)dst是目的操作數(shù),它可以是存儲器、寄存器(不能為IP)和段寄存器(不能為CS)。Src是源操作數(shù),它可以是存儲器、寄存器、段寄存器和立即數(shù)。需說明一點,對于代碼段寄存器CS和指令指針寄存器IP,通常無需用戶利用傳送指令改變其中的內(nèi)容。但是CS可以作為源操作數(shù)。16位通用寄存器AXBXCXDXBPSPSIDIALBLCLDLAHBHCHDH段寄存器CSDSSSES存儲器立即數(shù)16位8\16位8\16位8\16位MOV指令數(shù)據(jù)傳送方向2.堆棧操作指令堆棧操作指令是用來完成壓入和彈出堆棧操作的。8086/8088指令系統(tǒng)中提供了完成這兩種操作的相應(yīng)指令。⑴壓入堆棧指令指令格式及操作:

PUSHsrc;(SP)←(SP)-2,((SP)+1:(SP))←(src)src源操作數(shù)可以是寄存器操作數(shù)和存儲器操作數(shù),且必須是16位的操作數(shù),但不能是立即數(shù)。⑵彈出堆棧指令指令格式及操作:

POPdst;(dst)←((SP)+1:(SP)),(SP)←(SP)+2dst目的操作數(shù)可以是寄存器操作數(shù)和存儲器操作數(shù),且必須是16位的操作數(shù),但不能是立即數(shù)。3.數(shù)據(jù)交換指令指令格式及操作:XCHGopr1,opr2;(opr1)←→(opr2)

(二)累加器專用指令這類指令中的一個操作數(shù)必須是累加器。累加器操作數(shù)可以是8位的,也可以是16位的。1.輸入/輸出指令輸入輸出指令可以分為兩大類:一類是直接端口地址的輸入/輸出指令:一類是通過DX寄存器間接端口地址的輸入/輸出指令。⑴輸入指令①直接尋址的輸入指令指令格式及操作:

INacc,port;(acc)←(port)②間接尋址的輸入指令指令格式及操作:

INacc,DX;(acc)←((DX))⑵輸出指令①直接尋址的輸出指令指令格式及操作:

OUTport,acc;(port)←(acc)②間接尋址的輸出指令指令格式及操作:

OUTDX,acc;((DX))←(acc)2.字節(jié)轉(zhuǎn)換指令指令格式及操作:XLATsrc_table;(AL)←((BX)+(AL))XLAT指令是用來將一種字節(jié)代碼轉(zhuǎn)換成另一種字節(jié)代碼。即將BX的內(nèi)容(代碼表格首址src_table)和AL的內(nèi)容(表格偏移量)相加作為有效地址。并從中讀出此內(nèi)存表格地址單元的內(nèi)容傳送到AL累加器中。XLAT指令還可以有以下幾種表示形式:

XLAT;不寫操作數(shù)

XLATB;有B就不允許再寫操作數(shù)。

XLATES:src_table;重設(shè)段寄存器為ES[例]在內(nèi)存的數(shù)據(jù)段有一張16進(jìn)制數(shù)的ASCII碼表,其首地址為Hex_table,如下圖所示,為欲將十六進(jìn)制數(shù)0AH轉(zhuǎn)換成ASCII碼,則可用以下幾條指令實現(xiàn):MOVBX,OFFSETHex_tale ;(BX)←表首址MOVAL,0AH ;(AL)←十六進(jìn)制數(shù)AXLATHex_table ;查表轉(zhuǎn)換61000H61001H61002H6100AH6100BH6100FH60000HDS:60000HBX:1000HAX:000AH+6100AHHex_tableHex_table+1Hex_table+2Hex_table+AHex_table+BHex_table+FASCII表31H32H41H42H30H46H………0AHALEA6100AH41H41HASCII表Hex_table=1000H(三)地址傳送指令1.取有效地址指令指令格式:

LEAreg16,mem此指令的功能是將存放源操作數(shù)的16位偏移地址(即有效地址EA)送到一個16位的通用寄存器中。即源操作數(shù)必須是一個存儲器操作數(shù),目的操作數(shù)必須是一個寄存器操作數(shù)。例如:LEABX,bufferLEAAX,[BP][DI]LEADX,bety[BX][SI]注意LEA指令和MOV指令的異同,比較下面兩組指令:2.地址指針裝入DS指令指令格式:

LDSreg16,mem32此指令的功能是將源操作數(shù)所對應(yīng)的雙字長的內(nèi)存單元中的高字內(nèi)容(一般為16位段基址)送入DS,低字內(nèi)容(一般為偏移地址)送入指令所指定的寄存器中。例如: LDSDI,[2130H]34H12H00H40H2130H2132HDMDIDS1234H4000H不同:

LEABX,buffer ;將存儲器buffer的偏 移地址送到BX

MOVBX,buffer ;將存儲器buffer的內(nèi) 容傳送到BX相同:

LEABX,buffer

MOVBX,OFFSETbuffer以上兩條指令都是將存儲器buffer的偏移地址送到BX。其中OFFSETbuffer表示存儲器偏移地址。

3.地址指針裝入ES指令指令格式:

LDSreg16,mem32此指令的功能是將源操作數(shù)所對應(yīng)的雙字長的內(nèi)存單元中的高字內(nèi)容(一般為16位段基址)送入ES,低字內(nèi)容(一般為偏移地址)送入指令所指定的寄存器中。例如: LESDI,[2130H]34H12H00H40H2130H2132HDMDIES1234H4000H(四)標(biāo)志傳送指令1.取標(biāo)志指令指令格式:LAHF2.置標(biāo)志指令指令格式:SAHFOFDFIFTFSFZFAFPFCFFLAGAHLAHF和SAHF指令操作示意圖3.標(biāo)志壓入堆棧指令指令格式及操作:

PUSHF ;(SP)←(SP)-2, ((SP)+1;(SP))←(FLAG)4.標(biāo)志彈出堆棧指令指令格式及操作:

POPF ;(FLAG)←((SP)+1;(SP)), (SP)←(SP)+2二、算術(shù)運算指令8086/8088有豐富的算術(shù)運算指令,而且可以處理4種類型的數(shù)據(jù),如下表所示:數(shù)據(jù)類型數(shù)據(jù)范圍運算可作累加器使用的寄存器或存儲器二進(jìn)制8位無符號0~255加減所有的通用寄存器或存儲器乘除AX寄存器16位無符號0~65535加減所有的通用寄存器或存儲器乘除AX、DX寄存器8位帶符號-128~+127加減所有的通用寄存器或存儲器乘除AX寄存器16位帶符號-32768~+32767加減所有的通用寄存器或存儲器乘除AX、DX寄存器十進(jìn)制壓縮(組合式)0~99加減AX寄存器非壓縮(分離式)0~9加減AX寄存器乘除AX寄存器1.加法指令在微處理器中,沒有專用的BCD碼運算指令,使用二進(jìn)制運算指令進(jìn)行BCD碼數(shù)的運算,然后用BCD碼運算調(diào)整指令進(jìn)行調(diào)整,重新得到BCD碼的結(jié)果。指令格式操作功能標(biāo)志位影響OSZAPCADDdst,src(dst)←(dst)+(src)○○○○○○ADCdst,src(dst)←(dst)+(src)+(CF)○○○○○○INCdst(dst)←(dst)+1○○○○○△AAAASCII碼調(diào)整指令×××○×1DAABCD調(diào)整指令×○○○○○[例題]計算兩個多字節(jié)十六進(jìn)制數(shù)之和:374AC60F8H+20D59E36C1H=?存儲器…DATA1F8H

被加數(shù)60HACH74H3BH…DATA2C1H

加數(shù)36H9EHD5H20H…開始結(jié)束初始化:置循環(huán)次數(shù)清SI,清進(jìn)位標(biāo)志CF取一個字節(jié)加數(shù)SI加1與一個被加數(shù)相加并送回內(nèi)存區(qū)循環(huán)次數(shù)減1循環(huán)完否NY

MOVCX,5 ;設(shè)置循環(huán)次數(shù)MOVSI,0 ;置位移量初值CLC ;清進(jìn)位CFLOOPER:MOVAL,DATA2[SI] ;取一個加數(shù)ADCDATA1[SI],AL ;和一個被加數(shù)相加INCSI ;位移量加1DECCX ;循環(huán)次數(shù)減1JNZLOOPER ;加完否HLT ;程序暫停AAA指令的操作為: 如果 (AL)∧0FH>9或(AF)=1 則 (AL)←(AL)+06H (AH)←(AH)+1 (AF)←1 (CF)←(AF) (AL)←((AL)∧0FH) 否則 (AL)←((AL)∧0FH)DAA指令的操作為: 如果 (AL)∧0FH>9,(AF)=1 (AF)←1 如果 (AL)>9FH或(CF)=1 則 (AL)←(AL)+60H (CF)←1 [例題]計算4609+3875=?存儲器…STRING139H被加數(shù)30H36H34H…STRING235H加數(shù)37H38H33H…存結(jié)果SUM…開始結(jié)束初始化:置被加數(shù)、加數(shù)、結(jié)果的首地址,置循環(huán)次數(shù),清進(jìn)位標(biāo)志CF取一個字節(jié)加數(shù)地址指針加1與一個被加數(shù)相加循環(huán)次數(shù)減1循環(huán)完否NY送存AAA調(diào)整 LEASI,STRING1 ;(SI)←被加數(shù)首地址 LEABX,STRING2 ;(BX)←加數(shù)首地址 LEADI,SUM ;(DI)←結(jié)果首地址MOVCX,4 ;CLC ;NEXT:MOVAL,[SI] ; ADCAL,[BX] ; AAA ;ASCII調(diào)整 MOV[DI],AL ; INCSI ; INCBX ; INCDI ; DECCX ; JNZNEXT ; HLT ;[例題]要求計算兩個至今指數(shù)之和,7+8=?。可用以下指令實現(xiàn):MOVAX,0007H ;(AL)=07H,(AH)=00HMOVBL,08H ;(BL)=08HADDAL,BL ;(AL)=0FHAAA ;(AL)=05H,(AH)=01H ;(CF)=(AF)=1MOVAX,0007H ;(AL)=07H,(AH)=00HMOVBL,08H ;(BL)=08HADDAL,BL ;(AL)=0FHDAA ;(AL)=15H,(AH)=00H ;(CF)=0,(AF)=12.減法指令指令格式操作功能標(biāo)志位影響OSZAPCSUBdst,src(dst)←(dst)-(src)○○○○○○SBBdst,src(dst)←(dst)-(src)-(CF)○○○○○○DECdst(dst)←(dst)-1○○○○○△NEGdst(dst)←0-(dst)○○○○○1CMPdst,src(dst)-(src)○○○○○○AASASCII碼調(diào)整指令×××○×○DASBCD調(diào)整指令×○○○○○[例題]在數(shù)據(jù)段從MYDATA開始的存儲單元中分別存放了兩個8位無符號數(shù),試比較它們的大小,并將大者傳送到MAX單元。程序如下: LEABX,MYDATA;MYDATA偏移地址送BX MOVAL,[BX];第一個無符號數(shù)送AL INCBX;BX指向第二個無符號數(shù) CMPAL,[BX];兩個數(shù)比較 JNCDONE;如CF=0,則轉(zhuǎn)DONE MOVAL,[BX];否則,第二個無符號數(shù)送ALDONE:MOVMAX,AL;較大的無符號數(shù)送MAX單元 HLT;停止AAS指令的操作為: 如果 (AL)∧0FH>9或(AF)=1 則 (AL)←(AL)-06H (AH)←(AH)-1 (AF)←1 (CF)←(AF) (AL)←((AL)∧0FH) 否則 (AL)←((AL)∧0FH)DAS指令的操作為: 如果 (AL)∧0FH>9,(AF)=1 則 (AL)←(AL)-06H (AF)←1 如果 (AL)>9FH或(CF)=1 則 (AL)←(AL)-60H (CF)←13.乘法指令指令格式操作功能標(biāo)志位影響OSZAPCMULsrc(AX)←(src)×(AL)(DX:AX)←(src)×(AX)○××××○IMULsrc(AX)←(src)×(AL)(DX:AX)←(src)×(AX)○××××○AAMBCD調(diào)整指令×○○×○×AL源操作數(shù)AL×AHAX源操作數(shù)AXDX×

如果運算結(jié)果的高半部分(在AH或DX中)為零,則狀態(tài)標(biāo)志位(CF)=(OF)=0,否則(CF)=(OF)=1。因此,狀態(tài)標(biāo)志位(CF)=(OF)=1,表示AH或DX中包含著乘積的有效數(shù)字。例如: MOVAL,14H ;(AL)=14H MOVCL,05H;(CL)=05H MULCL ;(AX)=0064H,;(CF)=(OF)=0

本例中結(jié)果的高半部分(AH)=0,因此,狀態(tài)標(biāo)志位(CF)=(OF)=0。如果乘積的高半部分僅僅是低半部分符號位的擴展,則狀態(tài)標(biāo)志位(CF)=(OF)=0;否則,高半部分包含乘積的有效數(shù)字而不只是符號的擴展,則(CF)=(OF)=1。例如:MOVAX,04E8H ;(AX)=04E8HMOV?BX,4E20H ;(BX)=4E20HIMULBX;(DX:AX)=(AX)

(BX)

以上指令的執(zhí)行結(jié)果為:(DX)=017FH,(AX)=4D00H,且(CF)=(OF)=1。由于此時DX中結(jié)果的高半部分包含著乘積的有效數(shù)字,故狀態(tài)標(biāo)志位(CF)=(OF)=1。實際上以上指令完成帶符號數(shù)+1256和+20000的乘法運算,得到乘積為+25120000。所謂乘積的高半部分僅僅是低半部分符號位的擴展,是指當(dāng)乘積為正值時,其符號位為零,則AH或DX的高半部分為8位全零或16位全零;當(dāng)乘積是負(fù)值時,其符號位為1,則AH或DX的高半部分為8位全1或16位全1。例如,(AL)=C5H=11000101B則(AX)=FFC5H=1111111111000101B即(AH)=11111111B,(AL)=11000101B4.除法指令指令格式操作功能標(biāo)志位影響OSZAPCDIVsrc(AL)←(AX)/(src)的商(AH)←(AX)/(src)的余數(shù)(AX)←(DX:AX)/(src)的商(DX)←(DX:AX)/(src)的余數(shù)××××××IDIVsrc(AL)←(AX)/(src)的商(AH)←(AX)/(src)的余數(shù)(AX)←(DX:AX)/(src)的商(DX)←(DX:AX)/(src)的余數(shù)××××××AADBCD調(diào)整指令×○○△○×CBW若(AL)<80H,則(AH)←00H,否則(AH)←FFH△△△△△△CWD若(AX)<8000H,則(DX)←0000H,否則(DX)←FFFFH△△△△△△8086/8088CPU執(zhí)行除法時規(guī)定:除數(shù)只能是被出數(shù)的一半字長。當(dāng)被除數(shù)為16位時,除數(shù)應(yīng)為8位;當(dāng)被除數(shù)為32位時,除數(shù)應(yīng)為16位AL源操作數(shù)AXAHAXAL源操作數(shù)AHDX商商余數(shù)余數(shù)8位16位16位32位除數(shù)除數(shù)被除數(shù)被除數(shù)三、位操作類指令

1.邏輯運算指令邏輯運算類指令與算術(shù)運算指令不同,算術(shù)指令是按字節(jié)或字進(jìn)行算術(shù)運算,而邏輯運算指令是把操作數(shù)按位來進(jìn)行邏輯運算?!芭c”運算指令 格式:ANDdst,src“或”運算指令 格式:ORdst,src“非”運算指令 格式:NOTopr“異或”運算指令 格式:XORdst,src測試指令 格式:TESTdst,src 說明:TEST相當(dāng)于AND運算,但是不保存結(jié)果,僅影響標(biāo)志。常見的用法舉例:⑴清進(jìn)位標(biāo)志位:ANDAX,AX或ORAL,AL等⑵清零操作數(shù):XORAX,AX不僅把AX清零,而且也影響了狀態(tài)標(biāo)志⑶把某幾位取反:用XOR指令,把要取反的位和1異或,不變的位和0異或⑷清零或置位某幾位:用AND指令清零,用OR指令置位2.移位操作指令該類指令的使用方法是:⑴移動1位,用類似于SHLAX,1的格式⑵移動n位,用類似于SHLAX,CL的格式SHL邏輯左移:操作數(shù)整體左移,最高位移到CF,空余低位補0SHR邏輯右移:操作數(shù)整體右移,最低位移到CF,空余高位補0SAL算術(shù)左移:和SHL指令相同SAR算術(shù)右移:操作數(shù)整體右移,最低位移到CF,空余高位補原符號位說明:⑴邏輯移位適用于無符號數(shù),算術(shù)移位適用于有符號數(shù)。⑵邏輯左移和算術(shù)左移的機器碼完全相同,是助記符的兩種寫法。ROL循環(huán)左移:操作數(shù)整體左移,最高位移到CF,最低位補原最高位ROR循環(huán)右移:操作數(shù)整體右移,最低位移到CF,最高位補原最低位RCL帶進(jìn)位的循環(huán)左移:類似于ROL循環(huán)移位,CF加入到循環(huán)圈中。RCR帶進(jìn)位的循環(huán)右移:類似于ROR循環(huán)移位,CF加入到循環(huán)圈中。說明:循環(huán)移位常用來變換數(shù)據(jù)格式。MOVCL,4 ;置循環(huán)以位次數(shù)MOVAL,16H ;(AL)=16HROLAL,CL ;(AL)=61H四、串操作指令

串操作指令的特征是對數(shù)據(jù)塊(字符串)進(jìn)行操作,并且其中部分指令可以兩個操作數(shù)同時是存儲器操作數(shù)。MOVS(Movestring)串傳送CMPS(Comparestring)串比較SCAS(Scanstring)串掃描LODS(Loadfromstring)從串中取數(shù)據(jù)STOS(Storeintostring)存數(shù)據(jù)到串中說明:⑴串操作指令每次執(zhí)行完成一個字節(jié)或一個字的操作。⑵通常使用重復(fù)前綴,用來完成數(shù)據(jù)塊的操作。重復(fù)前綴⑴REP重復(fù)⑵REPE/REPZ相等/為零則重復(fù)⑶REPNE/REPNZ不相等/不為零則重復(fù)特點:⑴串操作指令需要指明每次操作的類型:B字節(jié),W字例如:MOVSB,CMPSW等。⑵串操作指令使用DS:SI作為源操作數(shù)的指針;ES:DI作為目的操作數(shù)的指針⑶使用DF來表示每次操作以后變址寄存器SI和DI的變化方向CLD;DF=0SI,DI做增量變化B:+1或W:+2STD;DF=1SI,DI做減量變化B:-1或W:-2⑷使用CX來表示用重復(fù)前綴以后指令需要重復(fù)執(zhí)行的次數(shù)說明:⑴MOVS指令MOVSB或MOVSW以字節(jié)或字為單位在存儲單元之間傳送數(shù)據(jù)可以使用REP前綴⑵LODS指令LODSB或LODSW從內(nèi)存中取出字節(jié)或字到累加器AL或AX可以使用REP前綴,但意義不大。⑶STOS指令STOSB或STOSW從累加器中存字節(jié)或字到存儲器可以使用REP前綴⑷CMPS指令CMPSB或CMPSW以字節(jié)或字為單位進(jìn)行兩個存儲器操作數(shù)的比較可以使用REPE/REPZ前綴用源操作數(shù)-目的操作數(shù)⑸SCAS指令SCASB或SCASW在數(shù)據(jù)串中查找AL或AX中的內(nèi)容??梢允褂肦EPNE/REPNZ前綴五、程序控制類指令

能夠使程序的執(zhí)行流程發(fā)生改變的指令1.無條件轉(zhuǎn)移JMP轉(zhuǎn)移指令操作:有以下幾種類型⑴段內(nèi)直接短轉(zhuǎn)移

JMPSHORTopr ;(IP)←(IP)+Data8Data8是一個字節(jié)的補碼數(shù)范圍:-128~+127⑵段內(nèi)直接近轉(zhuǎn)移

JMPNEARPTR

opr

(IP)←(IP)+Data16Data16是兩個字節(jié)的補碼數(shù)范圍:-327

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論