版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
微型計(jì)算機(jī)原理及應(yīng)用第3章微型計(jì)算機(jī)指令系統(tǒng)3.18086指令及尋址方式3.28086指令系統(tǒng)3.3從8086到80x86指令系統(tǒng)的變化3.4匯編指令EMU8086仿真軟件及調(diào)試示例3.18086指令及尋址方式3.1.1指令及指令系統(tǒng)計(jì)算機(jī)處理的各種問題,都必須轉(zhuǎn)換為計(jì)算機(jī)能夠識(shí)別和執(zhí)行的操作命令,將這些命令用計(jì)算機(jī)與程序設(shè)計(jì)員都能識(shí)別的信息表示出來,就稱其為指令。1.機(jī)器指令和匯編指令在計(jì)算機(jī)系統(tǒng)中,指令一般有機(jī)器指令和匯編指令兩種形式。
(1)機(jī)器指令機(jī)器指令是以二進(jìn)制代碼的形式表示的,也稱目標(biāo)代碼。
機(jī)器指令在設(shè)計(jì)CPU時(shí)由其硬件電路根據(jù)輸入邏輯電平(高電平為“1”,低電平為“0”)所實(shí)現(xiàn)的功能定義。CPU能夠直接執(zhí)行機(jī)器指令,執(zhí)行速度最快。
但是,機(jī)器指令在使用時(shí)非常煩瑣、費(fèi)時(shí),且不易閱讀和記憶。
(2)匯編指令匯編指令是在機(jī)器指令的基礎(chǔ)上,用英文單詞或英文單詞縮寫及數(shù)字等符號(hào)表示的機(jī)器指令。匯編指令實(shí)際上是符號(hào)化的機(jī)器指令,一條匯編指令必有一條機(jī)器指令與之對(duì)應(yīng)。
通過匯編指令學(xué)習(xí)指令系統(tǒng)既方便又實(shí)用。
用助記符號(hào)表示的匯編指令,CPU是不能直接識(shí)別和執(zhí)行的,匯編指令必須經(jīng)匯編程序的匯編(翻譯),轉(zhuǎn)換為機(jī)器指令,CPU才能執(zhí)行。2.指令系統(tǒng)CPU的主要功能必須通過它的指令系統(tǒng)來實(shí)現(xiàn)。每條指令的功能與CPU的一種基本操作相對(duì)應(yīng),計(jì)算機(jī)所做的全部工作都必須轉(zhuǎn)換為與之對(duì)應(yīng)的指令序列交由CPU執(zhí)行。
不同系列的CPU有不同的指令系統(tǒng),但是指令的基本格式、操作數(shù)的尋址及指令功能具有共同的特征。必須認(rèn)識(shí)到,指令系統(tǒng)中的命令是離CPU最近的命令,也稱為低層命令或低層軟件,采用任何計(jì)算機(jī)語言編寫的任何程序都必須轉(zhuǎn)換為指令系統(tǒng)中相應(yīng)機(jī)器指令代碼的有序集合,CPU才能執(zhí)行。3.指令格式(1)機(jī)器指令格式機(jī)器指令一般由操作碼(指令助記符)和操作數(shù)兩部分組成,其基本格式如圖3-1所示。操作碼用來指示指令所要完成的操作,操作數(shù)指示指令執(zhí)行過程中所需要的數(shù)據(jù)。只有一個(gè)操作數(shù)的指令稱為單操作數(shù)指令。有兩個(gè)操作數(shù)的指令,一個(gè)稱為源操作數(shù),另一個(gè)稱為目的操作數(shù)。而有些指令可以沒有操作數(shù)。
(2)匯編指令格式匯編指令格式由以下幾個(gè)部分組成:[標(biāo)號(hào):]操作碼[目的操作數(shù)][,源操作數(shù)][;注釋]例如:LOOP:MOVAL,20H;A←20H其中,[]中的項(xiàng)表示可選項(xiàng)。標(biāo)號(hào):又稱指令地址符號(hào),一般由1~6個(gè)字符組成。
操作碼:由助記符表示的指令要完成的操作功能,任何指令都必須具有操作碼。操作數(shù):指參加操作的數(shù)據(jù)或數(shù)據(jù)的地址。注釋:為該條指令所做的說明,以便于閱讀,注釋部分不產(chǎn)生目標(biāo)代碼。操作碼是指令的核心,不可缺少。其他幾項(xiàng)(方括號(hào)內(nèi)的)根據(jù)指令、程序的要求不同為可選項(xiàng)。在指令系統(tǒng)中,功能的指令不同,操作數(shù)的個(gè)數(shù)也不同。指令可以分為雙操作數(shù)指令、單操作數(shù)指令和無操作數(shù)指令。傳送類指令大多有兩個(gè)操作數(shù),寫在前面的稱為目的操作數(shù)(表示操作結(jié)果存放的寄存器或存儲(chǔ)器單元地址),寫在后面的稱為源操作數(shù)(指出操作數(shù)的來源)。例如:MOVAX,1234H;雙操作數(shù)傳送指令I(lǐng)NCSI;單操作數(shù)加1指令HLT;無操作數(shù)暫停指令3.1.2指令中的操作數(shù)在8086指令系統(tǒng)中,操作數(shù)分為兩大類:數(shù)據(jù)操作數(shù)和轉(zhuǎn)移地址操作數(shù)。1.?dāng)?shù)據(jù)操作數(shù)數(shù)據(jù)操作數(shù)是計(jì)算機(jī)需要處理的真實(shí)數(shù)據(jù)。
數(shù)據(jù)操作數(shù)可分為以下4種。(1)立即數(shù)操作數(shù)立即數(shù)操作數(shù)(簡(jiǎn)稱立即數(shù))是指指令中要處理的數(shù)據(jù)就在指令中(一般為多字節(jié)指令),其存放位置在指令操作碼的下一個(gè)存儲(chǔ)單元,CPU對(duì)立即數(shù)的處理速度最快。(2)寄存器操作數(shù)寄存器操作數(shù)是指指令中要處理的中間數(shù)據(jù)臨時(shí)存放在CPU內(nèi)部的寄存器中,這樣可以提高計(jì)算機(jī)處理數(shù)據(jù)的速度。(3)存儲(chǔ)器操作數(shù)存儲(chǔ)器操作數(shù)是指指令中要處理的數(shù)據(jù)存放在指定的存儲(chǔ)器中。(4)輸入、輸出操作數(shù)輸入操作數(shù)是指輸入指令中由指定輸入設(shè)備端口提供的數(shù)據(jù),輸出操作數(shù)是指輸出指令中傳送給輸出設(shè)備端口的數(shù)據(jù)。2.轉(zhuǎn)移地址操作數(shù)轉(zhuǎn)移地址操作數(shù)是轉(zhuǎn)移指令操作的數(shù)據(jù),該數(shù)據(jù)用來表示地址。轉(zhuǎn)移地址操作數(shù)決定了CPU執(zhí)行下一條指令要轉(zhuǎn)移的地址或相對(duì)地址。3.1.38086數(shù)據(jù)尋址方式尋址方式是指指令中尋找或獲得操作數(shù)的方式,可由不同的尋址方式指定需要傳送或運(yùn)算的操作數(shù)或操作數(shù)的地址。尋址方式是指令系統(tǒng)中最重要的內(nèi)容之一,尋址方式越多樣,計(jì)算機(jī)處理問題的功能越強(qiáng),靈活性越大。8086數(shù)據(jù)操作數(shù)的尋址方式有以下5種類型。1.立即尋址立即尋址是指操作數(shù)直接存放在指令中,即操作數(shù)就存放在操作碼之后的存儲(chǔ)單元中。這種操作數(shù)稱為立即數(shù)。立即數(shù)可以是8位或16位,對(duì)于16位立即數(shù),低字節(jié)存放在低地址單元,高字節(jié)存放在高地址單元,即低位在前,高位在后。80386以上的CPU,其立即數(shù)可為32位。立即尋址方式常用于程序中需要寄存器處理的數(shù)據(jù),可以給寄存器賦初值。立即尋址只能作源操作數(shù),不能作目的操作數(shù)。
①8位立即數(shù)只能傳送給8位寄存器和字節(jié)存儲(chǔ)單元。例如:MOVAL,23H;執(zhí)行后,(AL)=23H,立即數(shù)23H作為源操作數(shù)賦給寄存器ALMOVBH,0FFH;執(zhí)行后,(BH)=0FFH,立即數(shù)0FFH作為源操作數(shù)賦給寄存器BH②16位立即數(shù)只能傳送給16位寄存器和字存儲(chǔ)單元。例如:MOVAX,1234H;執(zhí)行后,立即數(shù)1234H作為源操作數(shù)賦給 ;寄存器AX
(AH)=12H,(AL)=34H2.寄存器尋址寄存器尋址是指操作數(shù)就在8位或16位通用寄存器中。
例如:MOVAL,CL;即AL←(CL),即8位寄存器CL的內(nèi)容為源操作數(shù)傳送給目的寄存器AL。MOVAX,BX;AX←(BX),即16位寄存器BX的內(nèi)容為源操作數(shù)傳送給目的寄存器AX,立即尋址方式和寄存器尋址方式尋找操作數(shù)的操作均在CPU內(nèi)進(jìn)行,因此,執(zhí)行速度較快。3.存儲(chǔ)器尋址存儲(chǔ)器尋址是指操作數(shù)就在存儲(chǔ)器數(shù)據(jù)區(qū)中。當(dāng)CPU需要訪問某一存儲(chǔ)單元時(shí),應(yīng)首先確定段地址,然后根據(jù)指令中提供的偏移量形成物理地址,才能對(duì)它進(jìn)行讀/寫操作。偏移量可以直接在指令中給出,也可以間接通過其他方式經(jīng)匯編程序?qū)ζ鋮R編(計(jì)算)實(shí)現(xiàn)。通常,經(jīng)過計(jì)算得到的段內(nèi)偏移量稱為有效地址(EffectiveAddress,EA)。8086的存儲(chǔ)器尋址方式如下。(1)直接尋址直接尋址是指存儲(chǔ)器操作數(shù)的有效地址在指令中,通過指令中提供的地址尋找操作數(shù)。操作數(shù)的有效地址以8位、16位偏移量的形式作為指令的一部分,與操作碼一起存放在代碼段中。直接尋址時(shí),操作數(shù)的段基址默認(rèn)為DS(即數(shù)據(jù)段)。該操作數(shù)在存儲(chǔ)器中的物理地址為操作數(shù)所在段的數(shù)據(jù)段寄存器DS的內(nèi)容左移4位再加上有效地址EA。
物理地址=(DS)×10H+EA直接尋址所確定的物理地址可以是字節(jié)數(shù)據(jù)單元,也可以是字?jǐn)?shù)據(jù)單元,可根據(jù)目標(biāo)寄存器的位數(shù)確定。例:MOVAL,[1234H];1234H為源操作數(shù)字節(jié)存儲(chǔ)單元的偏移量該指令中,為了與立即數(shù)區(qū)別,地址碼前后加方括號(hào)。由于目標(biāo)寄存器AL為8位數(shù)據(jù),因此,源操作數(shù)也必須為8位數(shù)據(jù)。假設(shè)數(shù)據(jù)段寄存器DS的內(nèi)容為2000H,則源操作數(shù)的物理地址為2000H×10H+1234H=21234H,執(zhí)行過程如圖3-3所示。執(zhí)行結(jié)果為:(AL)=68H。例:直接尋址字單元。MOVAX,[1234H];1234H為源操作數(shù)字存儲(chǔ)單元的偏移量該指令中,由于目標(biāo)寄存器AX為16位數(shù)據(jù),因此,源操作數(shù)也必須為16位數(shù)據(jù)。假設(shè)數(shù)據(jù)段寄存器DS的內(nèi)容為2000H,則源操作數(shù)的物理地址為2000H×10H+1234H=21234H,源操作數(shù)存放在21234H和21235H兩個(gè)連續(xù)存儲(chǔ)單元中(低位在前,高位在后),執(zhí)行過程如圖3-4所示。執(zhí)行結(jié)果為:(AX)=9F68H。若要對(duì)代碼段、堆棧段或附加段中的數(shù)據(jù)進(jìn)行直接尋址,應(yīng)在指令中增加段跨越前綴。例如,段跨越直接尋址。MOVAX,ES:[2000H];把附加段段內(nèi)地址為2000H單元的內(nèi)容傳送給AX該操作數(shù)在存儲(chǔ)器中的物理地址為附加段寄存器的內(nèi)容左移4位再加上有效地址EA。即物理地址為(ES)×10H+EA。假設(shè)附加段寄存器的內(nèi)容為3000H,則源操作數(shù)的物理地址為:3000H×10H+2000H=32000H在匯編語言指令中,直接尋址的操作數(shù)可以用偽指令定義的變量形式給出,該變量稱為符號(hào)地址。例如,符號(hào)地址直接尋址。DATADB36H;偽指令定義存儲(chǔ)器字節(jié)變量DATA單元內(nèi)容為36HMOVAL,DATA;表示把變量名為DATA的存儲(chǔ)單元數(shù)據(jù)36H送到寄存器AL或MOVAL,[DATA];與上一條指令功能完全等價(jià)(2)寄存器間接尋址寄存器間接尋址是指存儲(chǔ)器操作數(shù)的有效地址在寄存器中。在寄存器間接尋址方式中,使用基址寄存器BP進(jìn)行間接尋址時(shí),操作數(shù)的段地址為SS(即堆棧段)。
使用其他寄存器進(jìn)行間接尋址時(shí),操作數(shù)的段地址一律默認(rèn)為DS(即數(shù)據(jù)段)。所在的段內(nèi)有效地址必須存放在16位寄存器中,這些寄存器可以是:
基址寄存器BX或BP;
變址寄存器SI或DI;
一個(gè)基址寄存器和一個(gè)變址寄存器中的內(nèi)容之和。若單獨(dú)使用基址寄存器或變址寄存器,則分別稱為基址寄存器尋址或變址寄存器尋址;若同時(shí)使用基址寄存器和變址寄存器,則稱為基址加變址寄存器尋址。寄存器間接尋址有以下形式。①基址寄存器尋址。例:MOVAX,[BX];基址尋址,將BX的內(nèi)容作為地址的存儲(chǔ)單元數(shù)據(jù)送入AX,即AX←((BX))該指令中,由于目標(biāo)寄存器AX為16位數(shù)據(jù),因此,源操作數(shù)也必須為16位數(shù)據(jù)。假設(shè)數(shù)據(jù)段寄存器DS的內(nèi)容為2000H,BX的內(nèi)容為1000H,則源操作數(shù)的物理地址為: 2000H×10H+1000H=21000H 源操作數(shù)存放在21000H和21001H兩個(gè)連續(xù)存儲(chǔ)單元中。執(zhí)行結(jié)果為:(AX)=7856H。例:MOVAX,[BP];基址尋址,將BP的內(nèi)容作為地址的存儲(chǔ)單元數(shù)據(jù)送入AX,即AX←((BP))該指令中,由于目標(biāo)寄存器AX為16位數(shù)據(jù),因此,源操作數(shù)也必須為16位數(shù)據(jù)?;芳拇嫫鰾P間接尋址時(shí)操作數(shù)所在的段為堆棧段SS,假設(shè)堆棧段寄存器SS的內(nèi)容為3000H,BP的內(nèi)容為2000H,則源操作數(shù)的物理地址為3000H×10H+2000H=32000H,源操作數(shù)存放在32000H和32001H。兩個(gè)連續(xù)存儲(chǔ)單元中。執(zhí)行結(jié)果為:(AX)=7F2AH②變址寄存器尋址。例如:MOVAX,[SI];變址尋址,將SI的內(nèi)容作為地址的存儲(chǔ)單元數(shù)據(jù)送入AX,即AX←((SI))MOVAX,[DI];變址尋址,將DI的內(nèi)容作為地址的存儲(chǔ)單元數(shù)據(jù)送入AX,即AX←((DI))該指令中,假設(shè)數(shù)據(jù)段寄存器DS的內(nèi)容為2000H,DI的內(nèi)容為2000H,則源操作數(shù)的物理地址為:2000H×10H+2000H=22000H源操作數(shù)存放在22000H和22001H兩個(gè)連續(xù)的存儲(chǔ)單元中。③基址加變址寄存器尋址。例如:MOVAX,[BX][SI];基址加變址尋址,AX←((BX)+(SI))或MOVAX,[BX+SI]以上兩條指令完全等價(jià)。假設(shè)數(shù)據(jù)段寄存器DS的內(nèi)容為2000H,BX的內(nèi)容為1000H,SI的內(nèi)容為200H,則源操作數(shù)的物理地址為:2000H×10H+(1000H+200H)=21200H源操作數(shù)存放在21200H和21201H兩個(gè)連續(xù)的存儲(chǔ)單元中。在使用寄存器間接尋址時(shí),必須注意以下問題。①基址加變址的尋址方式中,只能是基址寄存器和變址寄存器相加,而不能是兩個(gè)基址寄存器相加或兩個(gè)變址寄存器相加。例如,指令MOVAX,[SI][DI]是錯(cuò)誤的。當(dāng)然,對(duì)于80386以上32位CPU的尋址方式,由于基址寄存器和變址寄存器已經(jīng)不局限于BX和BP,因此,下面指令所示的尋址方式是合法的。MOVDX,[EBX+EBP]②若以BP、SP為基址進(jìn)行間接尋址,默認(rèn)(約定)的段基址在SS中;而采用其他通用寄存器作為基址進(jìn)行間接尋址時(shí),默認(rèn)的段基址在DS中。③可以采用加段跨越前綴的方法對(duì)其他段進(jìn)行尋址?!纠?-1】執(zhí)行MOVAX,[BX]后,AX的內(nèi)容是什么?設(shè)(DS)=2000H,(BX)=1000H,(21000H)=3412H,則源操作數(shù)的物理地址為:(DS)×10H+(BX)=2000H×10H+1000H=20000H+1000H=21000H(字地址)指令執(zhí)行后,(AX)=3412H。(3)寄存器相對(duì)尋址寄存器相對(duì)尋址是指存儲(chǔ)器操作數(shù)的有效地址為寄存器的內(nèi)容與偏移量之和。在這種尋址方式中,存儲(chǔ)器操作數(shù)的有效地址可以是基址寄存器或變址寄存器的內(nèi)容與指令中指定的偏移量之和,分別稱為基址相對(duì)尋址或變址相對(duì)尋址;也可以是基址寄存器加變址寄存器的相對(duì)尋址。例如:MOVAX,[BX+64H];基址相對(duì)尋址,AX←((BX)+64)或MOVAX,64H[BX]以上兩條指令完全等價(jià)。該指令中,假設(shè)數(shù)據(jù)段寄存器DS的內(nèi)容為2000H,BX的內(nèi)容為1000H,偏移量為64H,則源操作數(shù)的物理地址為2000H×10H+1000H+64H=21064H,操作數(shù)存放在21064H和21065H兩個(gè)連續(xù)的存儲(chǔ)單元中。執(zhí)行結(jié)果為:(AX)=7856H例如:MOVAX,[SI+16H];變址相對(duì)尋址或MOVAX,16H[SI]以上兩條指令完全等價(jià)。例如:MOVAX,[BX+SI+16H];基址加變址的相對(duì)尋址或MOVAX,16H[BX][SI]以上兩條指令完全等價(jià)。例如:MOVAX,[BP+SI];基址加變址尋址【例3-2】執(zhí)行MOVAL,80H[BP]后,AL的內(nèi)容是什么?設(shè)(BP)=2040H,(SS)=2000H,(220C0H)=56H,則源操作數(shù)的物理地址為:(SS)×10H+(BP)+80H=2000H×10H+2040H+80H=20000H+20C0H=220C0H指令執(zhí)行后,
(AL)=56H。4.I/O端口尋址計(jì)算機(jī)在與外部設(shè)備交換信息時(shí),需要通過I/O指令訪問外部設(shè)備。8086對(duì)外部設(shè)備采用獨(dú)立編址I/O端口,每個(gè)端口可以是8位字節(jié)數(shù)據(jù)單元,也可以是16位字?jǐn)?shù)據(jù)單元,并設(shè)有專用的可以訪問I/O端口的指令,其最大訪問空間為216B=64KB端口或32×1024個(gè)字端口。在尋址外部設(shè)備端口時(shí),8086提供了以下兩種尋址方式。(1)直接端口尋址在I/O指令中以8位立即數(shù)的形式直接給出端口地址。直接端口尋址簡(jiǎn)單、方便,可訪問的端口地址為00H~0FFH(共28=256個(gè))。例如:INAL,20H;讀取端口地址20H單元的字節(jié)數(shù)據(jù)到寄存器AL中OUT21H,AL;將寄存器AL的內(nèi)容輸出到端口地址為21H字節(jié)單元中;20H、21H在I/O指令中是端口地址,不是立即數(shù)(2)寄存器間接端口尋址當(dāng)端口地址大于255時(shí),需要使用16位數(shù)據(jù)表示端口地址,則必須用寄存器(DX)間接尋址方式,即將16位地址數(shù)據(jù)存放在寄存器DX中,通過DX間接訪問外部設(shè)備端口。例如:MOVDX,200H;將立即數(shù)(端口地址)200H傳送給寄存器DXINAL,DX;讀取端口地址為200H單元的字節(jié)數(shù)據(jù)到寄存器AL中MOVDX,300H;將立即數(shù)(端口地址)300H傳送給寄存器DXOUTDX,AL;將寄存器AL的內(nèi)容輸出到端口地址為300H的字節(jié)單元中5.隱含尋址在8086中,有些指令形式?jīng)]有給出操作數(shù)的任何說明,但CPU可以根據(jù)操作碼確定要操作的數(shù)據(jù),這些指令采用的尋址方式稱為隱含尋址。例如,在后面要介紹的8086指令系統(tǒng)中的指令:AAA;十進(jìn)制調(diào)整指令隱含對(duì)AL的操作XLAT;換碼指令隱含對(duì)AL、BX的操作MOVSB;字節(jié)串操作指令隱含對(duì)SI/DI/CX的操作LOOP標(biāo)號(hào);隱含對(duì)寄存器CX的操作3.1.48086轉(zhuǎn)移地址尋址方式8086轉(zhuǎn)移地址尋址方式有以下4種。1.段內(nèi)直接尋址段內(nèi)直接尋址是由轉(zhuǎn)移指令(機(jī)器指令)直接給出一個(gè)補(bǔ)碼表示的8位或16位偏移量,要轉(zhuǎn)移的地址(即下一條要執(zhí)行的指令地址)為當(dāng)前指令指針寄存器IP的內(nèi)容加上偏移量(即相對(duì)于IP的地址變化),因此又稱相對(duì)尋址。指令所在段仍為代碼段CS。當(dāng)偏移量為8位數(shù)據(jù)時(shí),其相對(duì)于當(dāng)前指令的跳轉(zhuǎn)范圍為128~127,稱為相對(duì)短轉(zhuǎn)移。在條件轉(zhuǎn)移指令中,必須使用此種尋址方式。當(dāng)偏移量為16位數(shù)據(jù)時(shí),其相對(duì)于當(dāng)前指令的跳轉(zhuǎn)范圍為32768~32767,稱為相對(duì)近轉(zhuǎn)移。在匯編指令中,轉(zhuǎn)移指令要轉(zhuǎn)移的地址通常是通過符號(hào)地址(標(biāo)號(hào))表示的,使用起來非常方便,程序員只需要確定采用相對(duì)近轉(zhuǎn)移還是相對(duì)短轉(zhuǎn)移,不需要計(jì)算偏移量(偏移量的計(jì)算由匯編程序完成)例如:JMPSHORTLOP1;相對(duì)短轉(zhuǎn)移符號(hào)地址LOP1為下一條要執(zhí)行指令的地址JMPLOP5;符號(hào)地址LOP5為下一條要執(zhí)行指令的地址2.段內(nèi)間接尋址段內(nèi)間接尋址是指轉(zhuǎn)移指令要轉(zhuǎn)移的16位地址存放在寄存器或存儲(chǔ)器中。指令執(zhí)行后,存放在寄存器或存儲(chǔ)器中的地址直接送入IP中。指令所在段仍為代碼段CS。例如:JMPBX;BX的16位數(shù)據(jù)作為轉(zhuǎn)移有效地址3.段間直接尋址段間直接尋址是在轉(zhuǎn)移指令中直接給出要轉(zhuǎn)移的16位段基址和16位段內(nèi)偏移地址(可稱為32位地址)。指令執(zhí)行后,指令提供的段基址和段內(nèi)偏移地址分別送入CS與IP,即下一條要執(zhí)行指令的地址為CS:IP。4.段間間接轉(zhuǎn)移段間間接轉(zhuǎn)移是指由轉(zhuǎn)移指令提供的32位地址必須存放在存儲(chǔ)器中連續(xù)的4個(gè)字節(jié)單元中,兩個(gè)低地址單元的內(nèi)容作為偏移量送入IP,兩個(gè)高地址單元作為段基址送入CS,即下一條要執(zhí)行指令的地址為CS:IP。綜上所述,尋址方式是指令系統(tǒng)的重要組成部分,是指令中尋找數(shù)據(jù)的表現(xiàn)方式,不同的尋址方式所尋址的存儲(chǔ)空間是不同的,其尋址時(shí)間也不相同。
正確地使用尋址方式不僅取決于尋址方式的形式,而且取決于尋址方式所對(duì)應(yīng)的存儲(chǔ)空間,從而有利于以最快的執(zhí)行速度完成指令的功能3.28086指令系統(tǒng)8086指令系統(tǒng)有100多種指令助記符,它們與尋址方式結(jié)合,構(gòu)成具有不同功能的指令。這些指令按功能可分為6種類型:數(shù)據(jù)傳送指令、算術(shù)運(yùn)算指令、邏輯運(yùn)算及移位指令、串操作指令、控制轉(zhuǎn)移指令、處理器控制指令等。在學(xué)習(xí)匯編指令時(shí),要注重以下幾方面內(nèi)容:①指令的功能及操作數(shù)的個(gè)數(shù)、類型。②操作數(shù)的尋址方式。③指令對(duì)標(biāo)志位的影響或標(biāo)志位對(duì)指令的影響。④指令的執(zhí)行周期,對(duì)可完成同樣功能的指令要選用執(zhí)行周期短的指令3.2.1數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令用于寄存器、存儲(chǔ)單元或I/O端口之間傳送數(shù)據(jù)或地址。(1)MOV指令指令格式:MOVDST,SRC
指令功能:DST←(SRC)該指令為雙操作數(shù)指令,其中MOV為指令助記符;DST表示某一特定尋址方式所確定的目的操作數(shù)(下同),如寄存器、存儲(chǔ)單元等;SRC表示某一特定尋址方式所確定的源操作數(shù)(下同)。MOV指令功能是把源操作數(shù)傳送到目的操作數(shù),指令執(zhí)行后,源操作數(shù)的內(nèi)容不變,目的操作數(shù)原來的內(nèi)容被源操作數(shù)的內(nèi)容覆蓋。MOV指令用來在以下限定的范圍內(nèi)傳送數(shù)據(jù)。①在寄存器和寄存器之間相互傳送字或字節(jié)數(shù)據(jù)。②在寄存器和存儲(chǔ)器之間相互傳送字或字節(jié)數(shù)據(jù)。③將一個(gè)立即數(shù)傳送到寄存器或存儲(chǔ)單元中。例如:MOVAL,05H;將8位立即數(shù)送入寄存器ALMOVDX,1234H;將16位立即數(shù)送入寄存器DXMOVDATA1,20H;將立即數(shù)送入符號(hào)地址(變量)DATA1存儲(chǔ)器字節(jié)單元MOVAL,BL;AL←(BL)即將8位寄存器BL的字節(jié)內(nèi)容傳送給寄存器ALMOVBX,AX;將16位寄存器AX的字內(nèi)容傳送給寄存器BXMOVDS,AX;將AX內(nèi)容傳送給數(shù)據(jù)段寄存器DSMOVCL,[BX+80H];將存儲(chǔ)器操作數(shù)傳送給寄存器CLMOV[BP+5AH],AL;將源操作數(shù)寄存器AL內(nèi)容傳送給存儲(chǔ)器在使用MOV指令時(shí)應(yīng)注意以下幾點(diǎn)。①兩個(gè)段寄存器之間不能直接傳送數(shù)據(jù)。②兩個(gè)存儲(chǔ)單元之間不能直接傳送數(shù)據(jù)。③立即數(shù)和代碼段寄存器CS不能作為目的操作數(shù),立即數(shù)也不能直接傳送到段寄存器。④源操作數(shù)和目的操作數(shù)的類型及長(zhǎng)度必須一致,數(shù)據(jù)在有效范圍內(nèi)(無溢出)。例如,下列指令是非法的。MOVDS,CS;段寄存器之間不能直接傳送數(shù)據(jù)MOV[BP],[DI];兩個(gè)存儲(chǔ)單元之間不能直接傳送數(shù)據(jù)MOV2000H,AX;立即數(shù)不能作為目的操作數(shù)MOVCS,AX;代碼段寄存器CS不能作為目的操作數(shù)MOVDS,2000H;立即數(shù)也不能直接傳送到段寄存器MOVBL,28AH;源操作數(shù)和目的操作數(shù)的長(zhǎng)度不一致【例3-3】執(zhí)行下列指令段后,指出各寄存器和有關(guān)存儲(chǔ)單元的內(nèi)容。MOVAX,20A0H;AX←20A0H(AL←0A0H,AH←20H)MOVDS,AX;DS←20A0HMOVBX,1000H;BX←1000HMOVAL,12H;AL←12HMOV[BX],AL;(DS)×10H+(BX)←12HMOVDX,5678H;DX←5678HMOV[BX+100H],AX;(DS)×10H+1000H+100H←2012H執(zhí)行完該指令段后:AX=2012H,DS=20A0H,BX=1000H,(21A00)=12H,DX=5678H,(21B00H)=12H,(21B01H)=20H。(2)XCHG指令指令格式:XCHGOPR1,OPR2該指令為雙操作數(shù)指令,其中XCHG為指令助記符,OPR1、OPR2分別表示操作數(shù)1和操作數(shù)2。XCHG指令的功能:在操作數(shù)OPR1和操作數(shù)OPR2之間交換數(shù)據(jù)。XCHG指令用來在以下限定的范圍內(nèi)交換數(shù)據(jù)。①必須有一個(gè)操作數(shù)在寄存器中。②寄存器和寄存器之間。③寄存器和存儲(chǔ)器之間。例如:XCHGAL,CL;字節(jié)交換XCHGBX,SI;字交換XCHGAX,[BX+SI];寄存器和存儲(chǔ)器之間交換數(shù)據(jù)在使用XCHG指令時(shí)應(yīng)注意以下方面。指令的操作數(shù)可以是寄存器或存儲(chǔ)單元,但不能是段寄存器或立即數(shù)。不能同時(shí)為兩個(gè)存儲(chǔ)器操作數(shù)(3)PUSH和POP指令PUSH和POP指令是8086進(jìn)行堆棧操作的指令。所謂堆棧,就是以“先進(jìn)后出”方式進(jìn)行數(shù)據(jù)操作的存儲(chǔ)器中某一地址連續(xù)的存儲(chǔ)塊。堆棧只有一個(gè)數(shù)據(jù)出入口,稱為棧頂。CPU內(nèi)部的堆棧指針寄存器SP始終指向棧頂存儲(chǔ)單元,SP可由指令設(shè)置。進(jìn)行堆棧操作時(shí),棧底單元的位置(即存儲(chǔ)單元的地址)是不變的;而棧頂位置隨數(shù)據(jù)入棧操作向低地址方向變化(即SP內(nèi)容遞減),隨出棧操作向高地址方向變化(即SP內(nèi)容遞增)。堆棧常用于程序在執(zhí)行過程中存儲(chǔ)需要保護(hù)的現(xiàn)場(chǎng)數(shù)據(jù)和子程序斷點(diǎn)。①PUSH指令:PUSH指令又稱壓棧指令。指令格式:PUSHSRCPUSH指令的功能:先將堆棧指針SP的內(nèi)容減2,再將源操作數(shù)SRC(即字)壓入SP所指向的堆棧棧頂存儲(chǔ)單元(低8位在前,高8位在后)。例如:PUSHAX;SP←(SP)-2,將AX內(nèi)容壓入堆棧,SP指向棧頂②POP指令:POP指令又稱出棧指令。指令格式:POPDSTPOP指令的功能:先將SP所指向的堆棧棧頂存儲(chǔ)單元的內(nèi)容(即字)“彈”至目的操作數(shù)DST,再將SP的內(nèi)容加2。例如:PUSHAX;(AX)最先入棧PUSHBXPUSHCX;保護(hù)現(xiàn)場(chǎng),最后入棧的棧頂元素是CX…POPCX;將棧頂元素最先彈出到CX,然后SP←(SP)+2POPBXPOPAX;恢復(fù)現(xiàn)場(chǎng),最先入棧的(AX)最后彈出到AX使用PUSH和POP指令時(shí)應(yīng)注意以下方面。
PUSH和POP指令只對(duì)16位操作數(shù)執(zhí)行進(jìn)棧和出棧操作。不允許立即數(shù)入棧,目的操作數(shù)DST不能為立即數(shù)和代碼段寄存器CS。
PUSH和POP指令不影響標(biāo)志位(4)XLAT指令XLAT指令又稱查表指令。指令格式:XLAT該指令的尋址方式是隱含尋址。XLAT指令的功能:把寄存器BX的內(nèi)容與累加器AL的內(nèi)容相加形成有效地址,將該有效地址存儲(chǔ)單元的內(nèi)容傳送到AL中。可表示為如下形式。有效地址:EA=(BX)+(AL)。指令功能:AL←((BX)+(AL))該指令可用于查表,也可用于換碼。表的首地址存在BX中,根據(jù)AL設(shè)置的偏移地址,可以將該有效地址單元的內(nèi)容傳送到AL中,從而達(dá)到將代碼轉(zhuǎn)換為另一種代碼的目的?!纠?-4】設(shè)(DS)=2000H,(BX)=1000H,(21001H)=31H,(21002H)=32H。指令段為:MOVAL,2HXLAT執(zhí)行指令后,AL的內(nèi)容是什么?在執(zhí)行XLAT時(shí),源操作數(shù)的物理地址為:(DS)×10H+(BX)+(AL)=2000H×10H+1000H+2H=20000H+1000H+2H=21002H
執(zhí)行指令后,(AL)=32H。(5)IN/OUT(輸入/輸出)指令在8086系統(tǒng)中,所有外部設(shè)備的I/O端口與CPU之間的數(shù)據(jù)傳送都是由IN和OUT指令來完成的。用IN/OUT指令對(duì)I/O端口進(jìn)行訪問時(shí),只能使用直接尋址或寄存器間接尋址。①IN(輸入指令)。指令格式:INAL,PORT;直接尋址,輸入字節(jié)操作INAX,PORT;直接尋址,輸入字操作INAL,DX;間接尋址,輸入字節(jié)操作INAX,DX;間接尋址,輸入字操作指令功能:將端口數(shù)據(jù)傳送給累加器AL或AX。指令功能:將端口數(shù)據(jù)傳送給累加器AL或AX。
當(dāng)端口地址小于28(即256)時(shí),可采用直接尋址方式。在指令中指定8位端口地址PORT;當(dāng)端口地址大于或等于256時(shí),必須采用間接尋址方式,16位端口地址應(yīng)先存入寄存器DX中,然后使用IN指令實(shí)現(xiàn)端口數(shù)據(jù)輸入操作。指令中必須用AL或AX接收數(shù)據(jù),若用AL接收數(shù)據(jù),則讀取外設(shè)端口的8位字節(jié)數(shù)據(jù);若用AX接收數(shù)據(jù),則讀取外設(shè)端口的16位字?jǐn)?shù)據(jù)。例如:INAX,18H;直接尋址,從地址為18H端口讀入一個(gè)字到AXMOVDX,12CH;把端口地址12CH傳送到DXINAL,DX;間接尋址,從地址為12CH端口讀入一個(gè)字節(jié)到AL②OUT(輸出指令)。指令格式:OUTPORT,AL;直接尋址,輸出字節(jié)操作OUTPORT,AX;直接尋址,輸出字操作OUTDX,AL;間接尋址,輸出字節(jié)操作OUTDX,AX;間接尋址,輸出字操作指令功能:將累加器AL或AX的內(nèi)容傳送至端口。該指令端口地址尋址方式的確定同IN指令,輸出的數(shù)據(jù)必須用AL或AX發(fā)送。若用AL發(fā)送數(shù)據(jù),則輸出到外設(shè)端口的為字節(jié)數(shù)據(jù);若用AX發(fā)送數(shù)據(jù),則輸出到外設(shè)端口的為字?jǐn)?shù)據(jù)。例如:OUT15H,AL;直接尋址,把AL的字節(jié)內(nèi)容輸出到端口地址為15H的單元中MOVDX,2000H;將端口地址送入DXOUTDX,AX;間接尋址,把AX的字內(nèi)容輸出到端口地址為2000H的字單元中(6)目標(biāo)地址傳送指令目標(biāo)地址傳送指令功能是將目標(biāo)地址傳送到指定的寄存器內(nèi)。該類指令有以下3條。①LEA指令。指令格式:LEADST,SRC指令功能:將源操作數(shù)SRC的有效地址傳送給目的操作數(shù)DST。源操作數(shù)必須是一個(gè)存儲(chǔ)器地址,目的操作數(shù)是任意一個(gè)16位通用寄存器。例如:MOVBX,2000HLEASI,[BX];(SI)=2000H【例3-5】設(shè)(DS)=2000H,(BX)=1000H,(21000H)=30H,(21001H)=31H。指出下列各指令的功能。MOVAX,[BX];AX←3130HLEAAX,[BX];AX←1000HMOVSI,OFFSETBUFFER;變量BUFFER的段內(nèi)地址→SI②LDS指令。指令格式:LDSDST,SRCLDS指令的功能:把源操作數(shù)指定的4個(gè)連續(xù)存儲(chǔ)單元中存放的32位地址指針傳送到兩個(gè)16位寄存器中,其中2個(gè)低位字節(jié)(地址偏移量)送入16位通用寄存器DST,而2個(gè)高位字節(jié)(段地址)送入數(shù)據(jù)段寄存器DS。例如:DATADD10A02000HLDSSI,DATA執(zhí)行上面指令后,(DS)=10A0H,(SI)=2000H。③LES指令。指令格式:LESDST,SRCLES指令的功能:該指令與LDS都是取32位地址指針指令,不同之處是該指令把源操作數(shù)指定的4個(gè)連續(xù)存儲(chǔ)單元中存放的32位地址指針的2個(gè)高位字節(jié)送入段寄存器ES中,而不是DS中。(7)標(biāo)志傳送指令標(biāo)志傳送指令是專門用于對(duì)標(biāo)志寄存器進(jìn)行操作的指令。8086指令系統(tǒng)提供了以下4條標(biāo)志傳送指令。①LAHF指令功能:將標(biāo)志寄存器的低8位送入AH。②SAHF指令功能:將AH中的內(nèi)容送入標(biāo)志寄存器的低8位。③PUSHF指令功能:將標(biāo)志寄存器的內(nèi)容壓入堆棧。④POPF指令功能:將棧頂內(nèi)容彈出到標(biāo)志寄存器?!纠?-6】設(shè)置標(biāo)志寄存器中的TF位(TF=1,CPU以單步方式執(zhí)行指令)。由于CPU沒有直接設(shè)置TF的操作指令,因此必須通過堆棧操作改變其狀態(tài)。指令段如下:PUSHF;標(biāo)志寄存器的內(nèi)容進(jìn)棧POPAX;標(biāo)志寄存器的內(nèi)容彈至AXORAX,0100H;將AX中對(duì)應(yīng)TF位置1PUSHAX;將AX的內(nèi)容壓入堆棧POPF;將棧頂AX的內(nèi)容送入標(biāo)志寄存器,TF←13.2.2算術(shù)運(yùn)算指令8086的算術(shù)運(yùn)算指令可實(shí)現(xiàn)8位/16位二進(jìn)制數(shù)的加、減、乘、除基本運(yùn)算,可用于有符號(hào)數(shù)、無符號(hào)數(shù)及BCD碼的各種算術(shù)運(yùn)算。1.加法指令(1)ADD(Addition)指令格式:ADDDST,SRC
指令的功能:DST←(DST)+(SRC)。ADD指令是一條雙操作數(shù)加法指令,它將源操作數(shù)SRC(字節(jié)或字)和目的操作數(shù)DST(字節(jié)或字)進(jìn)行二進(jìn)制數(shù)相加,結(jié)果存放在DST中,SRC不變。該指令執(zhí)行后,影響狀態(tài)標(biāo)志位AF、CF、PF、OF、ZF、SF。在使用ADD指令時(shí)應(yīng)注意以下原則。①參與運(yùn)算的兩個(gè)操作數(shù)的類型(編碼)和長(zhǎng)度必須一致,應(yīng)該同時(shí)為有符號(hào)數(shù)、無符號(hào)數(shù)或BCD碼,其運(yùn)算結(jié)果也必須與操作數(shù)的類型和長(zhǎng)度一致。②該指令不能識(shí)別數(shù)據(jù)類型,只能對(duì)二進(jìn)制數(shù)進(jìn)行按位相加。對(duì)于有符號(hào)數(shù),若兩個(gè)操作數(shù)符號(hào)相同時(shí),有可能發(fā)生溢出(置OF=1)。程序員必須根據(jù)編程時(shí)所定義的數(shù)據(jù)編碼類型,對(duì)運(yùn)算結(jié)果做相應(yīng)的處理。③該指令的操作數(shù)可以是通用寄存器或基址、變址寄存器或存儲(chǔ)器數(shù),但不能同時(shí)為存儲(chǔ)器數(shù);立即數(shù)只能作源操作數(shù),不能作目的操作數(shù);操作數(shù)不能是段寄存器。例如:ADDAL,12HADDAX,BXADDDX,[BP]ADDAL,[SI+BX]ADDSI,0FFF0HADDAX,DATA[BX]ADDAX,[BP+DI+100H]【例3-7】設(shè)(AL)=0A4H,(BL)=5CH。執(zhí)行ADDAL,BL指令:指令執(zhí)行后(AL)=0,OF=0,SF=0,ZF=1,AF=1,PF=1,CF=1。(2)帶進(jìn)位加法指令A(yù)DC(ADDwithCarry)指令格式:ADCDST,SRC
指令的功能:DST←(DST)+(SRC)+CF。ADC指令是帶進(jìn)位的加法指令,其操作是在ADD指令功能的基礎(chǔ)上再加上狀態(tài)標(biāo)志位CF,該指令應(yīng)用于多字節(jié)加法運(yùn)算。【例3-8】編寫指令段實(shí)現(xiàn)4字節(jié)數(shù)(32位數(shù)雙字)20008A04H+23459D00H相加,高位字存放在寄存器DX中,低位字存放在累加器AX中。指令段如下:MOVDX,2000HMOVBX,2345HMOVAX,8A04H;AX←8A04HADDAX,9D00H;AX←8A04H+9D00H,進(jìn)位置CF=1ADCDX,BX;DX←2000H+2345H+CF本指令段執(zhí)行后,DX中存放著被加數(shù)的兩個(gè)高位字節(jié),AX中存放著被加數(shù)的兩個(gè)低位字節(jié)。ADD指令實(shí)現(xiàn)低位字節(jié)相加,相加后(AX)=2704H,CF=1。ADC指令實(shí)現(xiàn)高位字節(jié)相加,且將CF加至DX,使DX的內(nèi)容為4346H。(3)增量指令I(lǐng)NC(Increment)指令格式:INCOPR該指令為單操作數(shù)指令,OPR既作為源操作數(shù),又作為目的操作數(shù)。INC指令的功能:OPR作為源操作數(shù)加1后,其結(jié)果仍然返回OPR。該指令執(zhí)行后,影響狀態(tài)標(biāo)志位AF、PF、OF、ZF、SF。注意:CF狀態(tài)不受影響?!纠?-9】編寫指令段實(shí)現(xiàn)將2000H單元和2001H單元的內(nèi)容之和送入AL。指令段如下:MOVSI,2000HMOVAL,[SI]INCSI;SI=(SI)+1ADDAL,[SI];(AL)為2000H單元和2001H單元內(nèi)容之和(4)BCD碼加法調(diào)整指令在執(zhí)行ADD指令后,當(dāng)操作數(shù)是BCD碼且BCD碼的某一位運(yùn)算結(jié)果超過9,就得不到正確的BCD碼結(jié)果。為此,必須進(jìn)行BCD碼調(diào)整,才能得到正確的十進(jìn)制數(shù)結(jié)果。BCD碼加法調(diào)整指令有如下兩條。
非壓縮BCD碼調(diào)整指令A(yù)AA。
壓縮BCD碼調(diào)整指令DAA。所謂壓縮BCD碼,是用1個(gè)字節(jié)表示2位BCD碼。非壓縮BCD碼是用1個(gè)字節(jié)的低4位表示1位BCD碼,其高4位為0①AAA指令的功能(在AAA指令前,應(yīng)該已使用ADD、ADC或INC指令)。將累加器AL的內(nèi)容調(diào)整為一位非壓縮BCD碼。該指令首先檢查AL的低4位是否為合法的BCD碼(0~9),若合法,就清除AL的高4位以及AF和CF標(biāo)志,不需要進(jìn)行調(diào)整;若AL的低4位表示的數(shù)大于9或者AF=1時(shí),則為非法的BCD碼。【例3-10】非壓縮BCD碼00000111(7D)與00001000(8D)相加,結(jié)果存放在1000H單元。指令段如下:MOVAX,0007H;AL←00000111B,AH←0MOVBL,08H;BL←00001000BADDAL,BL;AL←(AL)+(BL)=00001111BAAA;AL←(AL)+0110BMOV[1000H],AL②DAA指令的功能(在DAA指令前,應(yīng)該已使用ADD或ADC或INC指令)。加法的十進(jìn)制調(diào)整指令,它的作用是將AL的內(nèi)容調(diào)整為兩位壓縮的BCD碼(即一個(gè)字節(jié)內(nèi)存放兩位BCD碼)。調(diào)整方法與AAA指令類似,不同的是DAA指令要分別考慮AL的高4位和低4位,若AL低4位為非法BCD碼(大于9或者AF=1),則AL←(AL)+6,并置AF=1;如果AL高4位為非法BCD碼(大于9或者CF=1),則AL←(AL)+60H。2.減法指令(1)SUB(Subtract)指令格式:SUBDST,SRCSUB指令的功能:DST←(DST)-(SRC)SUB是一條雙操作數(shù)減法指令,它將目的操作數(shù)DST減去源操作數(shù)SRC,結(jié)果存入目的操作數(shù)DST中,源操作數(shù)SRC的內(nèi)容不變。該指令執(zhí)行后,影響狀態(tài)標(biāo)志位AF、CF、PF、OF、ZF、SF。①參與運(yùn)算的兩個(gè)操作數(shù)類型(編碼)和長(zhǎng)度必須一致,應(yīng)該同時(shí)為有符號(hào)數(shù)、無符號(hào)數(shù)或BCD碼,其運(yùn)算結(jié)果也必須與操作數(shù)的類型和長(zhǎng)度一致。②該指令不能識(shí)別數(shù)據(jù)類型,只能以二進(jìn)制數(shù)進(jìn)行按位相減。對(duì)于有符號(hào)數(shù),若兩個(gè)操作數(shù)符號(hào)相反時(shí),有可能發(fā)生溢出(置OF=1)。程序員必須根據(jù)編程時(shí)所定義的數(shù)據(jù)編碼類型,對(duì)運(yùn)算結(jié)果進(jìn)行相應(yīng)的處理。③該指令的操作數(shù)可以是通用寄存器或基址、變址寄存器或存儲(chǔ)器數(shù),但不能同時(shí)為存儲(chǔ)器數(shù)。立即數(shù)只能作源操作數(shù),不能作目的操作數(shù)。例如:SUBAL,12H;AL←(AL)-12HSUBBX,1234H;BX←(BX)-1234HSUBAL,[2000H];AL←(AL)-[2000H]SUBAX,DX;AX←(AX)-(DX)SUB[2000H],BL;2000H←[2000H]-BL下列指令是錯(cuò)誤的:SUBAX,12H;源操作數(shù)為8位,目的操作數(shù)為16位,數(shù)據(jù)長(zhǎng)度不一致SUB[BX],[2000H];源操作數(shù)和目的操作數(shù)均為存儲(chǔ)器數(shù)SUBDS,AX;操作數(shù)不能是段寄存器
(2)帶借位減法指令SBB指令格式:SBBDST,SRCSBB指令的功能:帶借位的減法指令。其操作與SUB指令的基本相同,它不僅要將目的操作數(shù)DST減去源操作數(shù)SRC,還要減去借位位CF的值,將結(jié)果存入目的操作數(shù)DST中。(3)減1指令DEC(Decrement)指令格式:DECOPR該指令為單操作數(shù)指令,OPR既作為源操作數(shù),又作為目的操作數(shù)。DEC指令的功能:OPR作為源操作數(shù)減1后,其結(jié)果仍然返回OPR。該指令執(zhí)行后,影響狀態(tài)標(biāo)志位AF、PF、OF、IF、SF(4)求補(bǔ)指令NEG(Negative)指令格式:NEGOPRNEG指令的功能:?jiǎn)尾僮鲾?shù)(有符號(hào)數(shù))求補(bǔ)指令,即對(duì)操作數(shù)的各位取反,末位加1,將結(jié)果送回目的操作數(shù)。該指令執(zhí)行的實(shí)質(zhì)是:已知一個(gè)補(bǔ)碼表示的操作數(shù),求這個(gè)數(shù)的相反數(shù)的補(bǔ)碼?!纠?-11】指令NEGAL的功能是對(duì)AL的內(nèi)容求補(bǔ)碼。指令段如下:MOVAL,13H;AL←00010011B(即13H=(+19D)=00010011B)NEGAL;AL←11101100B+1B=11101101B=0EDH執(zhí)行后,(AL)=0EDH=11101101B(即-19的補(bǔ)碼)。(5)比較指令CMP(CompareTwoOperands)指令格式:CMPDST,SRCCMP指令的功能:用于操作數(shù)DST與SRC的比較。該指令的操作與SUB指令的操作相同,但不傳送運(yùn)算結(jié)果。其實(shí)現(xiàn)方法是:用目的操作數(shù)DST減去源操作數(shù)SRC,影響標(biāo)志位,兩個(gè)操作數(shù)保持原值不變。CMP指令后一般設(shè)有條件轉(zhuǎn)移指令,根據(jù)CMP指令對(duì)狀態(tài)標(biāo)志位的影響,為轉(zhuǎn)移指令提供條件判斷依據(jù)。例如:判斷累加器AL的內(nèi)容是否為30H(字符“0”)。若是“0”,則跳轉(zhuǎn)到標(biāo)號(hào)LOP處執(zhí)行,否則按順序執(zhí)行。指令段如下:CMPAL,30HJZLOP...LOP:......3.乘法指令(1)無符號(hào)數(shù)乘法指令MUL(Multiply,Unsigned)指令格式:MULSRC(隱含目的操作數(shù)AL/AX/DX)MUL指令的功能:執(zhí)行兩個(gè)無符號(hào)數(shù)的乘法操作。被乘數(shù)隱含在累加器AL/AX中,乘數(shù)由SRC確定。4.除法指令(1)無符號(hào)數(shù)的除法指令DIV(Division,Unsigned)指令格式:DIVSRC(隱含目的操作數(shù)AX、DX)DIV指令的功能:執(zhí)行兩個(gè)無符號(hào)數(shù)的除法操作。被除數(shù)隱含在累加器AX或DX-AX中,除數(shù)由SRC確定。指令中的源操作數(shù)SRC可以是通用寄存器、指針和變址寄存器或存儲(chǔ)器數(shù),但不能是立即數(shù)。若除數(shù)為8位,則被除數(shù)必須在16位AX中,所得整數(shù)商送入AL,余數(shù)送入AH。若除數(shù)為16位,則被除數(shù)必須為32位數(shù)據(jù)且存放在DX-AX中,所得整數(shù)商送入AX,余數(shù)送入DX。5.符號(hào)擴(kuò)展指令CBW指令功能:將AL中數(shù)據(jù)的符號(hào)擴(kuò)展到AH中,即將AL中的8位字節(jié)數(shù)據(jù)擴(kuò)展為16位字?jǐn)?shù)據(jù)(正數(shù)擴(kuò)展位補(bǔ)“0”,即AH=00H:負(fù)數(shù)擴(kuò)展位補(bǔ)“1”,即AH=0FFH)。CWD指令功能:將AX中數(shù)據(jù)的符號(hào)擴(kuò)展到DX中,即將AX中的16位字?jǐn)?shù)據(jù)擴(kuò)展為32位雙字?jǐn)?shù)據(jù)DX-AX(正數(shù)擴(kuò)展DX=0000H,負(fù)數(shù)擴(kuò)展DX=0FFFFH)。這兩條指令是為解決不同長(zhǎng)度的數(shù)據(jù)進(jìn)行算術(shù)運(yùn)算而設(shè)計(jì)的。【例3-14】求8位數(shù)32H與0FH的商。指令段如下:MOVBL,0FH;BL←0FH=15DMOVAL,32H;AL←32H=50DCBW;AX←0032HIDIVBL;AL←3,AH←53.2.3邏輯運(yùn)算及移位指令1.邏輯運(yùn)算指令邏輯運(yùn)算指令用來對(duì)字或字節(jié)操作數(shù)進(jìn)行按位操作。8086系統(tǒng)提供邏輯與、邏輯或、邏輯非、邏輯異或及測(cè)試運(yùn)算指令。(1)邏輯與指令A(yù)ND指令格式:ANDDST,RSC;DST←(DST)∧(RSC)AND指令功能:進(jìn)行邏輯“與”操作的雙操作數(shù)指令。當(dāng)兩個(gè)操作數(shù)的對(duì)應(yīng)位都為1時(shí),目的操作數(shù)對(duì)應(yīng)位置1,否則置0。操作數(shù)可以是通用寄存器、基址或變址寄存器、存儲(chǔ)器數(shù);立即數(shù)只能作為源操作數(shù),不能作為目的操作數(shù);兩個(gè)操作數(shù)不能同時(shí)為存儲(chǔ)單元;段寄存器也不能作為操作數(shù)使用。該指令影響標(biāo)志位PF、SF、ZF,置CF=0,OF=0。該指令可借助某個(gè)給定的操作數(shù)屏蔽另一個(gè)操作數(shù)的某些位,并把其他位保留下來。例【3-15】設(shè)(AL)=10111111B,屏蔽AL的低4位,保留高4位。執(zhí)行指令:ANDAL,0F0H(2)邏輯或指令OR指令格式:ORDST,RSC;DST←(DST)∨(RSC)OR指令功能:進(jìn)行邏輯“或”操作的雙操作數(shù)指令。當(dāng)兩個(gè)操作數(shù)的對(duì)應(yīng)位中有一個(gè)是1或兩個(gè)都是1時(shí),目的操作數(shù)對(duì)應(yīng)位置1。該指令對(duì)操作數(shù)的要求及對(duì)狀態(tài)標(biāo)志位的影響同AND指令。【例3-16】設(shè)(AL)=00101111B,使AL的最高位為1,其余各位不變。執(zhí)行指令:ORAL,80H運(yùn)行結(jié)果:(AL)=10101111B。(3)邏輯非指令NOT指令格式:NOTOPR;OPR←(OPR)NOT指令功能:?jiǎn)尾僮鲾?shù)OPR的取反指令,該指令將操作數(shù)的每一位取反后,將結(jié)果返回對(duì)應(yīng)位。該指令對(duì)操作數(shù)的要求同AND指令。該指令不影響狀態(tài)標(biāo)志位。【例3-17】設(shè)(AL)=00101111B,對(duì)AL的各位求反。執(zhí)行指令:NOTAL運(yùn)行結(jié)果:(AL)=11010000B。(4)邏輯異或指令XOR指令格式:XORDST,RSC;DST←(DST)⊕(RSC)XOR指令功能:進(jìn)行邏輯“異或”操作的雙操作數(shù)指令。若兩個(gè)操作數(shù)中對(duì)應(yīng)位的值不同時(shí),目的操作數(shù)的對(duì)應(yīng)位置1,否則置0。對(duì)操作數(shù)的要求及對(duì)狀態(tài)標(biāo)志位的影響同AND指令。該指令常用于改變指定位的狀態(tài)、累加器及CF清0等?!纠?-18】設(shè)(AL)=00101111B,使AL的最高位不變,對(duì)其余各位求反。執(zhí)行指令:XORAL,7FH(5)測(cè)試指令TEST指令格式:TESTOPR1,OPR2TEST指令功能:雙操作數(shù)的測(cè)試指令。對(duì)兩個(gè)操作數(shù)的對(duì)應(yīng)位進(jìn)行“與”操作,并根據(jù)結(jié)果設(shè)置狀態(tài)標(biāo)志位,本指令與AND指令的不同之處是不改變?cè)僮鲾?shù)的值。該指令對(duì)操作數(shù)的要求同AND指令【例3-19】設(shè)AL中為有符號(hào)數(shù),測(cè)試該數(shù)是正數(shù)還是負(fù)數(shù)。由于負(fù)數(shù)的最高位為1,正數(shù)的最高位為0,可用TEST指令測(cè)試AL的最高位來判別。執(zhí)行指令:TESTAL,80H2.移位指令移位指令是指對(duì)操作數(shù)進(jìn)行二進(jìn)制數(shù)的移位操作主要包括以下幾種指令。(1)邏輯左移指令SHL指令格式:SHLDST,CL/1;CL/1表示移位次數(shù)可以放在CL中或移位1次SHL指令的功能:將DST中的二進(jìn)制位進(jìn)行邏輯左移,移位次數(shù)放入CL中(若移位1次可直接在指令中給出)。每次移位,操作數(shù)依次左移1位,最低位補(bǔ)0,最高位進(jìn)入狀態(tài)標(biāo)志位CF。邏輯左移指令SHL操作示意如圖3-8所示?!纠?-21】設(shè)(SI)=1234H,將SI的內(nèi)容擴(kuò)大4倍。已知(SI)=0001001000110100B,將其左移2位,即可實(shí)現(xiàn)乘4操作。指令段如下:MOVCL,2SHLSI,CL指令執(zhí)行后,(SI)左移2位,(SI)=0100100011010000B=48D0H。(2)邏輯右移指令SHR指令格式:SHRDST,CL/1;CL/1表示移位次數(shù)可以放在CL中或移位1次SHR指令的功能:將DST中的二進(jìn)制位進(jìn)行邏輯右移,移位次數(shù)放入CL中(若移位1次可直接在指令中給出)。每次移位,操作數(shù)依次右移1位,最高位補(bǔ)0,最低位進(jìn)入狀態(tài)標(biāo)志位CF。邏輯右移指令SHR操作示意如圖3-9所示?!纠?-22】設(shè)(SI)=1234H,將SI的內(nèi)容縮小至原來的1/4。已知(SI)=0001001000110100B,將其右移2位即可實(shí)現(xiàn)除以4操作。指令段如下:MOVCL,2SHRSI,CL指令執(zhí)行后,(SI)右移2位,(SI)=0000010010001101B=048DH。(3)算術(shù)左移指令SAL指令格式:SALDST,CL/1;CL/1表示移位次數(shù)可以放在CL或移位1次SAL指令的功能:將DST中的二進(jìn)制位進(jìn)行算術(shù)左移,移位次數(shù)放入CL中(若移位1次可直接在指令中給出),每次移位,操作數(shù)依次左移,最高位移至CF,最低位補(bǔ)0。SAL指令與SHL指令執(zhí)行操作完全相同,常用作有符號(hào)數(shù)乘2的操作,每次左移后,若CF位與最高位值相同,置OF=0,表示結(jié)果沒有溢出,否則,表示結(jié)果錯(cuò)誤。【例3-23】實(shí)現(xiàn)(AX)×5/2的運(yùn)算。MOVDX,AXSALAX,1;AX的內(nèi)容左移1位,相當(dāng)于AX乘2后傳送給AXSALAX,1;AX再乘2ADDAX,DX;AX=(AX)×5SARAX,1;AX的內(nèi)容右移1位,相當(dāng)于AX/2傳送給AX(4)算術(shù)右移指令SAR指令格式:SARDST,CL/1;CL/1表示移位次數(shù)可以放在CL或移位1次SAR指令的功能:將DST中的二進(jìn)制位進(jìn)行算術(shù)右移,移位次數(shù)放入CL中(若移位1次可直接在指令中給出),每次移位,操作數(shù)依次右移,最低位進(jìn)入狀態(tài)標(biāo)志位CF,最高位保持不變。算術(shù)右移指令SAR操作(5)循環(huán)左移指令ROL指令格式:ROLDST,CL/1;CL/1表示移位次數(shù)可以放在CL或移位1次ROL指令的功能:將DST中的二進(jìn)制位進(jìn)行循環(huán)左移,移位次數(shù)放入CL中(若移位1次可直接在指令中給出),每次移位,操作數(shù)依次左移,最高位進(jìn)入狀態(tài)標(biāo)志位CF和最低位。(6)循環(huán)右移指令ROR指令格式:RORDST,CL/1;CL/1表示移位次數(shù)可以放在CL或移位1次ROR指令的功能:將DST中的二進(jìn)制位進(jìn)行循環(huán)右移,移位次數(shù)放入CL中(若移位1次可直接在指令中給出),每次移位,操作數(shù)依次右移,最低位進(jìn)入狀態(tài)標(biāo)志位CF和最高位。
(7)帶進(jìn)位位的循環(huán)左移指令RCL指令格式:RCLDST,CL/1;CL/1表示移位次數(shù)可以放在CL或移位1次RCL指令的功能:將DST中的二進(jìn)制位與CF串聯(lián)在一起進(jìn)行循環(huán)左移,移位次數(shù)放入CL中(若移位1次可直接在指令中給出),每次移位,操作數(shù)依次左移,狀態(tài)標(biāo)志位CF的內(nèi)容移至DST的最低位,最高位進(jìn)入CF。(8)帶進(jìn)位位的循環(huán)右移指令RCR指令格式:RCRDST,CL/1;CL/1表示移位次數(shù)可以放在CL或移位1次RCR指令的功能:將DST中的二進(jìn)制位與CF串聯(lián)在一起進(jìn)行循環(huán)右移,移位次數(shù)放入CL中(若移位1次可直接在指令中給出),每次移位,操作數(shù)依次右移,狀態(tài)標(biāo)志位CF的內(nèi)容移至DST的最高位,最低位進(jìn)入CF。3.2.4串操作指令數(shù)據(jù)串是指存儲(chǔ)器中連續(xù)存儲(chǔ)的字節(jié)串或字串,可以是數(shù)值型數(shù)據(jù),也可以是字符型(如ASCII)數(shù)據(jù)。8086系統(tǒng)對(duì)數(shù)據(jù)串的處理提供了實(shí)用的串操作指令及與之配合使用的重復(fù)前綴,使用它們的簡(jiǎn)單組合可以對(duì)數(shù)據(jù)串序列進(jìn)行連續(xù)操作,從而大大提高編程效率。1.串操作指令及特征串操作指令可由基本串操作指令和重復(fù)串操作助記符組成,見表3-2。盡管串操作指令功能有所不同,但它們?cè)诖_定操作數(shù)的尋址方式等方面卻具有共同特點(diǎn),具體如下。①串操作指令助記符最后一個(gè)字母為“B”,表示該指令為字節(jié)操作;最后一個(gè)字母為“W”,表示該指令為字操作。②所有串操作指令的操作數(shù)都可以采用隱含尋址。源操作數(shù)必須在數(shù)據(jù)段DS,由源變址寄存器SI指向段內(nèi)地址。目的操作數(shù)必須在附加段ES,由目的變址寄存器DI指向段內(nèi)地址。因此,在使用串操作指令前,必須對(duì)DS、ES、SI和DI進(jìn)行設(shè)置。
如存儲(chǔ)器某一數(shù)據(jù)段名為DATA,在本段內(nèi)進(jìn)行串操作,則應(yīng)如下設(shè)置:MOVAX,DATAMOVDS,AX;DATA段為數(shù)據(jù)段MOVES,AX;DATA段又為附加段2.基本串操作指令基本串操作指令按其功能可分為5種:串
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度BIM在歷史文化遺址保護(hù)合同范本3篇
- 專項(xiàng)2024民用爆破器材供應(yīng)及服務(wù)協(xié)議版
- 個(gè)人工程承包合同(2024版)版B版
- 2024年節(jié)能減排服務(wù)協(xié)議
- 2025年度劇本改編權(quán)授權(quán)合同3篇
- 2024音樂噴泉景區(qū)旅游紀(jì)念品開發(fā)與銷售合同3篇
- 二零二五年度線上線下整合營(yíng)銷方案合作協(xié)議2篇
- 2025年度廠房裝修工程臨時(shí)用電及安全管理合同4篇
- 2025年現(xiàn)代化廠房購置及安裝服務(wù)合同范本二3篇
- 2025年度新能源設(shè)備買賣合同規(guī)范范本4篇
- 高考詩歌鑒賞專題復(fù)習(xí):題畫抒懷詩、干謁言志詩
- 2023年遼寧省交通高等??茖W(xué)校高職單招(英語)試題庫含答案解析
- GB/T 33688-2017選煤磁選設(shè)備工藝效果評(píng)定方法
- GB/T 304.3-2002關(guān)節(jié)軸承配合
- 漆畫漆藝 第三章
- CB/T 615-1995船底吸入格柵
- 光伏逆變器一課件
- 貨物供應(yīng)、運(yùn)輸、包裝說明方案
- (完整版)英語高頻詞匯800詞
- 《基礎(chǔ)馬來語》課程標(biāo)準(zhǔn)(高職)
- IEC61850研討交流之四-服務(wù)影射
評(píng)論
0/150
提交評(píng)論