新編1632位微型計(jì)算機(jī)原理及應(yīng)用(李繼燦主編)第3章課件_第1頁(yè)
新編1632位微型計(jì)算機(jī)原理及應(yīng)用(李繼燦主編)第3章課件_第2頁(yè)
新編1632位微型計(jì)算機(jī)原理及應(yīng)用(李繼燦主編)第3章課件_第3頁(yè)
新編1632位微型計(jì)算機(jī)原理及應(yīng)用(李繼燦主編)第3章課件_第4頁(yè)
新編1632位微型計(jì)算機(jī)原理及應(yīng)用(李繼燦主編)第3章課件_第5頁(yè)
已閱讀5頁(yè),還剩142頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第3章指令系統(tǒng)3.1概述3.280486尋址方式3.380486標(biāo)志寄存器3.4匯編語(yǔ)言語(yǔ)法規(guī)則之一3.580486基本集指令3.1概述

指令:通知CPU執(zhí)行某種操作的“命令”,CPU全部指令的集合,稱為指令系統(tǒng)指令的書(shū)寫(xiě)格式目標(biāo)指令(機(jī)器指令)用一串0,1代碼書(shū)寫(xiě)注意:硬件只能識(shí)別,存儲(chǔ),運(yùn)行目標(biāo)指令符號(hào)指令:用規(guī)定的助記符,規(guī)定的書(shū)寫(xiě)格式書(shū)寫(xiě)的指令大多數(shù)指令由操作碼和地址碼2部分組成操作碼:通知CPU執(zhí)行什么操作(唯一)

地址碼:指令的操作對(duì)象所存放的位置(根據(jù)操作對(duì)象的多樣性其表現(xiàn)形式很多)

教材上把地址碼稱為操作數(shù)3.指令的組成相應(yīng)的編碼規(guī)則對(duì)指令進(jìn)行編碼操作碼的編碼地址碼的編碼4.目標(biāo)程序的生成

匯編源程序編輯、編譯、鏈接可執(zhí)行的機(jī)器指令程序(目標(biāo)程序)5.指令長(zhǎng)度486指令長(zhǎng)度(機(jī)器指令長(zhǎng)度)為1~16字節(jié)規(guī)定:多字節(jié)指令占用連續(xù)的內(nèi)存單元,存放指令第一字節(jié)的內(nèi)存地址,稱為“指令地址”。CPU只能識(shí)別,存儲(chǔ),運(yùn)行目標(biāo)指令,而用機(jī)器指令編程非常困難。于是早期的專家們發(fā)明了符號(hào)指令,再經(jīng)過(guò)軟件把符號(hào)指令→機(jī)器指令。圖示如下:6.指令存放

如:12345H單元中有一條指令MOVAX,6789H67H89HB8H12345H:操作碼操作數(shù)6789HMOVAX,6789H先寫(xiě)操作碼,再寫(xiě)操作數(shù)。多字節(jié)操作數(shù)連續(xù)存放。存放規(guī)律:低位字節(jié)存放在低地址單元,高位字節(jié)存放在相鄰的高地址單元7.符號(hào)指令的書(shū)寫(xiě)格式標(biāo)號(hào):操作碼助記符空格操作數(shù)助記符;注釋如:NEXT:ADDAX,BX;AX+BX→AX INCSI;SI+1→SI標(biāo)號(hào):以字母開(kāi)頭,后跟字母,數(shù)字,下劃線,長(zhǎng)度≤31字符標(biāo)號(hào)又稱符號(hào)地址,代表該指令的邏輯地址??捎锌蔁o(wú),設(shè)置是為了程序的轉(zhuǎn)向注解:以“;”開(kāi)頭,不執(zhí)行,打印程序清單時(shí)照原樣打印,“系統(tǒng)保留字”不能做標(biāo)號(hào)。 486有3類7種尋址方式立即尋址方式:獲得立即數(shù)寄存器尋址方式:獲得寄存器操作數(shù)存儲(chǔ)器尋址方式:獲得存儲(chǔ)器操作數(shù)(內(nèi)存操作數(shù)))學(xué)習(xí)重點(diǎn):怎樣在符號(hào)指令中,正確的描述各種尋址方式1.立即尋址-操作數(shù)包含在本條指令中,是指令的一部分,完整地取出該條指令,也就獲得了操作數(shù)。如:MOV EAX,12345678HMOV BL,10101010B ;AAH→BLMOV CL,–4 ;FCH→CLMOV DL,’A’ ;41H→DLADDAL,0C8H MOV SI,3*5 ;15→SI上例源操作數(shù)即為立即尋址,立即數(shù)書(shū)寫(xiě)規(guī)定:立即數(shù)以數(shù)字開(kāi)頭,以A~F開(kāi)頭的16進(jìn)制數(shù),必須前綴0。程序員可以按自己的習(xí)慣書(shū)寫(xiě)立即數(shù),各種合法的立即數(shù)經(jīng)匯編后,一律自動(dòng)轉(zhuǎn)換成等值的二進(jìn)制數(shù),負(fù)數(shù)用補(bǔ)碼表示。立即數(shù)的數(shù)制用后綴表示,B表示二進(jìn)制數(shù),H表示十六進(jìn)制數(shù),

D或缺省為十進(jìn)制數(shù),單引號(hào)括起來(lái)的字符編譯成相應(yīng)的ASCII碼??梢杂?–*/

組成立即數(shù)表達(dá)式2.寄存器尋址-操作數(shù)在CPU的某個(gè)寄存器中,符號(hào)指令中直接寫(xiě)出寄存器名稱。如:MOVAX,DS ;DS內(nèi)容→AXINCSI;SI+1→SI(Increase增量)DECDI ;DI–1→DI(Decrease減量)如:下述6條指令,目標(biāo)操作數(shù)即為寄存器尋址

MOV EAX,12345678HMOV BL,10101010B ;AAH→BLMOV CL,–4 ;FCH→CLMOV DL,’5’ ;35H→DLADDAL,0C8H MOV SI,3*5 ;15→SI存儲(chǔ)單元邏輯地址表達(dá)式的一般形式段寄存器:偏移地址有5種尋址方式段超越前綴助記符,訪問(wèn)約定的邏輯段可以省略

實(shí)模式下,物理地址=段寄存器×24+偏移地址(1)直接尋址①地址表達(dá)式的格式1:段寄存器:[偏移地址]

②地址表達(dá)式的格式2:段寄存器:變量名

用變量名代表存儲(chǔ)單元的有效地址

如:MOV AL,ES:[2CH]從ES附加段偏移地址為2CH的單元取數(shù)→AL如:MOVAX,DS:[1234H]從數(shù)據(jù)段偏移地址為1234H的單元取一字→AX這種格式很少使用,∵通常情況下,程序員不知道某單單元的偏移地址(本書(shū)僅在P349有過(guò)一次應(yīng)用) 設(shè)數(shù)據(jù)段XX字節(jié)單元的內(nèi)容為11HES附加段YY字單元的內(nèi)容為2233HMOVAL,DS:XX;取數(shù)據(jù)段XX字節(jié)單元的內(nèi)容→AL或MOVAL,XX;∴AL=11HMOV AX,ES:YY;取ES附加段YY字單元的內(nèi)容→AX或MOVAX,YY;∴AX=2233H說(shuō)明:匯編語(yǔ)言允許為某單元起一個(gè)“名字”,這個(gè)名字就稱為該單元的“變量名”,經(jīng)匯編之后,變量名有段基址和偏移量?jī)煞N屬性。變量名是唯一的,程序中不能有重復(fù)的變量名,∴“段寄存器:”可以省略。

③間址寄存器和約定訪問(wèn)的邏輯段486規(guī)定:間址寄存器約定訪問(wèn)的邏輯段BP堆棧段16位尋址方式BX,SI,DI數(shù)據(jù)段EBP,ESP堆棧段32位尋址方式EAX~EDX,ESI,EDI數(shù)據(jù)段④舉例:設(shè)數(shù)據(jù)段BUF字節(jié)單元的內(nèi)容為55H,取出該數(shù)→AL解1:用BX間址

MOVAX,數(shù)據(jù)段段基址 MOVDS,AX MOVBX,BUF單元的有效地址 MOVAL,DS:[BX];AL=55H等價(jià)于:MOVAL,[BX] 由于BX間址,約定訪問(wèn)的是數(shù)據(jù)段,∴“DS:”可省解2:用BP間址

MOVAX,數(shù)據(jù)段段基址 MOVDS,AX MOVBP,BUF單元的有效地址 MOVAL,DS:[BP];AL=55H不能寫(xiě)成:MOVAL,[BP] 由于BP間址約定訪問(wèn)的是堆棧段,∴“DS:”不可省解3:用變量名直接尋址

MOVAX,數(shù)據(jù)段段基址 MOV DS,AX MOVAL,BUF ;AL=55H③基址寄存器和約定訪問(wèn)的邏輯段基址寄存器約定訪問(wèn)的邏輯段BP堆棧段16位尋址方式BX數(shù)據(jù)段EBP,ESP堆棧段32位尋址方式EAX~EDX,ESI,EDI數(shù)據(jù)段④舉例設(shè)數(shù)據(jù)段BUF單元依次有:78H,56H,34H,12H則: MOV AX,數(shù)據(jù)段段基址 MOVDS,AX MOVBX,BUF單元有效地址 MOVDH,[BX+1];DH=56H MOVDX,[BX+2];DX=1234H12H34H56H78HBUF(4)變址尋址①有比例因子的變址尋址其地址表達(dá)式為

段寄存器:[比例因子*變址寄存器+位移量]物理地址=段寄存器×16+比例因子×變址寄存器+位移量

沒(méi)有比例因子的變址尋址其地址表達(dá)式為:

段寄存器:[變址寄存器+位移量]

訪問(wèn)約定的邏輯段可簡(jiǎn)化為:

[變址寄存器+位移量]

物理地址=約定的段寄存器×16+變址寄存器+位移量③變址寄存器與約定訪問(wèn)的邏輯段變址寄存器約定訪問(wèn)的邏輯段適用于……SI,DI數(shù)據(jù)段無(wú)比例因子,16位尋址EBP堆棧段有比例因子,32位尋址EAX~EDX,ESI,EDI數(shù)據(jù)段②無(wú)比例因子基址加變址地址表達(dá)式:

段寄存器:[基址寄存器+變址寄存器+位移量]訪問(wèn)約定邏輯段:

[基址寄存器+變址寄存器+位移量]基址加變址尋址是基址尋址和變址尋址的組合,要求基址寄存器和變址寄存器都是16位或都是32位,否則(16位尋址和32位尋址混合使用)是非法指令默認(rèn)的段寄存器不一致,這樣的組合雖然是合法,但容易出錯(cuò)如:[BP+SI],[BP+DI]BP約定的邏輯段為堆棧段,而SI、DI約定的邏輯段為數(shù)據(jù)段,它們組合之后約定訪問(wèn)的邏輯段是誰(shuí)?實(shí)驗(yàn)證明是堆棧段,∴這樣的組合最好要加段前綴。尋址方式的學(xué)習(xí)要點(diǎn):1.訪問(wèn)內(nèi)存操作數(shù)由5種尋址方式直接尋址、間址、基址、變址、基址加變址2.關(guān)于16位尋址和32位尋址16位尋址:采用16位間址、基址、變址、基址加變址32位尋址:采用32位間址、基址、變址、基址加變址3.在實(shí)模式下,一個(gè)邏輯段的體積最大為64K,存儲(chǔ)單元的有效地址為16位,不可能超過(guò)FFFFH,∴在實(shí)模式下運(yùn)行的程序通常采用16位尋址4.關(guān)于段約定和段超越在用間址、基址、變址、基址加變址尋址內(nèi)存操作數(shù)時(shí),其地址表達(dá)式都有2種書(shū)寫(xiě)格式有段前綴和無(wú)段前綴①如用BP、EBP、ESP參與尋址,CPU自動(dòng)認(rèn)為是訪問(wèn)堆棧段,∴段超越前綴“SS:”可省如:MOVAL,DS:[BX]MOVAL,[BX]

④如用BX、SI、DI、EAX、EDX、ESI、EDI參與尋址非數(shù)據(jù)段,必須明確寫(xiě)出段超越前綴,如:MOVAL,ES:[BX]MOVAL,F(xiàn)S:[SI+2]5.使用段約定訪問(wèn)內(nèi)存操作數(shù)是最常用的編程風(fēng)格明確寫(xiě)出,不能省

3.3標(biāo)志寄存器ACVMRNTIOPLODITSZAPC

D31D19D18D080486標(biāo)志寄存器80486標(biāo)志寄存器為32位,實(shí)際使用15位15位標(biāo)志分為兩類:狀態(tài)標(biāo)志和控制標(biāo)志

狀態(tài)標(biāo)志記錄了當(dāng)前指令執(zhí)行后的狀態(tài)信息控制標(biāo)志用來(lái)控制微處理器操作本節(jié)首先介紹6種狀態(tài)標(biāo)志一.狀態(tài)標(biāo)志1.C標(biāo)志—進(jìn)位/借位標(biāo)志字節(jié)加/減,最高位(D7)產(chǎn)生進(jìn)位/借位時(shí):C標(biāo)志置1,否則置0

字加/減,最高位(D15)產(chǎn)生進(jìn)位/借位時(shí):

C標(biāo)志置1,否則置0

雙字加/減,最高位(D31)產(chǎn)生進(jìn)位/借位時(shí):

C標(biāo)志置1,否則置02.A標(biāo)志—輔助進(jìn)位/輔助借位標(biāo)志

字節(jié)加/減,D3位產(chǎn)生進(jìn)位/借位時(shí):A標(biāo)志置1,否則置0

字加/減,D7位產(chǎn)生進(jìn)位/借位時(shí):A標(biāo)志置1,否則置0

雙字加/減,D15位產(chǎn)生進(jìn)位/借位時(shí):A標(biāo)志置1,否則置03.S標(biāo)志—符號(hào)標(biāo)志字節(jié)運(yùn)算后,結(jié)果的最高位D7位為1,S標(biāo)志置1,否則置0字運(yùn)算后,結(jié)果的最高位D15位為1,S標(biāo)志置1,否則置0雙字運(yùn)算后,結(jié)果的最高位D31位為1,S標(biāo)志置1,否則置04.Z標(biāo)志—結(jié)果標(biāo)志

運(yùn)算結(jié)果為全0時(shí),Z標(biāo)志置1,否則置0

5.P標(biāo)志—奇偶標(biāo)志(實(shí)際上是偶標(biāo)志)運(yùn)算結(jié)果中,“1”的個(gè)數(shù)為偶數(shù)個(gè)(沒(méi)有“1”也是偶數(shù)),P標(biāo)志置1,否則置06.O標(biāo)志—溢出標(biāo)志運(yùn)算結(jié)果產(chǎn)生溢出,則O標(biāo)志置1,否則置0二.復(fù)習(xí):有關(guān)溢出的幾個(gè)概念1.什么是溢出?運(yùn)算結(jié)果超出寄存器能表示的范圍,稱為溢出。溢出和操作數(shù)的性質(zhì)有關(guān)。8位無(wú)符號(hào)數(shù)運(yùn)算,結(jié)果>255有溢出16位無(wú)符號(hào)數(shù)運(yùn)算,結(jié)果>65535有溢出32位無(wú)符號(hào)數(shù)運(yùn)算,結(jié)果>232_1有溢出8位有符號(hào)數(shù)運(yùn)算,-128>結(jié)果>127有溢出16位有符號(hào)數(shù)運(yùn)算,-32768>結(jié)果>32767有溢出32位有符號(hào)數(shù)運(yùn)算,-231>結(jié)果>231_1有溢出2.CPU如何判斷溢出

由于溢出和操作數(shù)的性質(zhì)有關(guān),而操作數(shù)的性質(zhì)是由程序員定義的。CPU只能默認(rèn)一種選擇,即CPU一律默認(rèn)操作數(shù)是有符號(hào)補(bǔ)碼數(shù),并以此來(lái)設(shè)置溢出標(biāo)志。3.程序員如何判斷溢出有符號(hào)數(shù)運(yùn)算,判O標(biāo)志,O標(biāo)志為1,有溢出無(wú)符號(hào)數(shù)加/減,判C標(biāo)志,C標(biāo)志為1,有溢出例:下列指令執(zhí)行后AL=?A.C.O.P.S.Z為何值?

MOVAL,0C8HADDAL,0C8HAL=90H,如果C8H為無(wú)符號(hào)數(shù)(值=200),則有溢出。如果C8H為有符號(hào)數(shù)(值=-56),則無(wú)溢出。這6個(gè)標(biāo)志中,C.O.P.S.Z可為程序的轉(zhuǎn)移提供測(cè)試條件。000010011000

100

110

01

001

10C=1S=1P=1O=0Z=01A=13.480486基本集指令分6類,為講授方便,用N代表立即數(shù),N8、N16、N32代表8、16、32位立即數(shù)R代表寄存器操作數(shù),R8、R16、R32代表8、16、32位寄存器操作數(shù)M代表內(nèi)存操作數(shù),M8、M16、M32代表8、16、32位內(nèi)存操作數(shù)S代表段寄存器總說(shuō)明:源、目操作數(shù)不可同為內(nèi)存操作數(shù)源、目操作數(shù)屬性一致(長(zhǎng)度相同)當(dāng)目標(biāo)操作數(shù)為間址、變址、基址、基+變址的內(nèi)存操作數(shù),而源操作數(shù)為單字節(jié)/雙字節(jié)立即數(shù),則目標(biāo)操作數(shù)必須用PTR說(shuō)明類型若操作數(shù)為間、變、基、基+變的內(nèi)存操作數(shù),則必須用PTR說(shuō)明類型2.對(duì)于單操作數(shù)指令(如:INC,DEC)1.于雙操作數(shù)指令(如:MOV,ADD,CMP)第一類、傳送類本類指令執(zhí)行后,不影響狀態(tài)標(biāo)志1.通用傳送(1)數(shù)據(jù)傳送MOV目,源R/M,NR/M/S,R;目標(biāo)不允許是CSR/M,SR/S,M;目標(biāo)不允許是CS功能:源→目,源不變,不影響6種標(biāo)志CS不能做目標(biāo),不能向段寄存器寫(xiě)入立即數(shù)禁止2個(gè)內(nèi)存單元直接傳送源、目屬性要一致說(shuō)明:為了深入理解數(shù)值定義偽指令、學(xué)習(xí)PTR運(yùn)算符的使用,請(qǐng)仔細(xì)閱讀以下例題。【例】閱讀以下程序,寫(xiě)出指令執(zhí)行后的目標(biāo)操作數(shù)。代碼段: ……

MOVAX,SEG數(shù)據(jù)段段名MOVDS,AX;對(duì)DS初始化MOVBL,BNUM;BL=?

所以,BL=12H數(shù)據(jù)段經(jīng)過(guò)匯編之后,設(shè)數(shù)據(jù)段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

BNUM:12H34H56H78H90H代碼段: ……

MOVAX,SEG數(shù)據(jù)段段名MOVDS,AXMOVBX,WNUM+2;BX=?數(shù)據(jù)段經(jīng)過(guò)匯編之后,WNUM:22H11H44H33H66H55H所以,BX=3344H設(shè)數(shù)據(jù)段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

代碼段: ……

MOVAX,SEG數(shù)據(jù)段段名MOVDS,AXMOVEBX,DNUM+4;EBX=?數(shù)據(jù)段經(jīng)過(guò)匯編之后,所以,EBX=87654321HDNUM:68H24H57H13H21H43H65H87H設(shè)數(shù)據(jù)段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

代碼段: ……

MOVAX,SEG數(shù)據(jù)段段名MOVDS,AXMOVBL,BYTEPTRDNUM;BL=?數(shù)據(jù)段經(jīng)過(guò)匯編之后,所以,BL=68HDNUM:68H24H57H13H設(shè)數(shù)據(jù)段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

代碼段: ……

MOVAX,SEG數(shù)據(jù)段段名MOVDS,AX;對(duì)DS初始化MOVBX,WORDPTRBNUM+1;BX=?

所以,BX=5634HBNUM:12H34H56H78H90H數(shù)據(jù)段經(jīng)過(guò)匯編之后,設(shè)數(shù)據(jù)段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

代碼段: ……

MOVAX,SEG數(shù)據(jù)段段名MOVDS,AX;對(duì)DS初始化MOVEBX,DWORDPTRWNUM+1;EBX=?

所以,EBX=66334411H數(shù)據(jù)段經(jīng)過(guò)匯編之后,設(shè)數(shù)據(jù)段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

WNUM:22H11H44H33H66H55H代碼段: ……

MOVAX,SEG數(shù)據(jù)段段名MOVDS,AXMOVBX,WORDPTRDNUM[3];BX=?數(shù)據(jù)段經(jīng)過(guò)匯編之后,所以,BX=2113H設(shè)數(shù)據(jù)段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

DNUM:68H24H57H13H21H43H65H87H代碼段:……

MOVAX,SEG數(shù)據(jù)段段名MOVDS,AX;對(duì)DS初始化MOVBX,WORDPTRFNUM;BX=?

所以,BX=5566H數(shù)據(jù)段經(jīng)過(guò)匯編之后,設(shè)數(shù)據(jù)段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

FNUM:66H55H44H33H22H11H代碼段: ……

MOVAX,SEG數(shù)據(jù)段段名MOVDS,AX;對(duì)DS初始化MOVBX,3MOVBL,BNUM[BX];BL=?

所以,BL=78H數(shù)據(jù)段經(jīng)過(guò)匯編之后,設(shè)數(shù)據(jù)段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

BNUM:12H34H56H78H90H代碼段: ……

MOVAX,SEG數(shù)據(jù)段段名MOVDS,AX;對(duì)DS初始化MOVSI,OFFSETBNUMMOVBX,[SI+1];BX=?所以,BX=5634H數(shù)據(jù)段經(jīng)過(guò)匯編之后,設(shè)數(shù)據(jù)段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

BNUM:12H34H56H78H90H(2)符號(hào)擴(kuò)展/零擴(kuò)展傳送指令MOVSX目標(biāo)寄存器,源操作數(shù)MOVZX目標(biāo)寄存器,源操作數(shù) R,R/M說(shuō)明:源操作數(shù)字長(zhǎng)要小于或等于目標(biāo)寄存器字長(zhǎng)功能:源操作數(shù)不變MOVSX源操作數(shù)符號(hào)位向高位擴(kuò)展,再送給目標(biāo)MOVZX源操作數(shù)高位補(bǔ)零,再送給目標(biāo)如:MOVDL,-16;DL=F0HMOVSXBX,DL;BX=FFF0H,DL、DH不變MOVZXBX,DL;BX=00F0H,DL、DH不變(3)有效地址傳送LEA目標(biāo)寄存器,源操作數(shù)R16/R32,內(nèi)存地址表達(dá)式功能:計(jì)算內(nèi)存單元的有效地址(不是其中的操作數(shù))→目標(biāo)LEABX,BUF;將BUF單元的有效地址→BXLEABX,[SI+5];將數(shù)據(jù)段SI+5變址的那個(gè)單元的有效地址→BX注:有效地址就是偏移地址,LEA指令等效與OFFSET運(yùn)算符

LEABX,BUF等效于MOVBX,OFFSETBUF

(4)交換指令XCHG第一操作數(shù),第二操作數(shù)R,RM,RR,M功能:完成2個(gè)操作數(shù)互換說(shuō)明:段寄存器、立即數(shù)不能參加互換2個(gè)內(nèi)存操作數(shù)不能互換,源、目的類型一致(5)字節(jié)交換BSWAP32位通用寄存器功能:D31~D24D23~D16D15~D8D7~D0說(shuō)明:←該指令查找數(shù)據(jù)段中的字節(jié)表,即要求數(shù)據(jù)表放在數(shù)據(jù)段,每個(gè)表元素為單字節(jié)數(shù)←指令執(zhí)行前:EBX或BX=表頭的有效地址AL=表元素相對(duì)于表頭的地址位移量功能:DS:[BX+AL]→AL或DS:[EBX+AL]→AL例:查找NUM單元中的數(shù)所對(duì)應(yīng)的數(shù)碼管字型碼數(shù)碼管外形:adbghcfe(6)查表指令XLAT表頭變量名abh共陰極數(shù)碼管內(nèi)部結(jié)構(gòu):數(shù)碼管工作示意圖:鎖存/驅(qū)動(dòng)電路CPUD0~D7a~h數(shù)碼管字型碼:設(shè)D7~D0位依次驅(qū)動(dòng)hgfedcba段,則:的字型碼為:00111111=3FH的字型碼為:00000110=06H的字型碼為:01011011=5BH的字型碼為:01100110=66H的字型碼為:01001111=4FH的字型碼為:01111101=7DH的字型碼為:01101101=6DHadbghcfe的字型碼為:00111001=39H的字型碼為:01111001=79H的字型碼為:01110001=71H的字型碼為:01111111=7FH的字型碼為:01101111=6FH的字型碼為:01110111=77H的字型碼為:01111100=7CH的字型碼為:01011110=5EH的字型碼為:00000111=07H解:編程時(shí),按0~9、A~F的規(guī)律,將相應(yīng)的字型碼設(shè)置在數(shù)據(jù)段中:TABDB3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB7FH,6FH,77H,7CH,39H,5EH,79H,71HNUMDB××;0~15中的一個(gè)數(shù)代碼段:MOVAX,SEGTABMOVDS,AXMOVBX,OFFSETTABMOVAL,NUMXLATTAB;AL=相應(yīng)的字型碼數(shù)據(jù)段:2.堆棧操作指令(1)基本概念堆棧例:農(nóng)民存儲(chǔ)糧食用的“糧垛”就是一個(gè)堆?;ㄉ←溣衩子?jì)算機(jī)中的堆棧是人為設(shè)置的一片連續(xù)內(nèi)存區(qū),用來(lái)存放數(shù)據(jù),所存數(shù)據(jù)按先進(jìn)后出規(guī)律存取。棧頂和棧底:棧頂:棧區(qū)的低地址棧底:棧區(qū)的高地址棧頂棧底低地址高地址堆棧段寄存器SS:存放堆棧段段基址堆棧指針ESP(SP):存放棧頂單元的偏移地址SS、ESP(SP)初值,由程序員賦值或DOS系統(tǒng)自動(dòng)賦值數(shù)據(jù)進(jìn)棧過(guò)程(以16位操作數(shù)進(jìn)棧為例)雙字節(jié)操作數(shù)高字節(jié)低字節(jié)←SPXXHXXH高8位→SS:[SP1]12H34H堆棧區(qū)數(shù)據(jù)進(jìn)棧過(guò)程(以16位操作數(shù)進(jìn)棧為例)XXHXXH12H←SP高8位→SS:[SP1]低8位→SS:[SP2]雙字節(jié)操作數(shù)高字節(jié)低字節(jié)堆棧區(qū)12H34H數(shù)據(jù)進(jìn)棧過(guò)程(以16位操作數(shù)進(jìn)棧為例)高8位→SS:[SP1]XXHXXH12H低8位→SS:[SP2]34H←SPSP2→SP雙字節(jié)操作數(shù)高字節(jié)低字節(jié)堆棧區(qū)12H34H數(shù)據(jù)進(jìn)棧過(guò)程(以16位操作數(shù)進(jìn)棧為例)高8位→SS:[SP1]XXHXXH12H低8位→SS:[SP2]34H←SPSP2→SP雙字節(jié)操作數(shù)高字節(jié)低字節(jié)堆棧區(qū)12H34H高字節(jié)低字節(jié)堆棧區(qū)XXHXXH12H34H←SP數(shù)據(jù)出棧過(guò)程(以16位操作數(shù)出棧為例)SS:[SP]→目標(biāo)(目標(biāo)寄存器,目標(biāo)單元)低8位78H56H16位目標(biāo)寄存器34H78H數(shù)據(jù)出棧過(guò)程(以16位操作數(shù)出棧為例)SS:[SP]→目標(biāo)(目標(biāo)寄存器,目標(biāo)單元)低8位高字節(jié)低字節(jié)堆棧區(qū)XXHXXH←SPSS:[SP+1]→目標(biāo)高8位12H16位目標(biāo)寄存器56H高字節(jié)低字節(jié)堆棧區(qū)XXHXXH12HSP+2→SP數(shù)據(jù)出棧過(guò)程(以16位操作數(shù)出棧為例)SS:[SP]→目標(biāo)(目標(biāo)寄存器,目標(biāo)單元)低8位SS:[SP+1]→目標(biāo)高8位←SP16位目標(biāo)寄存器34H56H高字節(jié)低字節(jié)堆棧區(qū)XXHXXH34H12HSP+2→SP數(shù)據(jù)出棧過(guò)程(以16位操作數(shù)出棧為例)SS:[SP]→目標(biāo)(目標(biāo)寄存器,目標(biāo)單元)低8位SS:[SP+1]→目標(biāo)高8位←SP16位目標(biāo)寄存器80X86的堆棧是向低地址方向延伸的,棧頂是“浮動(dòng)”的注:一次進(jìn)棧、出棧的數(shù)據(jù)至少是2字節(jié)(2)堆棧指令←進(jìn)棧指令PUSH源操作數(shù)N16/N32S/R16/R32/M16/M32如:PUSHWORDPTR[BX]PUSHDWORDPTR[SI+5]說(shuō)明:非直接尋址的內(nèi)存操作數(shù),必須用PTR說(shuō)明屬性←

出棧指令

POP目標(biāo)操作數(shù)R16/R32/M16/M32S(CS非法)如:PUSHAXPOPBX;BX=AX說(shuō)明:非直接尋址的內(nèi)存操作數(shù),必須用PTR說(shuō)明屬性←

16位標(biāo)志寄存器進(jìn)棧/出棧PUSHFPOPF←

32位標(biāo)志寄存器進(jìn)棧/出棧PUSHFDPOPFD←

16位寄存器進(jìn)棧/出棧PUSHA;依次把AX、CX、DX、BX、SP、BP、SI、DI壓棧(共28字節(jié))POPA;從棧頂彈出28字節(jié)依次放入DI、SI、BP、SP、BX、DX、CX、AX⑥32位寄存器進(jìn)棧/出棧

PUSHAD;依次把EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI壓棧 (共48字節(jié))POPAD;從棧頂彈出48字節(jié)依次放入EDI、ESI、EBP、ESP、EBX、EDX、ECX、EAX第二類、算術(shù)運(yùn)算1.二進(jìn)制加法:ADD

目標(biāo)操作數(shù),源操作數(shù)2.二進(jìn)制減法:SUB

目標(biāo)操作數(shù),源操作數(shù)3.二進(jìn)制加進(jìn)位:ADC目標(biāo)操作數(shù),源操作數(shù)4.二進(jìn)制減進(jìn)位:SBB目標(biāo)操作數(shù),源操作數(shù)

R/M,N/R

R,M功能:ADD:源+目→目SUB:目–源→目ADC:源+目+上條指令執(zhí)行后的C標(biāo)→目SBB:目–源–上條指令執(zhí)行后的C標(biāo)→目注:此四種操作都影響A、C、O、P、S、Z標(biāo)志說(shuō)明:源、目操作數(shù)的屬性(長(zhǎng)度)要一致若源為單/雙字節(jié)立即數(shù),而目標(biāo)為間、變、基、基+變的內(nèi)存操作數(shù),則目標(biāo)要用PTR說(shuō)明如:ADD[BX],12H×ADDBYTEPTR[BX],12H√ADDWORDPTR[BX],12H√∵12H可以理解為是0012H,或00000012H,匯編程序無(wú)法肯定它的具體長(zhǎng)度,故要用PTR說(shuō)明例:實(shí)現(xiàn)下列多字節(jié)數(shù)運(yùn)算(以232為模)56788785H+789A8785H設(shè)數(shù)據(jù)段:FIRSTDD56788785HSECONDDD789A8785HSUMDD?0F031FCHA經(jīng)匯編之后:FIRSTSECOND85H87H78H56H85H87H9AH78H解1:用直接尋址,單字節(jié)加法(共需12條指令)MOVAL,BYTEPTRFIRSTADDAL,BYTEPTRSECOND;進(jìn)位→C標(biāo)MOVBYTEPTRSUM,AL;不影響C標(biāo)MOVAL,BYTEPTRFIRST+1;不影響C標(biāo)ADCAL,BYTEPTRSECOND+1;進(jìn)位→C標(biāo)MOVBYTEPTRSUM+1,AL解2:用直接尋址,雙字節(jié)加法(只需6條指令)MOVAX,WORDPTRFIRSTADDAX,WORDPTRSECONDMOVWORDPTRSUM,AXMOVAX,WORDPTRFIRST+2ADCAX,WORDPTRSECOND+2MOVWORDPTRSUM+2,AX解3:用直接尋址,雙字加法(只需3條指令)MOVEAX,FIRSTADDEAX,SECONDMOVSUM,EAX5.二進(jìn)制加1:INC目標(biāo)操作數(shù)6.二進(jìn)制減1:DEC目標(biāo)操作數(shù)7.二進(jìn)制求補(bǔ):NEG目標(biāo)操作數(shù)R/M說(shuō)明:←對(duì)于非直接尋址的內(nèi)存操作數(shù),要用PTR明確說(shuō)明屬性功能:INC:目+1→目;影響A、O、P、S、Z,DEC:目-1→目;不影響C標(biāo)NEG:0-目→目;影響A、C、O、P、S、ZNDB0FFH,0FFH,0,0

MOVBX,OFFSETNINC[BX]

×INC

BYTEPTR

[BX];N單元為0INC

WORDPTR

[BX];N、N+1單元都為0INC

DWORDPTR

[BX];N、N+1單元都為0

;且N+2單元為1NEG的應(yīng)用:求出目標(biāo)操作數(shù)的負(fù)值MOVAH,5MOVAL,-6NEG

AH ;AH=-5=FBHNEG

AL ;AL=6如:數(shù)據(jù)段:代碼段:不等價(jià),執(zhí)行結(jié)果不同MUL默認(rèn)乘數(shù)、被乘數(shù)、乘積為無(wú)符號(hào)二進(jìn)數(shù)IMUL默認(rèn)乘數(shù)、被乘數(shù)、乘積為有符號(hào)二進(jìn)數(shù)高位積為0,則C標(biāo)、O標(biāo)=0,否則為1乘數(shù)、被乘數(shù)等長(zhǎng),乘積為雙倍長(zhǎng)8.無(wú)符號(hào)二進(jìn)數(shù)乘法:MUL乘數(shù)9.有符號(hào)二進(jìn)數(shù)乘法格式1:IMUL乘數(shù)格式2:IMUL目,源操作數(shù)R16,R16/M16/N16/N8M16,R16R32,R32/M32/N32/N16/N8M32,R32說(shuō)明:源、目不能同為M功能:源×目→目格式3:IMUL目,源,立即數(shù)R16/R32,與目等長(zhǎng)的R/M,不超過(guò)目長(zhǎng)的N功能:源×立即數(shù)→目例:實(shí)現(xiàn)150000×12解1:用無(wú)符號(hào)乘法MOVEAX,150000MOVEBX,12MULEBX;150000×12→EAX解2:用有符號(hào)乘法格式1MOVEAX,150000;∵EAX最高位必為0MOVEBX,12;EBX最高位也是0IMULEBX;可以用有符號(hào)乘法指令解3:用有符號(hào)乘法格式2MOVEAX,150000MOVEBX,12IMULEAX,EBX解4:用有符號(hào)乘法格式3MOVEAX,150000IMULEBX,EAX,12;12×EAX→EBX10.無(wú)符號(hào)二進(jìn)數(shù)除法:DIV除數(shù)11.有符號(hào)二進(jìn)數(shù)除法:IDIV除數(shù)功能:說(shuō)明:★DIV默認(rèn)除數(shù)、被除數(shù)、商、余數(shù)均為無(wú)符號(hào)數(shù)IDIV默認(rèn)除數(shù)、被除數(shù)、商、余數(shù)均為有符號(hào)數(shù)★被除數(shù)應(yīng)為除數(shù)的雙倍長(zhǎng)★

如除數(shù)太小,使商值超出范圍,屏幕顯示:Dividedoverflow然后自動(dòng)返回DOS說(shuō)明:源、目操作數(shù)不能同為M若目標(biāo)為間址、變址、基址或基址加變址尋址的內(nèi)存操作數(shù),而源為8/16位立即數(shù),則前者要用PTR說(shuō)明如:CMP[BX],12×CMPBYTEPTR[BX],12√CMPWORDPTR[BX],12√12.比較指令目源,產(chǎn)生A、C、O、P、S、Z6個(gè)狀態(tài)標(biāo)志,不破壞源、目。該指令一般后跟條件轉(zhuǎn)移指令。功能:CMP目標(biāo)操作數(shù),源操作數(shù)R/M,與目標(biāo)等長(zhǎng)的R/M不超過(guò)目標(biāo)長(zhǎng)的立即數(shù)由此可見(jiàn),一串0、1代碼,是二進(jìn)數(shù)還是BCD碼數(shù),是由程序員定義的,CPU并不理解?!?/p>

指令格式中怎樣表述BCD碼數(shù)(在內(nèi)存區(qū)如何定義BCD碼數(shù))?★假設(shè)N=01101001若N是二進(jìn)數(shù),則N=(105)10若N是BCD碼數(shù),則N=(69)1013.BCD碼調(diào)整指令(1)基本概念★組合/未組合BCD碼數(shù)(即壓縮/未壓縮BCD碼數(shù))注意:1010~1111不是BCD碼組合BCD碼:一字節(jié)中含有2位BCD碼未組合BCD碼:一字節(jié)中含有1位BCD碼(高4位為0)00001001000010018位十位個(gè)位組合BCD碼0000000010018位未組合BCD碼如:69的BCD碼數(shù)應(yīng)寫(xiě)成69H即:MOVAL,69H;則AL=0110,1001或:MOVAL,09H;則AL=00001001MOVAH,06H;則AH=00000110若:MOVAL,69;則AL=0100,0101如:69的BCD碼數(shù)定義在內(nèi)存單元時(shí)即:BUFDB69H或:BUFDB09H,06H若:BUFDB69則錯(cuò)★BCD碼數(shù)的加減運(yùn)算∵BCD碼數(shù)是用4位二進(jìn)數(shù)代表1位十進(jìn)數(shù)∴其運(yùn)算法則應(yīng)是:“逢十進(jìn)一,減一當(dāng)十”假設(shè):N1=(0110,1001)BCDN2=(0000,1001)BCD則:N1+N2=69+09=78即結(jié)果應(yīng)當(dāng)?shù)扔?0111,1000)BCD★如何實(shí)現(xiàn)BCD碼數(shù)的加法呢?指令系統(tǒng)中沒(méi)有實(shí)現(xiàn)BCD碼數(shù)加法的指令,只能借用ADD、ADC指令。但是ADD、ADC指令默認(rèn)操作數(shù)是二進(jìn)數(shù),其運(yùn)算法則是“逢二進(jìn)一”,而B(niǎo)CD碼數(shù)加法要求按“逢十進(jìn)一”運(yùn)算。0110,1001←BCD碼數(shù)N1ADD)0000,1001

←BCD碼數(shù)N20111,0010←這是二進(jìn)制的和數(shù)+)0000,0110←加06H修正

事實(shí)上,N1和N2可以是任意的BCD碼數(shù),借用ADD、ADC運(yùn)算后必須具體分析運(yùn)算結(jié)果,然后根據(jù)不同的情況選擇加06H修正,或是加60H修正,或是加66H修正。因此借用ADD、ADC指令進(jìn)行BCD碼數(shù)的加法還必須對(duì)結(jié)果進(jìn)行修正,修正后的結(jié)果才是BCD碼數(shù)的和數(shù)。舉例如下:0111,1000←得到正確BCD碼和數(shù)如果對(duì)于每一次BCD碼數(shù)的加法都要由程序員來(lái)判斷結(jié)果的話,這太麻煩了,因此指令系統(tǒng)中設(shè)計(jì)了一條“組合BCD碼數(shù)加法調(diào)整指令DAA”由硬件進(jìn)行分析,再對(duì)結(jié)果進(jìn)行調(diào)整。上例編程時(shí)只需要按以下方式設(shè)計(jì)程序即可

MOVAL,69H ADDAL,09H DAA(2)BCD碼數(shù)的加法及其調(diào)整規(guī)律(見(jiàn)下頁(yè)表)筆算CPU運(yùn)算加法調(diào)整

43+5598

0100,0011ADD)0101,01011001,1000C標(biāo)=0,A標(biāo)=0,高低四位均沒(méi)有出現(xiàn)非法BCD碼,結(jié)果正確,不修正39+4988

0011,1001ADD)0100,10011000,0010+)01101000,1000低四位有進(jìn)位,即A標(biāo)=1,對(duì)運(yùn)算結(jié)果加06H修正

63+54117

0110,0011ADD)0101,01001011,0111+)0110,00001,0001,0111高四位出現(xiàn)非法BCD碼數(shù),對(duì)運(yùn)算結(jié)果加60H修正

87+86173

1000,0111

ADD)1000,01101,0000,1101+)0110,01101,0111,0011因?yàn)镃標(biāo)=1,低四位出現(xiàn)非法BCD碼,對(duì)運(yùn)算結(jié)果加66H修正筆算CPU運(yùn)算加法調(diào)整(3)BCD碼調(diào)整指令①組合BCD碼加法調(diào)整:DAA功能:默認(rèn)操作對(duì)象為AL,并且根據(jù)具體情況對(duì)AL中的高/低4位進(jìn)行修正。應(yīng)用:緊跟在以AL為目標(biāo)寄存器的ADD/ADC之后,但AL中必須是組合BCD碼數(shù)之和。代碼段:

MOVAL,BYTEPTRN1ADDAL,BYTEPTRN2DAAMOVBYTEPTRSUM,ALMOVAL,BYTEPTRN1+1ADCAL,BYTEPTRN2+1DAAMOVBYTEPTRSUM+1,AL例:計(jì)算1234+5678=?數(shù)據(jù)段:

N1DW1234HN2DW5678HSUMDW?若被減數(shù)≥減數(shù),調(diào)整后,C標(biāo)=0,AL=組合BCD碼差值若被減數(shù)<減數(shù),調(diào)整后,C標(biāo)=1,AL=差值相對(duì)于模(100)10的“補(bǔ)數(shù)”例:計(jì)算56-78=?MOVAL,56HSUBAL,78HDAS;C=1,AL=88H;88H是“-12H”相對(duì)于模100H的補(bǔ)數(shù)②組合BCD碼減法調(diào)整:DAS功能:默認(rèn)操作對(duì)象為AL,對(duì)AL中的組合BCD差值進(jìn)行修正。例:計(jì)算8+9=?MOVAL,08HADDAL,09HMOVAH,0AAA;AH=01H,AL=07H修正后:AH=和的十位數(shù)(未組合BCD碼)AL=和的個(gè)位數(shù)(未組合BCD碼)③未組合BCD碼加法調(diào)整:AAA功能:默認(rèn)操作對(duì)象為AL,對(duì)AL中的2個(gè)未組合BCD碼數(shù)之和進(jìn)行修正。修正前:應(yīng)使AH=0如:計(jì)算9-8=?MOVAL,09HSUBAL,08HAAS;C=0,AL=01H若被減數(shù)<減數(shù),修正后,C標(biāo)=1,AH-1,AL=差值相對(duì)于模10H的“補(bǔ)數(shù)”④未組合BCD碼減法調(diào)整:AAS功能:默認(rèn)操作對(duì)象為AL,對(duì)AL中的2個(gè)未組合BCD碼數(shù)之差進(jìn)行修正若被減數(shù)≥減數(shù),修正后,C標(biāo)=0,AH不變,AL=未組合差值如:計(jì)算89MOVAX,0809HMULAH;AX=89的二進(jìn)制數(shù)AAM;AH=07H,AL=02H⑤未組合BCD碼乘法調(diào)整:AAM功能:默認(rèn)操作對(duì)象為AX,對(duì)AX中的2個(gè)未組合BCD碼之積(二進(jìn)制數(shù))進(jìn)行修正,即:AL10,商→AH,余數(shù)→AL。修正后:AH=乘積的十位數(shù)(未組合BCD碼)AL=乘積的個(gè)位數(shù)(未組合BCD碼)如:計(jì)算863MOVAX,0806HAAD;AX=86的等值二進(jìn)制0056HMOVBL,03HDIVBL;AL=(863)的二進(jìn)制商值11100,;AH=(863)的二進(jìn)制余數(shù)10MOVBL,AH;轉(zhuǎn)移AH中的余數(shù)→BLAAM;AX=0208H是商值的未組合十進(jìn)數(shù)⑥未組合BCD碼除法調(diào)整:AAD功能:默認(rèn)操作對(duì)象是AX,執(zhí)行AH10+AL→AL,0→AH應(yīng)用:在進(jìn)行未組合BCD碼數(shù)除法操作之前,用AAD指令將AX中的2位未組合BCD碼數(shù)→二進(jìn)數(shù),以便后繼程序用DIV指令進(jìn)行二進(jìn)制數(shù)除法。第三類轉(zhuǎn)移和調(diào)用指令轉(zhuǎn)移類指令分類按照轉(zhuǎn)移條件分:無(wú)條件轉(zhuǎn)移和有條件轉(zhuǎn)移按照轉(zhuǎn)移范圍分:段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移按照獲取轉(zhuǎn)移地址的方法分:直接轉(zhuǎn)移和間接轉(zhuǎn)移無(wú)條件轉(zhuǎn)移功能:無(wú)條件轉(zhuǎn)移,執(zhí)行指定標(biāo)號(hào)處的指令直接間接段內(nèi)JMP標(biāo)號(hào)JMPSHORT標(biāo)號(hào)JMP寄存器操作數(shù)JMP內(nèi)存操作數(shù)段間JMP標(biāo)號(hào)JMP內(nèi)存操作數(shù)說(shuō)明:①標(biāo)號(hào)是轉(zhuǎn)移地址標(biāo)號(hào)。②SHORT是短轉(zhuǎn)移,其轉(zhuǎn)移范圍相對(duì)于指令地址而言在+129~—126個(gè)單元之間。$-127:$-126:$:JMPSHORT××;非法轉(zhuǎn)移

$+129:$+130:③段內(nèi)“JMP標(biāo)號(hào)”,在實(shí)模式下,可轉(zhuǎn)移到64K代碼段的任何位置。④“JMP寄存器操作數(shù)/內(nèi)存操作數(shù)”的應(yīng)用在程序設(shè)計(jì)中再介紹。2.條件轉(zhuǎn)移

一般格式操作碼助記符轉(zhuǎn)移地址標(biāo)號(hào)應(yīng)用CMP目,源條件轉(zhuǎn)移指令轉(zhuǎn)移范圍:轉(zhuǎn)移到代碼段任何位置操作碼助記符隱含了轉(zhuǎn)移的條件(1)按標(biāo)志位的當(dāng)前狀態(tài)轉(zhuǎn)移設(shè)轉(zhuǎn)移地址標(biāo)號(hào)為XYZ

JCXYZ;當(dāng)前C標(biāo)志為1轉(zhuǎn)JNCXYZ;當(dāng)前C標(biāo)志為0轉(zhuǎn)JZXYZ;當(dāng)前Z標(biāo)志為1轉(zhuǎn)JNZXYZ;當(dāng)前Z標(biāo)志為0轉(zhuǎn)JSXYZ;當(dāng)前S標(biāo)志為1轉(zhuǎn)JNSXYZ;當(dāng)前S標(biāo)志為0轉(zhuǎn)JPXYZ;當(dāng)前P標(biāo)志為1轉(zhuǎn)JNPXYZ;當(dāng)前P標(biāo)志為0轉(zhuǎn)JOXYZ;當(dāng)前O標(biāo)志為1轉(zhuǎn)JNOXYZ;當(dāng)前O標(biāo)志為0轉(zhuǎn)無(wú)符號(hào)數(shù)條件轉(zhuǎn)移應(yīng)用:CMPN1,N2;N1,N2為無(wú)符號(hào)數(shù)無(wú)符號(hào)數(shù)條件轉(zhuǎn)移設(shè):轉(zhuǎn)移地址標(biāo)號(hào)為XYZ

則:JAXYZ ;N1>N2轉(zhuǎn)

JNAXYZ;N1≤N2轉(zhuǎn)

JCXYZ;N1<N2轉(zhuǎn)

JNCXYZ;N1≥N2轉(zhuǎn)(3)有符號(hào)數(shù)條件轉(zhuǎn)移應(yīng)用:CMPN1,N2;N1,N2為有符號(hào)數(shù)(機(jī)器數(shù)) 有符號(hào)數(shù)條件轉(zhuǎn)移JGXYZ;被減數(shù)的真值大于減數(shù)的真值轉(zhuǎn)JGEXYZ;被減數(shù)的真值大于等于減數(shù)的真值轉(zhuǎn)JLXYZ;被減數(shù)的真值小于減數(shù)的真值轉(zhuǎn)JLEXYZ;被減數(shù)的真值小于等于減數(shù)的真值轉(zhuǎn)(4)循環(huán)控制轉(zhuǎn)移LOOPXYZ;CX-1→CX,結(jié)果不為零轉(zhuǎn)LOOPZXYZ;CX-1→CX,結(jié)果不為零,且Z標(biāo)為1轉(zhuǎn)LOOPNZXYZ;CX-1→CX,結(jié)果不為零,且Z標(biāo)為0轉(zhuǎn)JCXZXYZ;測(cè)試CX,若CX=0轉(zhuǎn)JECXZXYZ;測(cè)試ECX,若ECX=0轉(zhuǎn)注意:循環(huán)控制轉(zhuǎn)移,其轉(zhuǎn)移范圍相對(duì)于指令地址而言為:-126~+129例:設(shè)AL=無(wú)符號(hào)數(shù),實(shí)現(xiàn):若AL≥5轉(zhuǎn)NEXT,否則不轉(zhuǎn)下面的3種解法哪一種正確?①CMPAL,5JNCNEXT②MOVAH,5CMPAL,AHJNCNEXT③CMPAL,5JGENEXT若AL=0~127,則:解法1:CMPAL,5解法3:CMPAL,5JNCNEXTJGENEXT這2種解法都是正確的。例:某班級(jí)40人,某課程考試成績(jī)存放在SCORE開(kāi)始的內(nèi)存單元。請(qǐng)統(tǒng)計(jì)及格人數(shù)→OK單元。思路:考試成績(jī)應(yīng)視為無(wú)符號(hào)數(shù),把成績(jī)依次取出和60比較,大于等于60為及格。數(shù)據(jù)段:SCOREDB××,…××;40個(gè)成績(jī)OKDB?SCORE有效地址→BX人數(shù)→CX0→DLDS:[BX]≥60YDL→OK返回DOSNBX+1→BXCX-1→CXCX=0?NDL+1→DLY

JCNOINCDLNO:INCBXDECCXJNZLASTMOVOK,DL返回DOS強(qiáng)調(diào):CMP[BX],60是錯(cuò)的。程序執(zhí)行后應(yīng)返回DOS,把控制權(quán)轉(zhuǎn)交給操作系統(tǒng)代碼段:MOVAX,SEGSCOREMOVDS,AXMOVDL,0MOVCX,40MOVBX,OFFSETSCORELAST:CMPBYTEPTR[BX],60

3.調(diào)用與返回指令★

調(diào)用:調(diào)用子程序,即無(wú)條件轉(zhuǎn)到子程序的第一條指令★返回:返回?cái)帱c(diǎn),即返回到CALL的后繼指令★子程序:能完成一定功能的相對(duì)獨(dú)立的程序段主程序

…………CALLXYZ斷點(diǎn):……XYZ子程序…………RET(1)匯編語(yǔ)言的過(guò)程定義語(yǔ)句格式過(guò)程名PROC屬性子程序?qū)嶓w RET過(guò)程名ENDP

說(shuō)明:過(guò)程名:子程序名,以字母開(kāi)頭,長(zhǎng)度≤31經(jīng)匯編之后,過(guò)程名就是子程序第一條指令的地址。

PROC/ENDP是子程序的定界語(yǔ)句屬性有2種描述

NEAR(或缺省)代表近過(guò)程即該子程序和調(diào)用它的那條指令在同一個(gè)代碼段

FAR代表遠(yuǎn)過(guò)程即該子程序和調(diào)用它的那條指令不在同一個(gè)代碼段

RET子程序返回指令(2)段內(nèi)調(diào)用段內(nèi)直接調(diào)用 CALL 過(guò)程名功能:斷口偏移地址→堆棧子程序入口的偏移地址→IP,從而轉(zhuǎn)子程序(3)段間調(diào)用段間直接調(diào)用CALL 過(guò)程名段間間接調(diào)用CALL 內(nèi)存操作數(shù)功能:斷口的“段基址:偏移地址”→堆棧子程序入口的“段基址:偏移地址”→CS:IP,實(shí)現(xiàn)段間轉(zhuǎn)移段內(nèi)間接調(diào)用 CALL 寄存器操作數(shù)CALL 內(nèi)存操作數(shù)(4)段內(nèi)/段間返回指令RETRETN(N為偶數(shù))段內(nèi)RET為C3H,段間RET為CBH功能:①有NEAR屬性的RET指令,從棧頂彈出2字節(jié)→IP有FAR屬性的RET指令,從棧頂彈出4字節(jié)→IP,CS如果棧頂是斷口地址,則能返回?cái)帱c(diǎn),否則不能②RETN指令,首先完成RET功能,然后把堆棧指針再下調(diào)N個(gè)字節(jié)例:把5個(gè)8位二進(jìn)制數(shù)轉(zhuǎn)換成十進(jìn)制數(shù)→屏顯數(shù)據(jù)段:NUM DB ××,××,××,××,××POINTER DW N2_10;匯編后存放N2_10的偏移地址代碼段: MOV AX,SEGNUM MOV DS,AX MOVBX,OFFSETNUMMOVCX,5

LAST:MOVDL,[BX]CALLN2_10;備注:該指令也可以使用下注①②BREAK:INCBX;BREAK為斷點(diǎn) LOOPLAST返回DOSN2_10PROC

把DL中的二進(jìn)制數(shù)→十進(jìn)制數(shù) →十進(jìn)制數(shù)ASCⅡ碼→屏顯RETN2_10ENDP①CALLPOINTER ;N2_10的偏移地址→IP②MOVSI,POINTER

CALLSI;SI→IP4.中斷調(diào)用與中斷返回(1)中斷調(diào)用INTN

(N=0~255)功能:標(biāo)志寄存器→堆?!癐NTN”的后繼指令地址“CS:IP”→堆棧無(wú)條件轉(zhuǎn)向N型中斷服務(wù)程序(2)中斷返回IRET功能:從棧頂依次彈出6個(gè)元素→IP,CS,標(biāo)志寄存器 幾個(gè)轉(zhuǎn)移調(diào)用指令的總結(jié)JMP標(biāo)號(hào)JC標(biāo)號(hào)CALL子程序INT中斷服務(wù)子程序第四類

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論