第3章 尋址方式及指令系統(tǒng)_第1頁
第3章 尋址方式及指令系統(tǒng)_第2頁
第3章 尋址方式及指令系統(tǒng)_第3頁
第3章 尋址方式及指令系統(tǒng)_第4頁
第3章 尋址方式及指令系統(tǒng)_第5頁
已閱讀5頁,還剩266頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章尋址方式與指令系統(tǒng)3.1指令系統(tǒng)概述3.28086尋址方式3.38086指令系統(tǒng)3.1指令系統(tǒng)概述3.1.1指令的基本概念

程序:是由完成一個完整任務(wù)的一系列有序指令組成的有序集合。

指令:是指示計算機進行某種操作的命令,通常一條指令對應(yīng)著一種基本操作。

指令系統(tǒng):計算機所能執(zhí)行的全部指令的集合,稱為處理器的指令系統(tǒng)。3.1.2指令格式

計算機中的指令通常由操作碼(Operation)和操作數(shù)(Operand)組成,

操作碼部分規(guī)定計算機所執(zhí)行的操作;

操作數(shù)部分也稱為地址碼,用來描述該指令的操作對象。

操作碼操作數(shù)…操作數(shù)

3.1.38086匯編語言格式

標(biāo)號:操作碼操作數(shù);注釋1.雙操作數(shù)指令大多數(shù)指令需要兩個操作數(shù),分別稱兩個操作數(shù)為源操作數(shù)和目標(biāo)操作數(shù),指令運算結(jié)果存入目標(biāo)操作數(shù)的地址中去。這樣,目標(biāo)操作數(shù)的原有數(shù)據(jù)將被取代。格式:操作碼DST,SRC其中,DST為目標(biāo)操作數(shù),SRC為源操作數(shù)。2.單操作數(shù)指令指令中只給出一個操作數(shù)。若指令只需要一個操作數(shù),則此操作數(shù)通常作為目標(biāo)操作數(shù),在運算前提供源操作數(shù),運算后存放運算結(jié)果。若指令需2個操作數(shù),則另一操作數(shù)由指令隱含指定。格式:操作碼DST3.無操作數(shù)指令

格式:操作碼例如: HLT ;停機指令,是無操作數(shù)指令 INCAX ;增1指令,是單操作數(shù)指令 ADDAX,BX ;加法指令,是雙操作數(shù)指令3.1.4指令的執(zhí)行

要執(zhí)行的程序段的指令,均保存在存儲器中,當(dāng)計算機需要執(zhí)行一條指令時,首先產(chǎn)生這條指令的相應(yīng)地址,并根據(jù)地址號打開相應(yīng)的存儲單元,取出指令代碼,CPU根據(jù)指令代碼的要求以及指令中的操作數(shù),去執(zhí)行相應(yīng)的操作。3.28086尋址方式計算機中操作數(shù)的存放大致有以下幾種情況:①操作數(shù)包含在指令中。這樣的數(shù)稱為立即數(shù),相應(yīng)的尋址方式稱為立即數(shù)尋址②操作數(shù)在CPU的某一個寄存器中。相應(yīng)的尋址方式稱為寄存器尋址。③操作數(shù)在內(nèi)存儲器中,指令中給出的是操作數(shù)在存儲器中的地址信息。在這種情況下,只有給定操作在內(nèi)存中存放的地址,才能找到并取出它。④操作數(shù)在某個寄存器端口。對于端口地址的不同給出方式,就形成不同的端口尋址方式。8086的基本尋址方式有7種:立即數(shù)尋址寄存器尋址直接尋址寄存器間接尋址寄存器相對尋址基址加變址尋址相對基址加變址尋址3.2.1數(shù)據(jù)尋址方式1.立即數(shù)尋址操作數(shù)直接存放在指令中,緊跟在指令操作碼之后。這樣的數(shù)稱為立即數(shù),相應(yīng)的尋址方式稱為立即尋址方式。這種尋址方式在匯編語言格式中表示為:數(shù)字表達式這個數(shù)字表達式的值可以是一個8位無符號整數(shù),也可以是一個16位無符號整數(shù),但不可以為小數(shù)。例如:MOVAX,251 ;將十進制數(shù)251送入寄存器AX,“251”是立即數(shù)MOVAL,‘5’ ;將5的ASCII碼送入寄存器AL,其中‘5’是立即數(shù)MOVAL,0E8H ;將8位立即數(shù)E8H送入寄存器ALMOVAX,2346H;將16位立即數(shù)2346H送入寄存器AX特點:立即尋址方式中操作數(shù)可以從指令中直接取得,不需要運行總線周期,所以其顯著特征是速度快。說明:立即數(shù)可為8位,可為16位只能為整數(shù)只能做源操作數(shù)2.寄存器尋址

操作數(shù)在CPU的內(nèi)部寄存器中,指令指定寄存器名(機器指令中為寄存器的二進制編號)。這種尋址方式在匯編語言格式中表示為: 寄存器名

①對于16位操作數(shù),可以使用的寄存器有:AX、BX、CX、DX、SI、DI、SP、BP等;②對于8位操作數(shù),可以使用的寄存器有:AH、AL、BH、BL、CH、CL、DH、DL。例如:MOVAX,CX;將CX內(nèi)容送AXMOVDL,BL;將BL內(nèi)容送DL其中“AX”,“CX”,“DL”,“BL”就是寄存器尋址方式。機器執(zhí)行直接尋址方式的指令時,根據(jù)地址碼字段訪問到寄存器,繼而訪問到操作數(shù)。優(yōu)點:寄存器數(shù)量一般在幾個到幾十個,比存儲器單元少很多,因此它的地址碼短,從而縮短了指令長度,節(jié)省了程序存儲空間。另一方面,從寄存器里取數(shù)比從存儲器里取數(shù)的速度快得多,從而提高了指令執(zhí)行速度。

說明:源操作數(shù)和目的操作數(shù)都可以使用寄存器尋址。3.存儲器尋址方式⑴直接尋址操作數(shù)在存儲器中,邏輯段中存儲單元的有效偏移地址EA由指令直接給出。這種尋址方式在匯編語言格式中可以表示為以下幾種:①地址表達式②[地址表達式]③[數(shù)字表達式]假設(shè)TABLE是在數(shù)據(jù)段定義的一個字節(jié)數(shù)組的首地址標(biāo)號,其偏移地址為1000H,則以下三條指令是等效的:MOVAL,TABLEMOVAL,[TABLE]MOVAL,[1000H]其中“TABLE”、“[TABLE]”、“[1000H]”都是直接尋址方式。以下三條指令也是等效的:MOVAL,TABLE+2MOVAL,[TABLE+2]MOVAL,[1000H+2]例如:MOVAX,[3100H]特點:需要一個總線周期說明:默認(rèn)的段寄存器為DS,如果不是DS,則需要用前綴指出。MOVBX,ES:[3100H]將ES段的3100H和3101H兩單元的內(nèi)容取到BX中。假設(shè)(DS)=3000H,(31000H)=12H,(31001H)=34H,則執(zhí)行指令 MOVAL,[1000H]操作的示意圖如圖所示。數(shù)據(jù)段代碼段31000H存儲器AX30000HOP00H10H12H34H圖3.5直接尋址操作示意圖指令執(zhí)行完以后,(AX)=3412H。⑵寄存器間接尋址

若操作數(shù)在存儲器中,存儲單元有效地址被放在基址寄存器BX、BP或變址寄存器SI、DI中,則稱為寄存器間接尋址。寄存器間接尋址方式在匯編格式中表示為:[基址寄存器名或變址寄存器名]例如:MOVAX,[BX] ;物理地址=DS×16+BXMOVAL,[BP] ;物理地址=SS×16+BPMOVAX,CS:[DI];物理地址=CS×16+DI其中“[BP]”、“[BX]”、“[DI]”都是寄存器間接尋址方式。

特點:需要一個以上總線周期說明:①寄存器可以為BX,BP,SI,DI②如果沒有指明具體的段寄存器,默認(rèn)的段寄存器為DS;當(dāng)寄存器為BP時,段寄存器為SS;③允許在指令中指定8位或16位位移量。有效地址EA=[BX][BP][SI][DI]如果(DS)=3000H,(BX)=1010H,(31010H)=12H,(31011H)=24H。則操作數(shù)的20位物理地址=30000H+1010H=31010H,執(zhí)行指令MOVAX,[BX]操作的示意圖如圖3.7所示。存儲器AX30000H12H24H數(shù)據(jù)段圖3.7寄存器間接尋址操作圖指令執(zhí)行完以后,(AX)=2412H。這種尋址方式也允許指定段跨越前綴來取得其它段中的數(shù)據(jù)。這種尋址方式一般用于訪問表格或字符串,執(zhí)行完一條指令后,通過修改SI或DI或BX或BP的內(nèi)容就可訪問到表格的下一數(shù)據(jù)項的存儲單元。1.以SI,DI,BX為寄存器進行間接尋址。默認(rèn)段寄存器為DS操作數(shù)物理地址為:PA=16d×(DS)+(BX)PA=16d×(DS)+(SI)PA=16d×(DS)+(DI)若使用其他段寄存器,需用前綴指明。2.以BP為寄存器進行間接尋址默認(rèn)段寄存器為SS操作數(shù)物理地址:PA=16d×(SS)+(BP)若使用其他段寄存器,需用前綴指明。⑶寄存器相對尋址若操作數(shù)在存儲器中,存儲單元的有效地址由一個基址或變址寄存器與指令中指定的8位或16位位移量組成,則稱為寄存器相對尋址。這種尋址方式在匯編格式中表示為以下兩種形式之一:①位移量[基址寄存器名或變址寄存器名]②[位移量+基址寄存器名或變址寄存器名]有效地址EA=[BX][BP]8位的位移量[SI]16位的位移量[DI]+例如:MOVAX,20H[SI] 物理地址=DS×16+SI+20H(8位位移量)MOVCL,[BP+2000H]物理地址=SS×16+BP+2000H(16位位移量)MOVAX,STR[BX]當(dāng)機器執(zhí)行這種尋址方式的指令時,依據(jù)地址碼字段的編號訪問得寄存器的值,將其與位移量相加(或相減),和(差)作為操作數(shù)的偏移地址。如果指令中指定的寄存器是BX、SI、DI,則操作數(shù)默認(rèn)在數(shù)據(jù)段中,取DS寄存器的值作為操作數(shù)的段地址值;如果指令中指定的寄存器是BP,則操作數(shù)默認(rèn)在堆棧數(shù)據(jù)段中,取SS寄存器的值作為操作數(shù)的段地址值,從而算得操作數(shù)的20位物理地址,繼而訪問到操作數(shù)。例如,TABLE是數(shù)據(jù)段中定義的一個變量名,假設(shè)它在數(shù)據(jù)段中的偏移地址為0100H,有指令:MOVAX,TABLE[SI]若(DS)=2000H,(SI)=00A0H,(201A0H)=12H,(201A1H)=34H,則源操作數(shù)20位物理地址=20000H+0100H+00A0H=2000H+01A0H=201A0H操作的示意圖如圖3.9所示:位移量TABLE數(shù)據(jù)段代碼段201A0H存儲器AX20000HOP00H01H12H34HOP圖3.9寄存器相對尋址操作圖用途:這種尋址方式一般用于表格處理。表格首地址為COUNT,修改基址或變址寄存器來取得表格中其他元素的值例如:某數(shù)據(jù)表的首地址為COUNT,欲讀取表中第N個數(shù)據(jù),存放到(AL)中,第N個數(shù)據(jù)的有效地址為:EA=COUNT+(N-1)MOVSI,N-1MOVAL,[SI+COUNT]⑷基址加變址尋址操作數(shù)在存儲器中,存儲單元的有效地址是兩個指定寄存器的值之和。這種尋址方式在匯編格式中表示為以下兩種形式之一:①[基址寄存器名][變址寄存器名]②[基址寄存器名+變址寄存器名]

例如:MOVAX,[BX][SI] 物理地址=DS×16+BX+SIMOVAX,[BX+SI] 物理地址=DS×16+BX+SIMOVCL,CS:[BX+DI] 物理地址=CS×16+BX+DI其中“[BX][SI]”、“[BX+DI]“都是基址變址尋址方式。當(dāng)機器執(zhí)行這種尋址方式的指令時,依據(jù)地址碼字段的值仿問得基址寄存器和變址寄存器的值,將其相加,和作為操作數(shù)的偏移地址。

例如:MOVAX,[BX][SI]若(DS)=2000H,(BX)=0500H,(SI)=0010H,則偏移地址=0500H+0010H=0510H,20位物理地址=20000H+0510H=20510H。假設(shè)(20510H)=12H,(20511H)=34H,操作的示意圖如圖3.11所示:20510H存儲器AX20000H12H34H數(shù)據(jù)段代碼段圖3.11基址變址尋址操作示意圖用途:這種尋址方式也常用于數(shù)組或表格處理。表格首地址位于基址寄存器中,用變址寄存器來訪問數(shù)組中的元素。兩個寄存器都能修改,所以比直接變址方式更靈活。⑸相對基址加變址尋址操作數(shù)在存儲器中,存儲單元的有效地址由一個基址寄存器和變址寄存器的內(nèi)容及指令中指定的8位或16位位移量的和構(gòu)成。即EA=[BX]/[BP]+[SI]/[DI]+[8/16位位移量]地址表達式可以書寫為以下兩種形式之一:①位移量[基址寄存器][變址寄存器]②[基址寄存器+變址寄存器+位移量]例如:MOVAX,[BX+DI+20H] 指令中給出8位位移量20H。MOVAX,ES:1000H[BP][SI] 訪問ES段字存儲單元。以下三條語句是等價的:MOVAL,TABLE[BX][SI]MOVAL,TABLE[BX+SI]MOVAL,[TABLE+BX+SI]用途:這種尋址方式為堆棧處理提供方便:(BP)為棧頂值(一般都使用BP指向棧頂);從棧頂?shù)綌?shù)組的首地址可以用位移量(MASK)表示;變址寄存器(SI)或(DI)指向數(shù)組中某個元素。8086尋址方式的操作數(shù)有三種類型:立即操作數(shù)寄存器操作數(shù)存儲器操作數(shù)(1)立即操作數(shù)立即操作數(shù)只能作為源操作數(shù),不能作為目標(biāo)操作數(shù)MOVAX,3100HMOV3100,AX指令中的立即操作數(shù)不應(yīng)超過其8位或16位的取值范圍MOVAL,100HMOVAX,20000H(2)寄存器操作數(shù)寄存器操作數(shù)可能存放在:8086的通用寄存器中,指針寄存器,變址寄存器中。隱含寄存器操作數(shù):某些指令規(guī)定只能使用指定寄存器操作數(shù),從指令形式看,似乎沒有指出操作數(shù),實際上是隱含了某些特定寄存器操作數(shù)。MOVCL;AL*CLAX(3)存儲器操作數(shù)存儲器操作數(shù)類型可以為:字節(jié)、字、雙字。存儲器操作數(shù)可以作為源操作數(shù),也可以作為目的操作數(shù)。但多數(shù)指令不允許源操作數(shù)、目標(biāo)操作數(shù)同時為存儲器操作數(shù)。MOV[BX],[3100H]3.2.2程序地址尋址方式1.段內(nèi)直接尋址這種尋址方式的匯編格式有三種:①指令名SHORT轉(zhuǎn)移目標(biāo)地址標(biāo)號②指令名轉(zhuǎn)移目標(biāo)地址標(biāo)號③指令名NEARPTR轉(zhuǎn)移目標(biāo)地址標(biāo)號指令中直接指明了要轉(zhuǎn)移的目標(biāo)地址,因此叫直接尋址;又因為這種指令只改變IP寄存器的值而不改變CS寄存器的值,因此又叫段內(nèi)尋址。匯編這種指令尋址方式時,匯編程序計算轉(zhuǎn)移目標(biāo)地址標(biāo)號與本條指令的下一條指令的地址的差值,將其補碼稱為位移量,寫入指令的地址碼字段。當(dāng)執(zhí)行這種尋址方式的轉(zhuǎn)移指令時,機器取出位移量,與當(dāng)前(IP)相加,和送入IP寄存器中,CS寄存器內(nèi)容保持不變,從而實現(xiàn)轉(zhuǎn)移,如圖3.12所示:轉(zhuǎn)移目標(biāo)地址的偏移地址址指令位移量IP寄存器IP寄存器圖3.12段內(nèi)直接尋址示意圖由此可看出,這種尋址方式實現(xiàn)的是相對轉(zhuǎn)移。位移量不同,轉(zhuǎn)移范圍不同。當(dāng)位移量為8位時,只允許轉(zhuǎn)移到與本條指令的下一條指令相距-128~+127范圍內(nèi)的存儲單元去。當(dāng)位移量為16位時,允許轉(zhuǎn)移到當(dāng)前代碼段內(nèi)任何地方。要注意的是:條件轉(zhuǎn)移指令的位移量只能是8位,而無條件轉(zhuǎn)移的指令可以是8位,也可以是16位。8位叫短跳轉(zhuǎn),16位叫近跳轉(zhuǎn)。3.段內(nèi)間接尋址這種尋址方式的匯編格式為:①指令名16位寄存器名指令名WORDPTR存儲器尋址方式轉(zhuǎn)移的目標(biāo)地址放在寄存器或存儲器中,因此叫寄存器間接尋址。這種指令只改變IP寄存器的值而不改變CS寄存器的值,因此又叫段內(nèi)尋址。當(dāng)執(zhí)行這種尋址方式的轉(zhuǎn)移指令時,機器按照指令中規(guī)定的尋址方式尋址到一個字,然后把它送入IP寄存器中,CS寄存器的內(nèi)容不變,從而實現(xiàn)轉(zhuǎn)移,如圖3.14所示。圖3.14段內(nèi)間接尋址示意圖2.段間直接尋址這種尋址方式的匯編格式有以下兩種形式:①指令名FARPTR轉(zhuǎn)移地址標(biāo)號②指令名段地址:段偏移地址指令中直接指明了要轉(zhuǎn)移的目標(biāo)地址,此轉(zhuǎn)移地址或用地址標(biāo)號或用數(shù)值地址表示,因此叫直接尋址;又因為這種指令不僅改變IP寄存器的值而且改變CS寄存器的值,因此又叫段間尋址。當(dāng)執(zhí)行這種尋址方式的轉(zhuǎn)移指令時,機器取指令操作碼之后的第一個字,把它送入IP寄存器中,取操作碼之后的第二個字把它送入CS寄存器中,從而實現(xiàn)轉(zhuǎn)移,如圖3.13所示。圖3.13段間直接尋址示意圖轉(zhuǎn)移目標(biāo)地址的段地址址轉(zhuǎn)移目標(biāo)地址的偏移地址址指令CS寄存器IP寄存器地址段地址4.段間間接尋址這種尋址方式的匯編格式為:指令名DWORDPTR存儲器尋址方式轉(zhuǎn)移的目標(biāo)地址放在存儲器中。稱作間接尋址。這種指令不僅改變IP寄存器的值而且改變CS寄存器的值,因此又叫段間尋址。當(dāng)執(zhí)行這種尋址方式的轉(zhuǎn)移指令時,機器按照指令中規(guī)定的尋址方式尋址到存儲器中相繼的二個字,把第一個字送入IP寄存器中,把第二個字送入CS寄存器,從而實現(xiàn)轉(zhuǎn)移,如圖3.15所示。轉(zhuǎn)移目標(biāo)地址的段地址CS寄存器根據(jù)尋址方式計算出20位物理地址指令存儲器尋址方式轉(zhuǎn)移目標(biāo)地址的偏移地址址IP寄存器存儲器圖3.15段間間接尋址示意圖3.38086指令系統(tǒng)

Intel8086CPU提供133條基本指令,按功能又可分為以下六類:①數(shù)據(jù)傳送指令②算術(shù)運算指令③邏輯運算和移位指令④串操作指令⑤程序控制指令⑥處理器控制指令下面將分類介紹這些指令。3.3.1數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令功能是將數(shù)據(jù)、地址或立即數(shù)傳送到寄存器或存儲單元中。傳送指令包括:通用數(shù)據(jù)傳送指令堆棧操作指令地址傳送指令標(biāo)志寄存器傳送指令數(shù)據(jù)交換指令換碼指令輸入輸出指令重點掌握MOV通用數(shù)據(jù)傳送指令PUSH/POP堆棧操作指令XCHG交換指令LEA地址傳送指令I(lǐng)N/OUT輸入輸出指令1.通用數(shù)據(jù)傳送指令通用數(shù)據(jù)傳送指令MOV是形式最簡單、用的最多的指令,它可以實現(xiàn)CPU內(nèi)部寄存器之間的數(shù)據(jù)傳送、寄存器和內(nèi)存之間的數(shù)據(jù)傳送,還可以把一個立即數(shù)送給CPU的內(nèi)部寄存器或者內(nèi)存單元。格式: MOVDST,SRC其中,DST可以是寄存器和存儲器,SRC可以是寄存器、存儲器或立即數(shù)。說明:①指令中兩個操作數(shù)不能同為存儲器操作數(shù)。②CS不能做為目標(biāo)操作數(shù)。③段寄存器之間不能互相傳送。④立即數(shù)不能直接送入段寄存器。⑤MOV指令不影響標(biāo)志位。下面舉例說明MOV指令的應(yīng)用:MOVAL,12HMOVAX,3456HMOVCL,4 ;CL←4,字節(jié)傳送MOVDX,0FFH ;DX←00FFH,字傳送MOVSI,200H ;SI←0200H,字傳送

寄存器具有明確的字節(jié)和字類型⑴立即數(shù)傳送給通用寄存器⑵通用寄存器之間相互傳送

MOVAX,BX ;將BX中的數(shù)據(jù)傳送到AX中。

MOVCL,BH ;將BH中的數(shù)據(jù)傳送到CL中,BH、CL就為8位。

MOVSP,SI;將SI中的數(shù)據(jù)傳送到SI中(3)通用寄存器和段寄存器之間相互傳送MOVDS,AX ;DS←AX,字傳送MOVAX,DS ;AX←DS(4)通用寄存器和存儲器之間相互傳送

MOVAX,[BX] 將以BX為有效地址的2個連續(xù)內(nèi)存單元中的數(shù)據(jù)傳送到AX中MOV[SI],DH 將DH中的數(shù)據(jù)傳送到由SI指定的內(nèi)存單元中指令中的[BX]、[SI]和[DI]分別表示以BX、SI和DI中的值為有效地址的內(nèi)存單元。MOVAX,[2000H](5)段寄存器存儲器之間的相互傳送MOVES,[SI]MOV[DI],SS雖然MOV指令不能直接實現(xiàn)兩個存儲單元之間的數(shù)據(jù)傳送,但可以借助CPU內(nèi)部的寄存器,通過兩條指令來完成兩個存儲單元之間的數(shù)據(jù)傳送。(6)立即數(shù)傳送給存儲器MOVBYTEPTR[BX],34HMOVWORDPTR[BP],2345H必須確定存儲單元的類型,字或者字節(jié)BYTEPTRWORDPTR舉例1.MOVMEM2,MEM1修改MOVAX,MEM1MOVMEM2,AX2.MOVDS,2000H修改MOVAX,2000HMOVDS,AX3.MOVES,DS修改MOVAX,DSMOVES,AXMOV指令傳送功能圖解MOV指令也并非任意傳送!非法指令的主要現(xiàn)象:兩個操作數(shù)的類型不一致無法確定是字節(jié)量還是字量操作兩個操作數(shù)都是存儲器段寄存器的操作有一些限制不能對指令指針I(yè)P進行操作非法指令--兩個操作數(shù)類型不一致在絕大多數(shù)雙操作數(shù)指令中,目的操作數(shù)和源操作數(shù)必須具有一致的數(shù)據(jù)類型,或者同為字量,或者同為字節(jié)量,否則為非法指令

MOVAL,050AH ;非法指令,修正: ;MOVAX,050AH MOVSI,DL ;非法指令,修正: ;MOVDH,0

;MOVSI,DX非法指令--無法確定是字節(jié)量還是字量操作當(dāng)無法通過任一個操作數(shù)確定操作類型時,需要利用匯編語言的操作符顯式指明

MOV[BX+SI],255 ;非法指令,修正: ;MOVBYTEPTR[BX+SI],255

;BYTEPTR說明是字節(jié)操作 ;MOVWORDPTR[BX+SI],255

;WORDPTR說明是字操作非法指令--兩個操作數(shù)都是存儲器8088指令系統(tǒng)除串操作指令外,不允許兩個操作數(shù)都是存儲單元(存儲器操作數(shù))

MOVBUF2,BUF1 ;非法指令,修正:

;假設(shè)BUF2和BUF1是兩個字變量 ;MOVAX,BUF1

;MOVBUF2,AX

;假設(shè)BUF2和BUF1是兩個字節(jié)變量 ;MOVAL,BUF1

;MOVBUF2,AL非法指令--段寄存器的操作有一些限制8088指令系統(tǒng)中,能直接對段寄存器操作的指令只有MOV等個別傳送指令,并且不靈活

MOVDS,ES ;非法指令,修正: ;MOVAX,ES

;MOVDS,AX MOVDS,100H ;非法指令,修正: ;MOVAX,100H

;MOVDS,AX

MOVCS,[SI] ;非法指令 ;指令存在,但不能執(zhí)行2.堆棧操作指令

堆堆棧(Stack)是主存中一個特殊的區(qū)域。它采用先進后出FILO(FirstInLastOut)或后進先出LIFO(LastInFirstOut)的原則進行存取操作,而不是隨機存取操作方式。堆棧指針——它指示棧頂位置,在8086中,棧頂由SS和SP共同指示,即SS:SP。用戶操作(PUSH/POP指令)

⑴堆棧

向下生長——向低地址方向生長;雙字節(jié)操作——高對高,低對低;“棧頂總滿”——棧頂已經(jīng)堆有數(shù)據(jù)。8088/8086的堆棧操作特點⑵堆棧操作指令

堆棧只有兩種基本操作:進棧和出棧,用戶操作堆棧對應(yīng)兩條指令PUSH和POP。進棧指令PUSH:進棧指令先使堆棧指針SP減2,然后把一個字操作數(shù)存入堆棧頂部出棧指令POP:

出棧指令把棧頂?shù)囊粋€字傳送至指定的目的操作數(shù),然后堆棧指針SP加2說明:①PUSH、POP指令不能使用立即尋址方式,POP指令不能使用CS寄存器。②堆棧中數(shù)據(jù)的壓入彈出必須以字為單位進行,每次PUSH操作棧頂向低地址移動兩個字節(jié),而POP操作棧頂向高地址移動兩個字節(jié)。③字量數(shù)據(jù)從棧頂壓入和彈出時,都是低地址字節(jié)送低字節(jié),高地址字節(jié)送高字節(jié)④堆棧操作遵循先進后出原則,但可用存儲器尋址方式隨機存取堆棧中的數(shù)據(jù)⑤兩條堆棧指令不影響標(biāo)志位。⑥堆棧段是程序中不可或缺的一個內(nèi)存區(qū),常用來臨時存放數(shù)據(jù)傳遞參數(shù)保存和恢復(fù)寄存器堆棧的實例和圖例MOVAX,7812HPUSHAXPOPAX例:現(xiàn)場的保護和恢復(fù)pushax ;進入子程序后pushbxpushds...popds ;返回主程序前popbxpopax3.數(shù)據(jù)交換指令格式: XCHGDST,SRC說明:①DST、SRC不允許是段寄存器、立即數(shù)和IP寄存器。②DST和SRC中,必須有一個是寄存器尋址,即DST和SRC不能同為內(nèi)存單元。兩個存儲單元之間不能直換互換數(shù)據(jù)。③DST和SRC的取值范圍必須相同,同為8位或者16位。④此指令不影響標(biāo)志位。舉例XCHGBL,DLXCHGAX,SIXCHG[DI],ALXCHG[BX],[DI]XCHGDS,AX例1: XCHGBX,[BP+SI]假設(shè)該指令執(zhí)行前:(BX)=1234H,(BP)=0100H,(SI)=0020H,(SS)=1F00H,(1F120H)=0000H,即源操作數(shù)物理地址=1F00H:0100+0020=1F00H:0120H=1F120H,交換前源操作數(shù)為0000H,目標(biāo)操作數(shù)為1234H;則指令執(zhí)行后,(BX)=0000H,(1F120H)=1234H例2:MOVAX,1199H ;AX=1199HXCHGAH,AL ;AX=9911H;等同于XCHGAL,AH例3:MOVwvar,5566H ;wvar是一個字變量XCHGAX,wvar;AX=5566H,wvar=9911H;等同于XCHGwvar,AX例4:XCHGAL,BYTEPTRwvar+1;AX=5599H,wvar=6611H;“BYTEPTRwvar+1”強制為字節(jié)量,只取高字節(jié)與AL類型交換,否則數(shù)據(jù)類型不匹配4.地址傳送指令8086中,專用于地址傳送的指令有三條:LEA(LoadEffectiveAddress)取有效地址指令;LDS(LoadPointerintoregisterandDS)取地址指針裝入DS和另一個寄存器的指令LES(LoadpointerintoregisterandES)取地址指針裝入ES和另一個寄存器的指令⑴LEA有效地址傳送指令有效地址傳送指令LEA把源操作數(shù)的有效地址(偏移量)送入指定的寄存器中。格式: LEAREG,SRC其中,目標(biāo)操作數(shù)REG是一個16位的通用寄存器。說明:①REG不能是段寄存器。②這條指令不影響標(biāo)志位。例如:LEAAX,[2782H]LEABX,[BP+SI]LEASP,[0482H]例: MOVBX,400H MOVSI,3CH LEABX,[BX+SI+0F62H] ;BX←400H+3CH+0F62H=139EH⑵將地址裝入DS和另一個寄存器LDS格式: LDSREG,SRC;指針?biāo)图拇嫫骱虳S指令LDS指令將源操作數(shù)SCR指定的4個連續(xù)字節(jié)(內(nèi)存單元),前兩字節(jié)作為偏移量,傳送到REG中;后兩字節(jié)作為段地址,傳送到DS中。例如, LDSBX,[1230H]將地址為1230H和1231H的內(nèi)存單元中的16位數(shù)據(jù)作為偏移量,送入BX寄存器;將地址為1232H和1233H的內(nèi)存單元中的16位數(shù)據(jù)作為段值,送入DS寄存器。說明:①LDS指令中的REG不允許是段寄存器。②LDS指令不影響標(biāo)志位。(3)將地址裝入ES和另一個寄存器LES格式: LESREG,SRC;指針?biāo)图拇嫫骱虴S指令LEDS指令將源操作數(shù)SCR指定的4個連續(xù)字節(jié)(內(nèi)存單元),前兩字節(jié)作為偏移量,傳送到REG中;后兩字節(jié)作為段地址,傳送到ES中。例如, LESDI,[1230H]將地址為1230H和1231H的內(nèi)存單元中的16位數(shù)據(jù)作為偏移量,送入DI寄存器;將地址為1232H和1233H的內(nèi)存單元中的16位數(shù)據(jù)作為段值,送入ES寄存器。說明:①LES指令中的REG不允許是段寄存器。②LES指令不影響標(biāo)志位。5.標(biāo)志寄存器傳送指令⑴讀取標(biāo)志指令LAHF讀取標(biāo)志指令LAHF被執(zhí)行時,將標(biāo)志寄存器FLAGS中的低8位,傳送至AH中。如圖3.18所示。

圖3.18LAHF指令操作格式

⑵設(shè)置標(biāo)志寄存器指令SAHF設(shè)置標(biāo)志寄存器指令SAHF與LAHF正好相反,把AH傳送至標(biāo)志寄存器FLAGS的低8位。SAHF指令可能會改變SF、ZF、AF、PF和CF標(biāo)志位,但不影響位于高字節(jié)的OF、DF、IF和TF標(biāo)志。(3)對標(biāo)志寄存器壓棧指令PUSHF將標(biāo)志寄存器的值推入堆棧頂部,同時,棧指針SP的值減2,此指令在執(zhí)行時標(biāo)志寄存器的值不變。(4)對標(biāo)志寄存器彈棧指令POPF在執(zhí)行時從堆棧中彈出一個字送到標(biāo)志寄存器中,同時堆棧指針SP的值加2。

PUSHF和POPF指令一般用在子程序和中斷處理程序的首尾,起保存主程序狀態(tài)標(biāo)志和恢復(fù)主程序狀態(tài)標(biāo)志的作用。6.換碼指令使累加器中的一個值轉(zhuǎn)換為內(nèi)存表格中對應(yīng)的某一個值。即可以用表格中的一個值來置換AL中的內(nèi)容。使用該指令前,內(nèi)存表的首地址賦給BX,AL中存放表格某一項與表格首地址的位移量,執(zhí)行BX+AL,得到該表格中的一個地址,再將該地址所對應(yīng)單元中的值送到AL中。舉例:十進制數(shù)字0~9的7段顯示碼的碼表7.輸入輸出指令I(lǐng)N,OUT8086通過輸入輸出指令與外設(shè)進行數(shù)據(jù)傳送輸入指令用于CPU從外設(shè)端口接收數(shù)據(jù)輸出指令用于CPU向外設(shè)端口發(fā)送數(shù)據(jù)AL8位I/O端口AX16位I/O端口端口:CPU與外設(shè)之間通過接口進行數(shù)據(jù)交換,一個端口通常對應(yīng)接口中的一個或一組寄存器,每個8位端口有一個地址,叫做端口號。兩個相鄰的8位端口可以組成一個16位端口。端口數(shù):外部設(shè)備最多有65536個I/O端口。(由A0~A15譯碼形成)端口號:端口號(即外設(shè)端口地址)為0000H~FFFFHPC機僅使用A0~A9譯碼形成I/O端口地址,即1024H個端口地址,因此端口號范圍為0000H~03FFH其中,A9=1,表示擴充槽上的端口地址端口號中前256個端口(0~FFH),可以使用直接的輸入/輸出指令,指令中提供端口號INAL,PORT;(AL)←(PORT)功能:把來自端口PORT的一個字節(jié)送入AL寄存器 INAX,PORT;(AX)←(PORT+1,PORT)功能:把來自PORT和PORT+1兩個端口的數(shù)據(jù)構(gòu)成一個字送入AX寄存器中OUTPORT,AL;(PORT)←(AL)功能:把AL寄存器中的一個字節(jié)送入端口PORTOUTPORT,AX;(PORT+1,PORT)←(AX)功能:把AX寄存器中的一個字送入PORT和PORT+1兩個端口(1)直接輸入輸出指令I(lǐng)N,OUT例如:INAL,50HINAX,70HOUT44H,ALOUT80H,AX以上IN和OUT指令是直接端口尋址方式,端口地址PORT是一個8位的立即數(shù),其范圍是0~255。所有的端口號(0~FFFFH),都可以使用間接的輸入/輸出指令,執(zhí)行這些指令之前,已經(jīng)將端口號傳入DX中INAL,DX;(AL)←(DX)功能:把來自DX的一個字節(jié)送入AL寄存器 INAX,DX;(AX)←(DX)功能:把來自DX的一個字送入AX寄存器中OUTDX,AL;(DX)←(AL)功能:把AL寄存器中的一個字節(jié)送入DX中OUTDX,AX;(DX)←(AX)功能:把AX寄存器中的一個字送入DX中注意:端口號≥256時,只能使用間接輸入/輸出指令(2)間接輸入輸出指令I(lǐng)N,OUT注意:操作數(shù)可以8位也可以16位,當(dāng)為8位時必須用到AL,16位時必須用到AX若端口地址小于255,可直接在指令中給出(n),大于255時,必須將端口地址放入DX所有輸入或輸出必須借助累加器AL或AX傳輸,其他寄存器不行傳送16位數(shù)據(jù)的端口地址必須是偶數(shù)I/O口的累加器傳送指令舉例(1)INAL,06H OUT06H,AL

(2)

INAX,31H OUT31H,AX(3)INAL,100H OUT100H,AL

(4)INAX,100H OUT100H,AX

舉例:1.將(28H)(28H)端口的字?jǐn)?shù)據(jù)傳送到DATA_WORD2.從端口3FCH送一個字到AX寄存器3.將(AL)中數(shù)據(jù)傳送到(05H)端口3.3.2算術(shù)運算指令

問題:無符號數(shù)和有符號數(shù)能否使用同一套加、減、乘、除指令無符號數(shù)和有符號數(shù)使用同一套加、減,要求參與運算的兩個數(shù)必須同為無符號數(shù)或同為有符號數(shù);另外,要用不同的方法判斷運算結(jié)果是否溢出,采用什么方法判斷溢出。結(jié)論1.無符號和有符號加法、減法運算可以使用同一套指令系統(tǒng),無符號和有符號乘法、除法不可以使用同一套指令系統(tǒng);2.參加運算的必須同是無符號數(shù)或同是有符號數(shù);3.溢出的判斷:無符號數(shù)運算產(chǎn)生溢出時,CF=1;有符號數(shù)運算產(chǎn)生溢出時,OF=14.無符號數(shù)運算產(chǎn)生溢出,會設(shè)置進位位,對于多字節(jié)運算,要利用進位向高位字節(jié)傳送數(shù)值;有符號數(shù)運算產(chǎn)生溢出,則表示出現(xiàn)錯誤。5.標(biāo)志位運算結(jié)果為0時,ZF=1;運算結(jié)果為負(fù)數(shù),則SF=1;運算結(jié)果低八位有偶數(shù)個1,PF=1;3.3.2算術(shù)運算指令

實現(xiàn)二進制/BCD碼數(shù)據(jù)的四則運算1、加法運算:ADD/ADC/INC2、減法運算:SUB/SBB/DEC/NEG/CMP3、乘法運算:MUL/IMUL4、除法運算:DIV/IDIV5、符號擴展:CBW/CWD6、十進制調(diào)整:DAA/DAS/AAA/AAS/AAM/AAD四則運算是計算機經(jīng)常進行的一種操作。算術(shù)運算指令也是經(jīng)常使用的一類指令。請注意算術(shù)運算指令對標(biāo)志的影響重點掌握:ADD/ADC/SUB/SBB/INC/DEC/CMP比較熟悉:

NEG/MUL/IMUL/DIV/IDIV一般了解:CBW/CWD認(rèn)真理解:DAA/DAS/AAA/AAS/AAM/AAD1.加法與減法指令

⑴不帶進位加法指令A(yù)DD不帶進位加法指令A(yù)DD完成兩個操作數(shù)求和運算,并把結(jié)果送目標(biāo)操作數(shù)中。ADD指令影響CF、OF、AF、SF、ZF和PF標(biāo)志位。格式:ADDDST,SRC例如:ADDAL,50HADDCX,1000HADDDS,SIADD[BX+DI],AXADDAX,[BX+2000H]MOVAL,46H ;AL=46HMOVBX,9A4DH ;BX=4A4DHADDAL,0C5H ;AL+0C5H→AL指令執(zhí)行后,對標(biāo)志位的影響如下:二進制運算無符號數(shù)帶符號數(shù)(AL)=46H=0100011070+70+0C5H=11000101197-59自然丟掉100001011267+11SF=0,CF=1,ZF=0,AF=0,OF=0,PF=0⑵帶進位加法指令A(yù)DC兩個操作數(shù)相加時,還要把進位標(biāo)志CF加上去,結(jié)果送到目標(biāo)操作數(shù)中。格式:ADCDST,SRC帶進位加法指令主要用來實現(xiàn)多字節(jié)、多精度加法,因為它能加上低位來的進位。例如:ADCAX,SIADCDX,[SI]ADCBX,3000HADCAL,5利用ADC指令實現(xiàn)多字節(jié)加法加數(shù)和被加數(shù)分別存儲在2000H和3000H開始的存儲單元MOVSI,2000HMOVAX,[SI]MOVDI,3000HADDAX,[DI]MOV[SI],AXMOVAX,[SI+2]ADCAX,[DI]+2MOV[SI+2],AX例如:5A764872H+1F5A427FH(四個字節(jié)的數(shù)據(jù)進行相加)思路:先加低16位,再加高16位例如,有兩個4字節(jié)數(shù),分別存放在自0100H和0200H開始的存儲單元中,其低位字節(jié)位于低地址處。求這兩個數(shù)之和,存放在自0300H開始的單元中。相應(yīng)的程序段如下: MOVAX,[0100H] ADDAX,[0200H] MOV[0300H],AX ;低字之和存入低地址。 MOVAX,[0100H]+2 ;裝入高字。 ADCAX,[0100H]+2 ;高字求和,考慮低字的進位。 MOV[0300H]+2,AX ;存入高字之和。⑶自增指令自增指令I(lǐng)NC將操作數(shù)DST加1,結(jié)果再送回DST。格式:INCDSTINC指令影響OF、AF、SF、ZF和PF等標(biāo)志位,但不影響進位標(biāo)志CF。一般用于循環(huán)程序中修改指針和循環(huán)次數(shù)

例如:INCALINCCXINCBYTEPTR[BX+DI+500]INCSI;將SI內(nèi)容加1,結(jié)果送回SI。舉例(1)MOVAL,0FFHADDAL,1(2)MOVAL,0FFHINCAL結(jié)果是多少?CF=?例:一個數(shù)有10個字節(jié),在M中低在先,高在后,另一個數(shù)也為10字節(jié),也是低在先,高在后,求兩數(shù)之和。MOVAX,2000HMOVDS,AXCLCMOVAL,BXADCAL,SIMOV[BX],ALINCBXINCSI⑷不帶借位的減法指令SUB該指令求源操作數(shù)與目標(biāo)操作數(shù)之差,結(jié)果送到目標(biāo)操作數(shù)OPRD1中。SUB指令影響CF、OF、AF、SF、ZF和PF等標(biāo)志位。格式:SUBDST,SRC例如:SUBBX,CXSUB[BP+2],CLSUBAL,20SUBSI,5010HSUBWORDPTR[DI],1000H例如:MOVDL,41HSUBDL,5AH上述指令執(zhí)行后(DL)=0E7H,SF=1,ZF=0,CF=1,OF=0,AF=1,PF=1。⑸帶借位的減法指令SBB在兩個操作數(shù)相減時,還要再減去借位標(biāo)志CF,結(jié)果送到目標(biāo)操作數(shù)中。格式:SBBDST,SRCSBB指令對狀態(tài)標(biāo)志位的影響與SUB指令相同。它的用法與ADC指令相似,主要用來做多字節(jié)、多精度減法,因為它能夠減去低位產(chǎn)生的借位。例如:SBBAX,2030HSBBWORDPTR[DI+2],1000H⑹自減指令DEC自減指令DEC將目標(biāo)操作數(shù)DST減1,并將結(jié)果再送回DST。格式:DECDST例如:DECAXDECBLDECBYTEPTR[DI+2]DEC指令影響OF、AF、SF、ZF和PF標(biāo)志位,但不影響進位標(biāo)志CF。⑺求補指令NEG求補指令NEG對指令中給出的操作數(shù)DST求其相反數(shù)的補碼形式,再將結(jié)果送回DST。因為對一個數(shù)取其相反數(shù),相當(dāng)于用0減去這個數(shù),所以NEG指令執(zhí)行的也是減法操作。格式:NEGDSTDST0-DST或DST全1-DST+1無論操作數(shù)DST是正數(shù)還是負(fù)數(shù),執(zhí)行完該指令后,都相當(dāng)于對DST按位取反,末位加1。例如:NEGALNEGCX 若(AL)=03H,則CPU執(zhí)行完該指令后,(AL)=0FDH。NEG指令影響CF、OF、AF、SF、ZF和PF標(biāo)志位。CMP指令將目的操作數(shù)減去源操作數(shù),按照定義相應(yīng)設(shè)置狀態(tài)標(biāo)志。CMP指令執(zhí)行的功能與SUB指令,但結(jié)果不回送目的操作數(shù)。兩個操作數(shù)保持原值。⑻比較指令CMP格式:CMPDST,SCR例如:CMPAX,2000HCMPAL,50HCMPAX,[BX+DI+100]CMPDX,DI在比較指令執(zhí)行之后,根據(jù)ZF、CF、SF和OF四個標(biāo)志位可以判斷兩數(shù)的大小。

比較指令CMP結(jié)果不回送,兩個操作數(shù)原值不變,但影響標(biāo)志位。執(zhí)行指令之后,根據(jù)ZF,CF,SF,OF四個標(biāo)志來判斷兩個數(shù)的大小。(1)ZF=1,兩個操作數(shù)相等(2)對于兩個無符號數(shù),若CF=0,則DST>SRC若CF=1,則DST<SRC(3)對于兩個有符號數(shù)兩數(shù)同為正或負(fù),如果SF=0,DST>SRC如果SF=1,DST<SRC兩數(shù)一正一負(fù)時,如果OF=SF,DST>SRC如果OF!=SF,DST<SRC比較指令CMP的用途:執(zhí)行比較指令之后,可以根據(jù)標(biāo)志判斷兩個數(shù)是否相等、大小關(guān)系等。所以,CMP指令后面常跟條件轉(zhuǎn)移指令,根據(jù)比較結(jié)果不同產(chǎn)生不同的分支。2.乘法指令與除法指令

兩個8位操作數(shù)相乘(其中一個在AL中);結(jié)果為16位AX兩個16位操作數(shù)相乘(其中一個在AX中)結(jié)果為32位AX,DX:其中DX看成是AX的擴展,結(jié)果的高16位放入DX中,低16位放入AX中

乘法運算指令

2.乘法指令與除法指令

MULr8/m8;無符號字節(jié)乘法;AX←AL×r8/m8MULr16/m16;無符號字乘法;DX.AX←AX×r16/m16IMULr8/m8;有符號字節(jié)乘法;AX←AL×r8/m8IMULr16/m16;有符號字乘法;DX.AX←AX×r16/m16

乘法運算指令

乘法指令的功能乘法指令分無符號和有符號乘法指令:MUL和IMUL乘法指令的一個源操作數(shù)顯式給出,另一個操作數(shù)隱含使用AL/AX,目標(biāo)操作數(shù)為AX/DX.AX。字節(jié)量相乘:AL與r8/m8相乘,得到16位的結(jié)果,存入AX中;字量相乘:AX與r16/m16相乘,得到32位的結(jié)果,其高字存入DX,低字存入AX中。乘法指令利用OF和CF判斷乘積的高一半是否具有有效數(shù)值。乘法指令對標(biāo)志的影響乘法指令如下影響OF和CF標(biāo)志:MUL

指令——若乘積的高一半(AH或DX)為0,則OF=CF=0;否則OF=CF=1。IMUL

指令——若乘積的高一半是低一半的符號擴展,則OF=CF=0;否則均為1。乘法指令對其他狀態(tài)標(biāo)志沒有定義:指令執(zhí)行后這些標(biāo)志是任意的、不可預(yù)測(就是誰也不知道是0還是1)。 對標(biāo)志沒有影響是指令的執(zhí)行不改變標(biāo)志的狀態(tài)。例:無符號和有符號數(shù)的乘法運算moval,0b4h;al=b4h=180

movbl,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ù)字舉例:(1)設(shè)(AL)=0FCH,(CL)=10H執(zhí)行MULCL后(AX)=0FC0H,CF=OF=1執(zhí)行IMULCL后(AX)=0FFC0H,CF=OF=0(2)MOVAL,0FFHMOVBL,0FFHMULBL;(AX)=FE01HMOVAL,0FFHMOVBL,0FFHIMULBL;(AX)=0001H⑵

除法運算指令

DIVr8/m8

;無符號字節(jié)除法:AX÷r8/m8 AL←商,Ah←余DIVr16/m16

;無符號字除法:DX.AX÷r16/m16 AX←商,DX←余IDIVr8/m8

;有符號字節(jié)除法:AX÷r8/m8 AL←商,Ah←余IDIVr16/m16

;有符號字除法:DX.AX÷r16/m16 AX←商,DX←余除法指令的功能除法指令分無符號和有符號除法指令:DIV和IDIV除法指令的除數(shù)顯式給出(隱含使用一個操作數(shù)AX和DX作為被除數(shù))。字節(jié)量除法:AX除以r8/m8,8位商存入AL,8位余數(shù)存入AH;字量除法:DX.AX除以r16/m16,16位商存入AX,16位余數(shù)存入DX。除法指令對標(biāo)志沒有定義。除法指令會產(chǎn)生結(jié)果溢出舉例:(1)MOVAX,11MOVBL,2DIVBL(AX)=0105(2)MOVDX,0MOVAX,11MOVBX,2DIVBX(AX)=0005;(DX)=0001(3)MOVAX,0FFFFHMOVBL,1DIVBL除法錯中斷

當(dāng)被除數(shù)遠(yuǎn)大于除數(shù)時,所得的商就有可能超出它所能表達的范圍。如果存放商的寄存器AL/AX不能表達,便產(chǎn)生溢出,8086CPU中就產(chǎn)生編號為0的內(nèi)部中斷——除法錯中斷。對DIV指令,除數(shù)為0,或者在字節(jié)除時商超過8位,或者在字除時商超過16位,則發(fā)生除法溢出。 對IDIV指令,除數(shù)為0,或者在字節(jié)除時商不在-128~127范圍內(nèi),或者在字除時商不在-32768~32767范圍內(nèi),則發(fā)生除法溢出。3.符號擴展指令CBW

;AL的符號擴展至AH ;如AL的最高有效位是0,則AH=00;AL的最高有效位為1,則AH=FFH。AL不變。CWD;AX的符號擴展至DX;如AX的最高有效位是0,則DX=00;AX的最高有效位為1,則DX=FFH。AX不變。什么是符號擴展符號擴展指令常用于獲得倍長的數(shù)據(jù),如被除數(shù)符號擴展指令不影響標(biāo)志位MOVAL,1CBWMOVAL,-1CBWMOVAX,1CWDMOVAX,-1CWD例:符號擴展MOVAL,80H ;al=80hCBW ;ax=ff80hADDAL,255 ;al=7fhCBW ;ax=007fh注意:CBW和CWD只能用來擴充AL和AX。問題:BL中有一個8位數(shù),使其擴展為16位,怎樣實現(xiàn)?4.十進制調(diào)整指令十進制數(shù)調(diào)整指令對BCD碼運算的結(jié)果進行十進制調(diào)整,以得到正確的BCD碼運算結(jié)果。

BCD碼運算分壓縮和非壓縮兩種,它們的調(diào)整方法不同。壓縮BCD碼:一個字節(jié)中容納兩個BCD碼,其范圍為:00H~99H。非壓縮BCD碼: 一個字節(jié)中僅容納1個BCD碼,其范圍為:00H~09H。BCD碼一位十進制數(shù)用4位二進制編碼來表示:二進制編碼的十進制數(shù)(BCD:BinaryCodedDecimal)

常用的是BCD碼是8421BCD碼,它用4位二進制編碼中的0000~1001來表示“0”~“9”這10個數(shù)碼。

8086支持組合BCD碼和非組合BCD碼的調(diào)整運算。真值

8(1位十進制)64(2位十進制)

二進制編碼

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影響AF,CF,PF,SF和ZF,但OF位不確定DAS影響AF,CF,PF,SF和ZF,但OF位不確定調(diào)整方法:如果AL低4位>9或AF=1,則AL寄存器的內(nèi)容加06H,且將AF置1如果AL高4位>9,或CF=1,則AL寄存器內(nèi)容加60H,且將CF置1組合BCD碼的加減運算實現(xiàn)組合BCD碼加法:68+28=96

moval,68h ;al=68h,組合BCD碼表示真值68movbl,28h ;bl=28h,組合BCD碼表示真值28addal,bl ;二進制加法:al=68h+28h=90hdaa ;十進制調(diào)整:al=96h

實現(xiàn)壓縮BCD碼減法:68-28=40moval,68h ;al=68h,組合BCD碼表示真值68movbl,28h ;bl=28h,組合BCD碼表示真值28subal,bl ;二進制減法:al=68h-28h=40hdas ;十進制調(diào)整:al=40h舉例:2個8字節(jié)長組合BCD碼相加MOVSI,1000HMOVDI,2000HMOVCX,8CLC;清除CFLOOP1:MOVAL,[SI]ADCAL,[DI]DAAMOV[DI],ALINCSIINCDIDECCXJNZLOOP1總結(jié)四則運算是計算機經(jīng)常進行的一種操作。算術(shù)運算指令也是經(jīng)常使用的一類指令。這一節(jié)要重點掌握:

ADD/ADCSUB/SBBINC/DECCMP8086除直接支持二進制數(shù)的算術(shù)運算;還提供對BCD碼運算的調(diào)整指令,實現(xiàn)了間接的十進制算術(shù)運算操作。表8086支持的4種數(shù)據(jù)類型的算術(shù)運算3.3.3邏輯運算指令

以二進制位為基本單位進行數(shù)據(jù)的操作

1、邏輯運算: AND

OR

XOR

NOT

TEST2、移位: SHL

SHR

SAR3、循環(huán)移位:ROL

ROR

RCL

RCR常用指令,應(yīng)該特別熟悉;同時,注意這些指令對標(biāo)志位的影響。1、邏輯運算指令TEST與AND指令執(zhí)行同樣的操作,但不改變原操作數(shù)的原始值,也不會送操作結(jié)果,只是根據(jù)結(jié)果設(shè)置狀態(tài)標(biāo)志。TESR指令一般用來檢測指令位是1還是0。NOT指令并不影響標(biāo)志所有其他邏輯指令使CF和OF清零,AF不一定,并根據(jù)一般規(guī)則設(shè)置SF,ZF和PF位。邏輯運算指令的功能:邏輯指令主要用于根據(jù)源操作數(shù)中數(shù)據(jù)位的組合格式,有選擇的使目的操作數(shù)中某些位改變、清零或?qū)λM行測試。TEST指令后面可能跟一條JNZ或JZ的條件轉(zhuǎn)移指令,從而根據(jù)ZF的結(jié)果判定是否轉(zhuǎn)移。邏輯與運算:與1相“與”結(jié)果不變,與0相“與”結(jié)果為0;結(jié)果送目的操作數(shù)。

ANDDST,SRC;(DST)←(DST)∧(SRC)AND指令設(shè)置CF=OF=0,根據(jù)結(jié)果設(shè)置SF、ZF和PF狀態(tài),而對AF未定義。屏蔽作用——對指定位置0①邏輯與指令A(yù)ND②邏輯或指令OR邏輯或運算:與0相“或”結(jié)果不變,與1相“或”結(jié)果為1;結(jié)果送目的操作數(shù)。

ORDST,SRC;(DST)←(DST)∨(SRC)指令設(shè)置CF=OF=0,根據(jù)結(jié)果設(shè)置SF、ZF和PF狀態(tài),而對AF未定義。對指定位置1③邏輯異或指令XOR邏輯異或運算:與0相“異或”結(jié)果不變,與1相“異或”的結(jié)果取反。結(jié)果送目的操作數(shù)。

XORDST,SRC;(DST)←(DST)≮(SRC)指令設(shè)置CF=OF=0,根據(jù)結(jié)果設(shè)置SF、ZF和PF狀態(tài),而對AF未定義。對指定位取反例:XORBL,00001001B;將BL中D3和D0位求反,其他位不變比較三條對(AX)清0的指令:XORAX,AX;清CF,2個字節(jié),3個T(時鐘周期)SUBAX,AX;清CF,2個字節(jié),3個TMOVAX,0;不影響標(biāo)志位,3個字節(jié),4個T④邏輯非指令NOT邏輯非運算:按位取反。原來是“0”的位變?yōu)椤?”;原來是“1”的位變?yōu)椤?”。

NOTDST;(DST)中各位取反單操作數(shù)指令不影響標(biāo)志位易與NEG指令混淆例:NOTBL;11110110B

將BL所有位取反

邏輯運算moval,45handal,31h;邏輯與al=01hmoval,45horal,31h;邏輯或al=75hmoval,45hxoral,31h;邏輯異或al=74hmoval,45hnotal;邏輯非al=bah45h0100010131h00110001⑤測試某些位為0或1TEST

testal,01h

;測試AL的最低位D0

jnzthere

;標(biāo)志ZF=0,即D0=1

;則程序轉(zhuǎn)移到there

...

;否則ZF=1,即D0=0,順序執(zhí)行

there:

...TEST指令通常用于檢測一些條件是否滿足,但又不希望改變原操作數(shù)的情況。這條指令之后,一般都是條件轉(zhuǎn)移指令,目的是利用測試條件轉(zhuǎn)向不同的程序段。TEST指令舉例:對邏輯運算指令的說明:1、對應(yīng)位進行相應(yīng)的邏輯運算2、AND指令一般用于將指令位清03、OR指令一般用于將指定位置14、XOR指令一般用于將某個寄存器清05、TEST指令一般用于測試寄存器中的指令位是0還是1,在TEST指令后常跟一條條件轉(zhuǎn)移指令。指令應(yīng)用舉例例1:將英文小寫字母ASCII轉(zhuǎn)換成大寫大寫英文字母ASCII為:‘A’~’Z’41H~5AH小寫英文字母ASCII為:‘a(chǎn)’~’z’61H~7AH……MOVAL,‘a(chǎn)’ANDAL,0DFH;(AL)=41H……例2:判斷A單元中數(shù)據(jù)的奇偶性假設(shè):(A)=0AEHMOVAL,A;(AL)=0AEHTESTAL,01HJZEVEN;結(jié)果=0為偶數(shù)轉(zhuǎn)EVEN奇數(shù)處理……EVEN:偶數(shù)處理檢測(AL)的最低位是否為0,若為0轉(zhuǎn)EVEN例3:假設(shè)AL中存放著一個負(fù)數(shù)的原碼,編程求其補碼①反嗎+1②從末位開始找第一個非0位,按位取反,符號位不變MOVAL,81H原碼:10000001補碼:11111111方法1:NOTALORAL,80HADDAL,1方法2:ANDAL,7FHNOTALADDAL,1方法3:XORAL,7FHADDAL,1方法4:NEGALORAL,80H方法5:ANDAL,7FHNEGAL

3.3.4移位指令

移位指令將操作數(shù)移動一位或多位,分成非循環(huán)移位和循環(huán)移位,分別具有左移或右移操作:

(2)循環(huán)移位指令ROL(RotateLeft)RCL(RotatethoughCFLeft)ROR(RotateRight)RCR(RotatethoughCFRight)

(1)非循環(huán)移位指令SAL(ShiftArithmeticLeft)SHL(ShiftLogicLeft)SAR(ShiftArithmeticRight)SHR(ShiftLogicLeft)(1)非循環(huán)移位指令SAL:算術(shù)左移,LSB補0,MSB進CFSAR:算術(shù)右移,LSB進CF,MSB不變SHL:邏輯左移,LSB補0,MSB進CFSHR:邏輯右移,LSB進CF,MSB補0

(1)非循環(huán)移位指令指令格式:SHLDST,1SHLDST,CLSALDST,1SALDST,CLSHRDST,1SHRDST,CLSARDST,1SARDST,CL移位次數(shù)若是1次,可以直接出現(xiàn)在指令中,如果移位次數(shù)大于1次,則由CL寄存器間接給出。(1)非循環(huán)移位指令例:SALDX,1MOVCL,4SALAX,CLSALAL,CLSALAL,3SALAL,CL(1)非循環(huán)移位指令注意:①操作數(shù)可以是寄存器或內(nèi)存單元中的8位或16位操作數(shù);②邏輯移位指令把操作數(shù)看成是無符號數(shù)SHLSHR③算術(shù)移位指令把操作數(shù)看成有符號數(shù)SALSAR④SAL和SHL操作相同,以0填充最低位⑤SAR和SHR操作不同,SAR最高位保持不變(符號位),SHR以0填充最高位⑥對于移位指令,只有移動次數(shù)是1時

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論