版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
計(jì)算機(jī)組成原理與匯編語言程序設(shè)計(jì)(第2版)第5章7/26/20231第5章匯編語言層本章主要內(nèi)容:80x86宏匯編語言的語句格式80x86宏匯編語言的語法規(guī)則基本程序結(jié)構(gòu)及程序設(shè)計(jì)方法匯編語言程序的開發(fā)方法7/26/20232第1節(jié)概述1.匯編語言一種面向機(jī)器的低級程序設(shè)計(jì)語言;符號化的機(jī)器語言,匯編指令與機(jī)器指令一一對應(yīng)。2.匯編語言源程序用匯編語言編制的程序;不能由計(jì)算機(jī)直接執(zhí)行。存儲(chǔ)程序工作方式:計(jì)算機(jī)連續(xù)有序地執(zhí)行機(jī)器指令(二進(jìn)制代碼)序列7/26/202333.匯編程序應(yīng)用匯編程序?qū)R編語言源程序翻譯成目標(biāo)代碼(即機(jī)器語言程序)。4.匯編語言的特點(diǎn)高性能對計(jì)算機(jī)的完全控制有助于更好地使用高級語言編程有助于了解計(jì)算機(jī)的結(jié)構(gòu)7/26/20234第2節(jié)匯編語言語句格式
匯編語言源程序的基本組成單位是語句。(2)偽指令語句(1)指令語句(可執(zhí)行語句)1.語句的種類表示計(jì)算機(jī)的某種具體操作,匯編時(shí)產(chǎn)生指令代碼(即目標(biāo)代碼),在程序運(yùn)行時(shí)實(shí)現(xiàn)。
指示匯編程序如何對源程序進(jìn)行匯編,其功能在匯編時(shí)完成。除了所定義的數(shù)據(jù)項(xiàng)之外,其它項(xiàng)不產(chǎn)生目標(biāo)代碼。(3)宏指令語句在第4節(jié)中介紹7/26/202352.語句格式標(biāo)號指令助記符操作數(shù)注釋:;,(1)指令語句格式(2)偽指令語句格式符號名偽指令符操作數(shù)注釋;,7/26/202363.標(biāo)識(shí)符標(biāo)號和符號名統(tǒng)稱為標(biāo)識(shí)符(標(biāo)號、常量名、變量、段名、過程名),由若干字符構(gòu)成,規(guī)則如下:字符個(gè)數(shù)1~31;第一個(gè)字符必須是字母或5個(gè)特殊字符之一(?@下劃線_點(diǎn)號·$);從第二個(gè)字符開始,可以是字母、數(shù)字和特殊字符;不能與系統(tǒng)專用保留字相同。7/26/20237第3節(jié)80x86宏匯編語言數(shù)據(jù)、表達(dá)式和運(yùn)算符5.3.1常數(shù)純數(shù)值數(shù)據(jù)、無屬性、值不能改變1.數(shù)值常數(shù)
可用二進(jìn)制、八進(jìn)制、十進(jìn)制、十六進(jìn)制數(shù)表示如11001010B、73Q、345D、4aEH、0AH2.字符常數(shù)單引號或雙引號擴(kuò)起來的一個(gè)或多個(gè)字符,以ASCII碼存儲(chǔ)。如‘A’——存儲(chǔ)的ASCII碼為41H7/26/202385.3.2變量變量應(yīng)先定義并預(yù)置初值,才能被引用。1、變量定義數(shù)據(jù)定義偽指令實(shí)現(xiàn)變量的定義,格式如下:變量名數(shù)據(jù)定義偽指令<表達(dá)式1>,……DB定義字節(jié)DW定義字DD定義雙字DQ定義8字節(jié)DT定義10字節(jié)例:DATA1DB10H7/26/20239變量的3個(gè)屬性(1)段屬性(SEG)表示變量存放在哪個(gè)邏輯段中,用變量所在段的段基值表示。(2)偏移地址屬性(OFFSET)表示變量在邏輯段中離段起始單元的距離,用字節(jié)數(shù)——偏移地址表示。(3)類型屬性(TYPE)表示單個(gè)變量占存儲(chǔ)單元的字節(jié)數(shù)。上述兩個(gè)屬性構(gòu)成了變量的邏輯地址。7/26/202310變量的初值數(shù)值表達(dá)式字雙字:
10H20H30H34H12H78H56H34H12H
:VA1VA2VA3存儲(chǔ)器分配圖00000HFFFFFH例:DATASEGMENT
VA1DB10H
DB20H,30H
VA2DW1234H
VA3DD12345678HDATAENDS7/26/202311字符串表達(dá)式STRING1DB‘STRING’
STRING2DW‘ST’,‘RI’,‘NG’
STRING3DD‘ST’,‘RI’,‘NG’例:存放的是字符ASCII碼7/26/202312
“?”表達(dá)式只分配存儲(chǔ)單元,不指定初值。例:DB?,?,?帶DUP表達(dá)式變量名<數(shù)據(jù)定義偽指令><表達(dá)式1>DUP(<表達(dá)式2>)VA1DW20HDUP(4)例:重復(fù)次數(shù)重復(fù)數(shù)據(jù)的內(nèi)容:04H00H
04H
:00H:存儲(chǔ)器分配圖VA1為連續(xù)存儲(chǔ)單元重復(fù)預(yù)置一組數(shù)據(jù),格式如下:共40H字節(jié)7/26/202313:33338:33338:DA2內(nèi)層DUP操作重復(fù)4次,共4字節(jié)外層DUP操作重復(fù)10H次,共50H字節(jié)存儲(chǔ)器分配圖DUP操作符的嵌套使用DA2DB10HDUP(4DUP(3),8)7/26/202314(引用變量名)2、變量的使用(1)在指令語句中引用變量名作為地址表達(dá)式的組成部分之一。那么幾種含有變量名的地址表達(dá)式如下:直接尋址:VAR、VAR+08H變址尋址: VAR[SI]、VAR+5[DI]基址尋址: VAR[BX]、VAR+10H[BP]基址變址尋址:VAR[BX][DI]、VAR+06H[BP][SI]例如,設(shè)在某數(shù)據(jù)段中有如下的變量定義:
VARDB40HDUP(?)7/26/202315(2)在數(shù)據(jù)定義語句中引用變量名DW:引用變量名的偏移地址在DW或DD數(shù)據(jù)定義語句的操作數(shù)字段上引用了變量名,那么在為DW或DD偽指令分配的存儲(chǔ)單元中,將預(yù)置被引用變量名的地址部分(段基值和偏移地址)。DD:引用變量的段基值和偏移地址例如:NUM1 DB 10H DUP(?)
NUM2 DW 10H DUP(?)
ARRAYDB 10H DUP('ABCD')
ADR1 DW ARRAY
ADR2 DD ARRAY7/26/2023165.3.3標(biāo)號指令的符號地址,可作為轉(zhuǎn)移類指令的目標(biāo)地址LOP:INCSI
JNZLOP
例如,有程序段如下:1.標(biāo)號的屬性(1)段屬性(SEG)表示指令在哪個(gè)邏輯段中7/26/202317(2)偏移地址屬性(OFFSET)表示這條指令目標(biāo)代碼的首字節(jié)離段起始單元之間的字節(jié)數(shù)——偏移地址。(3)類型屬性(TYPE)表示指令的轉(zhuǎn)移特性。上述兩個(gè)屬性構(gòu)成了指令的邏輯地址。NEAR(近)段內(nèi)轉(zhuǎn)移FAR(遠(yuǎn))段間轉(zhuǎn)移2.標(biāo)號類型的設(shè)置(1)隱含方式直接指定指令的標(biāo)號(NEAR)例如:NEXT:MOVAX,3000H7/26/202318(2)用LABEL偽指令設(shè)置標(biāo)號類型名字LABEL類型格式如下:標(biāo)號NEAR/FAR變量名BYTE/WORD/DWORDLABEL語句與指令語句配合使用例:SUB1_FARLABELFAR
SUB1:MOVAX,1234HMOV語句有兩個(gè)具有相同段和偏移地址屬性的標(biāo)號:SUB1_FAR(FAR)和SUB1(NEAR),但類型屬性不同。7/26/202319LABEL語句與數(shù)據(jù)定義語句配合使用例:DATA_BYTELABELBYTE
DATA_WORDDW20HDUP(567H)DATA_WORD和DATA_BYTE具有相同的段和偏移地址屬性,但類型屬性不同。有語句如下:MOVAX,DATA_WORD+4MOVAL,DATA_BYTE+4傳送第3個(gè)字(5、6字節(jié))傳送第5個(gè)字節(jié)7/26/202320表達(dá)式
常用作指令語句或偽指令語句的操作數(shù);由常數(shù)、變量、標(biāo)號通過運(yùn)算符連接而成;有數(shù)值表達(dá)式和地址表達(dá)式;
匯編時(shí),經(jīng)計(jì)算得到一個(gè)數(shù)值或地址。5.3.4表達(dá)式與運(yùn)算符運(yùn)算符算術(shù)運(yùn)算符邏輯運(yùn)算符關(guān)系運(yùn)算符數(shù)值返回運(yùn)算符屬性運(yùn)算符7/26/202321包括:+(加)、–(減)、(乘)、/(除)、MOD(模除)、SHL(左移)、SHR(右移)1、算術(shù)運(yùn)算符+、-、*、/
運(yùn)算的操作數(shù)和運(yùn)算結(jié)果都是整數(shù);除法運(yùn)算取商的整數(shù),MOD運(yùn)算取除法的余數(shù);減法運(yùn)算可用于同一段內(nèi)的兩個(gè)變量;例:NUM=15*5NUM=NUM/8NUM=NUMMOD5NUM=NUM+4NUM=NUMSHR27/26/202322AND、OR、XOR、NOT2、邏輯運(yùn)算符只用于數(shù)值表達(dá)式;按位進(jìn)行邏輯操作;在匯編過程中完成運(yùn)算;通常出現(xiàn)在源操作數(shù)中。MOVAL,NOT0F0HMOVBL,55HOR0F0HANDBH,55HAND0F0HXORCX,55HXOR50H例:3、關(guān)系運(yùn)算符
EQ(相等)、NE(不等)、LT(小于)、LE(小于等于)、GT(大于)、GE(大于等于)7/26/202323DA1DB3LT8DA2DB10NE0AHMOVAL,10EQ0AH
MOVBX,DA2GEDA1 格式:<表達(dá)式1><關(guān)系運(yùn)算符><表達(dá)式2>比較兩表達(dá)式的值,兩表達(dá)式的性質(zhì)相同;數(shù)值按無符號數(shù)比較,地址表達(dá)式比較偏移量;關(guān)系成立,結(jié)果為全1;關(guān)系不成立,結(jié)果為0。例:4、數(shù)值返回運(yùn)算符SEG、OFFSET、TYPE、SIZE、LENGTH7/26/202324格式:<數(shù)值返回運(yùn)算符><地址表達(dá)式>存儲(chǔ)器操作數(shù)(1)SEG運(yùn)算符返回段基值變量名標(biāo)號(2)OFFSET運(yùn)算符返回偏移地址(3)TYPE運(yùn)算符返回類型屬性對應(yīng)的數(shù)值類型屬性運(yùn)算結(jié)果變量BYTE1WORD2DWORD4標(biāo)號NEAR-1FAR-27/26/202325(4)LENGTH運(yùn)算符若變量用DUP定義,返回外層DUP的重復(fù)次數(shù);若變量沒用DUP定義,則返回結(jié)果總是1。只用于變量(5)SIZE運(yùn)算符只用于變量是TYPE和LENGTH兩個(gè)運(yùn)算結(jié)果的乘積。
ORG20HVAR1DB10,15,20VAR2DW0FFFFH,100HVAR3DW10HDUP(’A’,4DUP(3))例:MOV AX,SEGVAR1MOV SI,OFFSETVAR2MOV BL,TYPEVAR2MOV CL,LENGTHVAR3MOV CH,SIZEVAR37/26/202326為已分配的存儲(chǔ)單元臨時(shí)設(shè)定類型屬性5、屬性修改運(yùn)算符PTR格式:類型PTR<地址表達(dá)式>例:
DA_BYTEDB 20HDUP(0)
DA_WORDDW 30HDUP(0)┇
MOVWORDPTRDA_BYTE[10],AXMOVBYTEPTRDA_WORD[DI],BLINCBYTEPTR[SI]SUBWORDPTR[BX],30HJMPFARPTRSUB17/26/2023276、運(yùn)算符的優(yōu)先級規(guī)則:先高優(yōu)先級,后低優(yōu)先級;
若有多個(gè)同優(yōu)先級的運(yùn)算符,則從左到右;
圓括號可改變運(yùn)算順序。7/26/202328第4節(jié)80x86宏匯編語言偽指令5.4.1符號定義語句格式:符號EQU<表達(dá)式>功能:將表達(dá)式的值賦給符號1、等值語句EQU常數(shù)/數(shù)值表達(dá)式地址表達(dá)式變量/標(biāo)號/指令助記符例:COUNTEQU5ADR1EQUDS:[BP+14]L1EQUSUBSTARTEQU偽指令不分配存儲(chǔ)單元;在同一源程序中,同一符號不能用EQU偽指令重新定義;7/26/2023292、等號語句=格式:符號=表達(dá)式功能與EQU語句相同;區(qū)別在于等號語句可重新定義符號。5.4.2處理器選擇偽指令用于確定選擇使用哪種指令系統(tǒng),缺省時(shí)為8086/8088指令系統(tǒng)和8087協(xié)處理器指令集。.8086.286.286P.486.486P通常放在源程序的開頭位置。其中,“P”表示保護(hù)模式.386.386P.586.586P7/26/2023305.4.3段結(jié)構(gòu)偽指令1、段定義偽指令SEGMENT/ENDS段名SEGMENT[定位類型][組合類型][使用類型][‘類別名’]段名ENDS格式:
功能:指定邏輯段的名字和范圍、段的起始邊界、段與段之間的連接關(guān)系等。(1)段名必選,開始與結(jié)尾的段名一致(2)定位類型可選,指定裝入時(shí)的起始邊界要求4種:PAGE(頁)、PARA(節(jié))、
WORD(字)、BYTE(字節(jié))7/26/202331(3)組合類型可選,指定段與段之間的連接方式6種:NONE(隱含)、PUBLIC、COMMON、STACK、MEMORY、AT(4)使用類型可選,指定386以上CPU的段模式2種:USE16段基值和偏移地址都是16位
USE32段基值16位,偏移地址32位(5)類別名可選,單引號擴(kuò)起來2、段尋址偽指令A(yù)SSUME格式:ASSUMEsr1:seg1,sr2:seg2,……功能:建立段名與段寄存器之間的聯(lián)系段寄存器名段名7/26/202332DS_DATA SEGMENT VAR1 DB12HDS_DATA ENDSES_DATA SEGMENT VAR2 DB34HES_DATA ENDSCODE SEGMENTVAR3DB56H
ASSUMECS:CODE,DS:DS_DATA,ES:ES_DATASTART: …… ┇ INCVAR1 INCVAR2 INCVAR3 ┇CODE ENDS
ENDSTART例:7/26/2023333、段寄存器的裝載(1)DS
和ES
的裝載用數(shù)據(jù)傳送指令例:MOVAX,DATA_DS;設(shè)置DSMOVDS,AXMOVAX,DATA_ES
;設(shè)置ESMOVES,AX
(2)SS
的裝載自動(dòng)裝載:定義堆棧段時(shí),組合類型置為STACK
。STACK1 SEGMENT PARA
STACK DW 40HDUP(0)STACK1 ENDS用執(zhí)行指令的方法裝載:與DS/ES的裝載方法類似。7/26/202334(3)CS
的裝載使用結(jié)束偽指令END,格式如下:END<地址表達(dá)式>
執(zhí)行轉(zhuǎn)移類指令時(shí),CPU自動(dòng)修改CS和IP。5.4.4段組偽指令GROUP把程序中不同段名的段組成一個(gè)段組,格式如下:<段組名>GROUP<段名1,段名2,……>
段組名由程序設(shè)計(jì)人員設(shè)定;可直接引用段名,也可用SEG<變量名>/<標(biāo)號>;段組內(nèi)各段間的程序轉(zhuǎn)移可按段內(nèi)轉(zhuǎn)移處理;段組內(nèi)各段的數(shù)據(jù)存取操作可用同一個(gè)段寄存器。7/26/2023355.4.5內(nèi)存模式和簡化段定義偽指令1、內(nèi)存模式偽指令格式:.MODEL<內(nèi)存模式>6種模式:Tiny、Small、Medium、
Compact、Large、Huge確定用戶程序中代碼和數(shù)據(jù)在內(nèi)存中的存放方式。2、簡化段定義偽指令.CODE[段名];代碼段.DATA
;數(shù)據(jù)段,已初始化數(shù)據(jù).DATA?
;數(shù)據(jù)段,未初始化數(shù)據(jù).CONST;常數(shù)段7/26/202336例:
.MODELSMALL .STACK20H
;定義堆棧段
.DATA
;定義數(shù)據(jù)段 ┇ ┇
.CODE
;定義代碼段BEGIN:…… ┇ ┇ MOVAH,4CH INT21H ENDBEGIN.FARDATA[段名];遠(yuǎn)數(shù)據(jù)段,已初始化數(shù)據(jù).FARDATA?[段名];遠(yuǎn)數(shù)據(jù)段,未初始化數(shù)據(jù).STACK[長度]
;堆棧段7/26/2023373、預(yù)定義符號類似于EQU偽指令定義的等價(jià)符號,例如:@Model、@Code、@Data、@Fardata、@Stack、@Codesize、@Datasize5.4.6定位和對準(zhǔn)偽指令1、位置計(jì)數(shù)器($)2、定位偽指令(ORG)記錄正在匯編的數(shù)據(jù)或指令的目標(biāo)代碼在當(dāng)前段內(nèi)的偏移地址。$:
表示位置計(jì)數(shù)器的當(dāng)前值。設(shè)置位置計(jì)數(shù)器的值格式:ORG<表達(dá)式>7/26/2023383、對準(zhǔn)偽指令(EVEN)功能:將位置計(jì)數(shù)器的值調(diào)整為偶數(shù)。格式:EVEN5.4.7過程定義偽指令PROC/ENDP過程名PROCNEAR/FAR ┇ RET ┇過程名ENDP指令序列過程定義在邏輯段內(nèi);過程名是必須的;至少有一條返回指令RET。格式:3個(gè)屬性:段、偏移地址、類型屬性;7/26/2023395.4.8包含偽指令I(lǐng)NCLUDE格式:INCLUDE<文件名>功能:將指定文件插入到正在匯編的源程序中。5.4.9標(biāo)題偽指令TITLE格式:TITLE<文本>功能:為程序指定標(biāo)題。不超過80個(gè)字符;指定的標(biāo)題在列表文件中每一頁的第一行顯示。在源程序開始處使用;7/26/202340第5節(jié)宏指令1、宏指令的使用過程3步:宏定義、宏調(diào)用和宏展開(1)宏定義宏名MACRO[形參1,形參2,……]
┇
ENDM宏體例:定義宏,交換兩個(gè)存儲(chǔ)單元的數(shù)據(jù)XCHAGEMACRO
MEM1,MEM2,REG MOVREG,MEM1 XCHGREG,MEM2 MOVMEM1,REG
ENDM7/26/202341(2)宏調(diào)用宏名[實(shí)參1,實(shí)參2,……](3)宏展開宏匯編程序掃描宏指令語句(宏調(diào)用)時(shí),用宏體的目標(biāo)代碼插入宏調(diào)用處;對帶參數(shù)的宏,用實(shí)參代替形參,并對宏體中出現(xiàn)參數(shù)的地方作適當(dāng)修改。2、宏操作符(1)連接操作符&功能:在宏定義的宏體內(nèi)連接形參。例,可對前面定義的宏調(diào)用如下:XCHAGE[SI],[DI],AX7/26/202342(2)表達(dá)式操作符%格式:%表達(dá)式功能:告訴宏匯編程序獲取表達(dá)式的值而不是表達(dá)式本身。(3)文本操作符<>功能:將包含分隔符的實(shí)參擴(kuò)起來,作為一個(gè)單一的實(shí)參。例:SHIFT_VARMACROR_M,DRECT,COUNT MOVCL,COUNT
S&DRECTR_M,CL ENDM宏調(diào)用:SHIFT_VARAX,HL,2例:XCHAGE<BYTEPTR[SI]>,[DI],AL7/26/202343只能用于宏定義中,宏體第一條語句;匯編時(shí),符號展開為??XXXX
的形式。4、宏庫多個(gè)宏定義以文件形式組織成宏庫。使用時(shí)用INCLUDE偽指令。(4)字符操作符!格式:!字符“!”后的字符不作操作符使用,而是字符本身。3、LOCAL偽指令格式:
LOCAL<符號表>7/26/202344第6節(jié)匯編語言程序設(shè)計(jì)基本技術(shù)5.6.1程序設(shè)計(jì)步驟分析問題,建立數(shù)學(xué)模型;確定算法;編制程序流程圖;編制程序;調(diào)試程序。5.6.2順序程序設(shè)計(jì)按編寫指令的順序執(zhí)行,且每條指令只執(zhí)行一次。指令1指令2指令n-1指令n順序程序結(jié)構(gòu)圖7/26/202345例:試編制程序,計(jì)算下列公式的值,并將結(jié)果存放 在FUN存儲(chǔ)單元中。
F其中X,Y,Z的值分別存放在VARX、VARY、VARZ三個(gè)字存儲(chǔ)單元中,且計(jì)算過程的中間值和最后結(jié)果仍在16位二進(jìn)制數(shù)的范圍內(nèi)。編制源程序如下:
TITLEEXAMPLEPROGRAM
DATASEGMENT ;設(shè)置數(shù)據(jù)段
VARX DW123H ;變量X VARY DW456H ;變量Y VARZ DW789H ;變量Z FUN DW? ;結(jié)果單元
DATAENDS STACK1SEGMENTPARA
STACK
;設(shè)置堆棧段
DW20HDUP(0)
STACK1ENDS7/26/202346CODE SEGMENT
;設(shè)置代碼段
ASSUMECS:CODE,DS:DATA,SS:STACK1START:
MOV AX,DATA ;置段基值于DS MOV DS,AX MOV AX,VARX ;取變量X ADD AX,VARY ;AX(X+Y)
MOV BX,AX ;BX(X+Y)
SAL AX,1 ;AX2*(X+Y)
SAL AX,1 ;AX4*(X+Y)
ADD AX,BX ;AX5*(X+Y)
SAL AX,1 ;AX10*(X+Y)
MOV BX,VARZ ;取變量Z DEC BX ;BX(Z1)
MOV CX,BX ;CX(Z1)
SAL BX,1 ;BX2*(Z1)
ADD BX,CX ;BX3*(Z1)
SUB AX,BX ;AX10*(X+Y)
3*(Z1) SAR AX,1 ;AX{10*(X+Y)
3*(Z1)}/2 MOV FUN,AX ;存放計(jì)算結(jié)果
MOV AH,4CH ;終止用戶程序,返回DOS INT 21HCODE ENDS
ENDSTART7/26/202347例:用查表方法將一位十六進(jìn)制數(shù)(0~9,A~F) 轉(zhuǎn)換成它對應(yīng)的ASCII碼。首先在數(shù)據(jù)段建立一個(gè)表TABLE,按照十六進(jìn)制數(shù)從小到大(即從0~9到A~F)的順序,在表中存入它們對應(yīng)的ASCII碼值(十六進(jìn)制數(shù)用大寫英文字母A~F)。為查出某個(gè)數(shù)的ASCII碼,需計(jì)算它在內(nèi)存中的地址。用簡化段定義偽指令,編制源序如下:
.MODELSMALL ;設(shè)置內(nèi)存模式
.DATA ;設(shè)置數(shù)據(jù)段
TABLEDB30H,31H,32H,33H,34H,35H,36H,37H DB38H,39H,41H,42H,43H,44H,45H,46H
HEX DB4 ASCI DB?P2337/26/202348.STACK100H
;設(shè)置堆棧段.CODE
;設(shè)置代碼段START:MOV AX,@DATA MOV DS,AX
LEA BX,TABLE;取表首址
XOR AH,AH;AH清零
MOV AL,HEX;取一位十六進(jìn)制數(shù)
ADD BX,AX ;確定查表位置
MOV AL,[BX];查表
MOV ASCI,AL;存結(jié)果
MOV AH,4CH ;終止程序,返回DOS INT 21H
END START7/26/2023495.6.3分支程序設(shè)計(jì)1、轉(zhuǎn)移指令無條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令直接尋址間接尋址段內(nèi)轉(zhuǎn)移段間轉(zhuǎn)移單條件轉(zhuǎn)移指令無符號數(shù)條件轉(zhuǎn)移指令符號數(shù)條件轉(zhuǎn)移指令段內(nèi)轉(zhuǎn)移段間轉(zhuǎn)移P2357/26/202350(1)無條件轉(zhuǎn)移指令格式:JMP目標(biāo)地址目標(biāo)地址有兩種表達(dá)方式a.直接尋址:目標(biāo)地址通常是標(biāo)號段內(nèi)轉(zhuǎn)移:相對轉(zhuǎn)移,指令給出位移量DISP;執(zhí)行操作:IP(IP)+DISP段間轉(zhuǎn)移:指令中給出目標(biāo)地址的段基值和偏移地址;執(zhí)行操作:IP偏移地址
CS段基值例如:JMPNEXT;NEXT為標(biāo)號JMP指令的下一指令與目標(biāo)地址所指的指令之間的字節(jié)距離7/26/202351b.間接尋址:目標(biāo)地址通常由寄存器或存儲(chǔ)單元提供段內(nèi)轉(zhuǎn)移:寄存器或存儲(chǔ)單元提供偏移地址執(zhí)行操作:IP偏移地址段間轉(zhuǎn)移:由一個(gè)雙字單元提供目標(biāo)地址的段基值和偏移地址;執(zhí)行操作:IP偏移地址
CS段基值(2)條件轉(zhuǎn)移指令格式:Jxx
目標(biāo)地址只能在段內(nèi)轉(zhuǎn)移,而且是相對轉(zhuǎn)移。xx為轉(zhuǎn)移條件7/26/202352a.單條件轉(zhuǎn)移指令指令轉(zhuǎn)移條件含義JCCF=1有進(jìn)位/借位轉(zhuǎn)移JNCCF=0無進(jìn)位/借位轉(zhuǎn)移JE/JZZF=1相等/等于0轉(zhuǎn)移JNE/JNZZF=0不相等/不等于0轉(zhuǎn)移JSSF=1是負(fù)數(shù)轉(zhuǎn)移JNSSF=0是正數(shù)轉(zhuǎn)移JOOF=1有溢出轉(zhuǎn)移JNOOF=0無溢出轉(zhuǎn)移JP/JPEPF=1有偶數(shù)個(gè)“1”轉(zhuǎn)移JNP/JPOPF=0有奇數(shù)個(gè)“1”轉(zhuǎn)移P2377/26/202353b.無符號數(shù)條件轉(zhuǎn)移指令指令轉(zhuǎn)移條件含義JA/JNBECF=0ANDZF=0A>B轉(zhuǎn)移JAE/JNBCF=0ORZF=1AB轉(zhuǎn)移JB/JNAECF=1ANDZF=0A<
B轉(zhuǎn)移JBE/JNACF=1ORZF=1AB轉(zhuǎn)移c.符號數(shù)條件轉(zhuǎn)移指令指令轉(zhuǎn)移條件含義JG/JNLESF=OFANDZF=0A>B轉(zhuǎn)移JGE/JNLSF=OFORZF=1AB轉(zhuǎn)移JL/JNGESFOFANDZF=0A<
B轉(zhuǎn)移JLE/JNGSFOFORZF=1AB轉(zhuǎn)移P2377/26/2023542、分支程序設(shè)計(jì)(1)比較/測試——分支結(jié)構(gòu)比較/測試——分支結(jié)構(gòu)程序流程P2387/26/202355例:編程序段,把DA1字節(jié)數(shù)據(jù)變?yōu)榕紨?shù)。分析:若二進(jìn)制數(shù)最低位為0,則為偶數(shù)。程序段流程程序段如下:
TESTDA1,01H
JENEXTINCDA1
NEXT:……例:設(shè)數(shù)據(jù)段中NUM1,NUM2兩字節(jié)單元中有 無符號整數(shù),編程完成下面的操作:7/26/202356
如兩個(gè)數(shù)均是偶數(shù),兩個(gè)數(shù)加1后分別送入
DA1、DA2字節(jié)單元中;如兩個(gè)數(shù)均是奇數(shù),兩個(gè)數(shù)分別直接送入DA1、 DA2字節(jié)單元中;如一個(gè)是奇數(shù),一個(gè)是偶數(shù),則奇數(shù)直接送 DA1字節(jié)單元,偶數(shù)直接送DA2字節(jié)單元。分析:依次測試NUM1和NUM2的奇偶性,有4種情況。NUM1奇偶NUM2偶DA1NUM1,DA2NUM2DA1NUM1,DA2NUM2DA1NUM2,DA2NUM1DA1NUM1+1,DA2NUM2+1奇偶奇7/26/202357根據(jù)分析,畫出流程圖如下:程序段如下: MOVAL,NUM1 MOVAH,NUM2 TESTAL,01H JNEEND0
TESTAH,01H JNEL1INCAL INCAH JMPEND0L1: XCHGAL,AHEND0:MOVDA1,AL MOVDA2,AH ……L1END0P2407/26/202358(2)用跳轉(zhuǎn)表形成多路分支結(jié)構(gòu)假設(shè)某程序根據(jù)不同情況在5個(gè)計(jì)算公式中選擇1個(gè)??删幹?個(gè)程序段,分別完成1個(gè)公式的運(yùn)算。在程序中構(gòu)造跳轉(zhuǎn)表,有兩種情況。例:由分支的入口地址構(gòu)成跳轉(zhuǎn)表。跳轉(zhuǎn)表在數(shù)據(jù)段,表中每一項(xiàng)都是一個(gè)分支的偏移地址。為轉(zhuǎn)移到第N個(gè)公式,需先找到該分支的入口地址。入口地址在跳轉(zhuǎn)表中的偏移量為2*(N-1)。7/26/202359數(shù)據(jù)段如下:DATA SEGMENTJUMP_TABLE DWSUB1,SUB2,SUB3,SUB4,SUB5PARAM DB3 DATA ENDS實(shí)現(xiàn)多路分支的程序段如下:XOR AX,AXMOV AL,PARAM;取參數(shù)DEC AL ;計(jì)算2*(PARAM-1)SHL AL,1MOV BX,OFFSETJUMP_TABLEADD BX,AXMOV AX,[BX]
;取轉(zhuǎn)移的入口地址JMP AX ;間接轉(zhuǎn)移到分支入口7/26/202360例:由轉(zhuǎn)移指令構(gòu)成跳轉(zhuǎn)表的多路分支程序設(shè)計(jì)。跳轉(zhuǎn)表在代碼段,表中每一項(xiàng)都是JMP指令代碼。為轉(zhuǎn)移到第N個(gè)公式,需先轉(zhuǎn)移到跳轉(zhuǎn)表中對應(yīng)的JMP指令(在表中的偏移量為3*(N-1),再通過這里的JMP指令轉(zhuǎn)移到對應(yīng)的計(jì)算公式。實(shí)現(xiàn)多路分支的程序段如下:
XORBX,BXMOVBL,PARAM;取參數(shù)
DECBL ;參數(shù)減1MOVAL,BL ;再乘3SHLBL,1ADDBL,ALADDBX,OFFSETJUMP_TABLE
JMPBX ;轉(zhuǎn)至跳轉(zhuǎn)表JUMP_TABLE:JMPSUB1;轉(zhuǎn)至分支
……7/26/2023615.6.4循環(huán)程序設(shè)計(jì)1、循環(huán)控制指令(1)LOOP指令屬于程序轉(zhuǎn)移類指令格式:LOOP目標(biāo)地址例:編制程序,產(chǎn)生n個(gè)數(shù)據(jù)的裴波納契數(shù)列。裴波納契數(shù)列中,a1=0,a2=1,從第3個(gè)數(shù)開始,an=an-1+an-2
。數(shù)據(jù)段中數(shù)據(jù)定義如下:FIBONADW100DUP(0);存放數(shù)列NDB20H;數(shù)據(jù)個(gè)數(shù)功能:循環(huán)計(jì)數(shù)(CX減1)后,判斷循環(huán)是否結(jié)束: 若(CX)≠0,則繼續(xù)循環(huán),否則順序執(zhí)行。P2447/26/202362產(chǎn)生數(shù)列的程序段如下: ┇
XORCX,CX MOV CL,n LEA DI,F(xiàn)IBONA MOV AX,0 MOV BX,1LOP:
MOV [DI],AX XCHGAX,BX ADD AX,BX ADD DI,TYPEFIBONA LOOP
LOP ┇7/26/202363(2)LOOPE/LOOPZ指令格式:LOOPE目標(biāo)地址
LOOPZ目標(biāo)地址例:編程,在字符串中查找第一個(gè)非空字符,并將其在字符串中序號(1n)送入INDEX單元。若未找到非空字符,則將全1送入INDEX單元。分析:逐個(gè)字符與空字符(ASCII碼為20H)進(jìn)行比較,用LOOPE循環(huán)指令。循環(huán)結(jié)束有兩種情況:計(jì)數(shù)為0或找到非空字符,再進(jìn)一步分析。功能:循環(huán)計(jì)數(shù)(CX減1)后,判斷循環(huán)是否結(jié)束: 若(CX)≠0且ZF=1,則繼續(xù)循環(huán),否則順 序執(zhí)行。7/26/202364
MOVCX,COUNT MOVBX,-1NEXT:INCBX CMPSTRING[BX],20H LOOPENEXT
JNEOK MOVBL,0FEH;未找到OK:INCBXMOVINDEX,BL;存結(jié)果程序段:數(shù)據(jù)段中數(shù)據(jù)定義如下:STRINGDB‘CHECKSTRING’COUNTEQU$-STRING;字符串長度INDEXDB?;存結(jié)果P2457/26/202365(3)LOOPNE/LOOPNZ指令格式:LOOPNE目標(biāo)地址
LOOPNZ目標(biāo)地址例:設(shè)數(shù)據(jù)段中有一個(gè)以ARRAY為首地址的字節(jié)數(shù)組?,F(xiàn)要求編制一程序,對數(shù)組中每一數(shù)據(jù)除以0FH,用它的余數(shù)構(gòu)造一個(gè)新數(shù)組YUSHU。當(dāng)ARRAY數(shù)組中數(shù)據(jù)處理完畢,或某次相除時(shí)余數(shù)為0,便停止構(gòu)造新數(shù)組。程序最后將新數(shù)組的數(shù)據(jù)個(gè)數(shù)存放在LEN單元中。功能:循環(huán)計(jì)數(shù)(CX減1)后,判斷循環(huán)是否結(jié)束: 若(CX)≠0且ZF=0,則繼續(xù)循環(huán),否則順 序執(zhí)行。分析:對數(shù)組元素依次作除法,判斷余數(shù)是否為0。用循環(huán)指令LOOPNZ控制循環(huán),結(jié)束循環(huán)后,再進(jìn)一步分析。P2467/26/202366
MOVCX,NUM XORBX,BX MOVDL,0FHNO_ZERO:MOVAL,ARRAY[BX] XORAH,AH DIVDL;除0FH MOVYUSHU[BX],AH INCBX CMPAH,0;余數(shù)為0嗎? LOOPNENO_ZERO
JNEEND0;有余數(shù)為0?
DECBL;有余數(shù)為0END0:MOVLEN,BL數(shù)據(jù)定義如下:ARRAYDB12H,……NUMEQU$-ARRAYYUSHUDBNUMDUP(0)LENDB?程序段:7/26/2023672、循環(huán)程序結(jié)構(gòu)(4)JCXZ指令格式:JCXZ
目標(biāo)地址測試寄存器CX的內(nèi)容7/26/2023683、循環(huán)控制方法(1)計(jì)數(shù)控制循環(huán)例:編程,統(tǒng)計(jì)數(shù)組中相鄰兩數(shù)之間的符號變化的次數(shù)。
MOVCX,COUNT-1 XORBL,BLEXCHANG:MOVAL,[SI]XORAL,[SI+1]TESTAX,80HJENEXTINCBLNEXT:INCSI
LOOPEXCHANG程序段:計(jì)數(shù)器P2497/26/202369(2)條件控制循環(huán)每循環(huán)一次,測試并判斷循環(huán)終止條件是否成立。例:編程,產(chǎn)生給定數(shù)以內(nèi)的裴波納契數(shù)列,并把數(shù)列的個(gè)數(shù)存入LEN單元中。分析:循環(huán)次數(shù)事先未知,只能用條件控制循環(huán)。循環(huán)終止條件:當(dāng)新產(chǎn)生的數(shù)據(jù)大于給定數(shù),則結(jié)束循環(huán)。程序段:
LEADI,FIBOINA XORCL,CL MOVAX,0 MOVBX,1LOP:MOV[DI],AX XCHGAX,BX ADDAX,BX ADDDI,TYPEFIBONA INCCL
CMPAX,NUM;測試
JAEND0;大于,結(jié)束
JMPLOP;小于,繼續(xù)END0:MOVLEN,CLP2507/26/2023705.6.5子程序設(shè)計(jì)子程序用過程定義偽指令定義。1、調(diào)用與返回返回指令格式:
RET調(diào)用指令格式:
CALL子程序名/過程名帶參數(shù)的返回指令格式:RETn(1)段內(nèi)調(diào)用與段內(nèi)返回執(zhí)行操作:保留段點(diǎn)的偏移地址(當(dāng)前IP值),
IP子程序入口地址的偏移地址。段內(nèi)直接調(diào)用:入口地址直接由子程序名提供段內(nèi)間接調(diào)用:入口地址由寄存器/存儲(chǔ)單元提供段內(nèi)返回:IP((SP)),SP(SP)+2,[SP(SP)+n];N為偶數(shù)P2517/26/202371(2)段間調(diào)用與段間返回執(zhí)行操作:保留段點(diǎn)的地址(當(dāng)前CS/IP值),
CS子程序入口地址段基值;
IP子程序入口地址的偏移地址。段間直接調(diào)用:入口地址直接由子程序名提供段間間接調(diào)用:入口地址由雙字單元提供段間返回:IP((SP)),SP(SP)+2;CS((SP)),SP(SP)+2;[SP(SP)+n]2、子程序設(shè)計(jì)方法(1)適當(dāng)?shù)貏澐植⒋_定子程序功能(2)選擇適當(dāng)?shù)膮?shù)傳遞方法7/26/202372(3)信息的保存(4)編寫子程序的文字說明3、子程序設(shè)計(jì)舉例(1)使用寄存器傳遞參量例:編程,對數(shù)據(jù)段中一組字?jǐn)?shù)據(jù)用減奇數(shù)法求平方根,結(jié)果(平方根)依次存入PFG的字節(jié)數(shù)組中。分析:把求平方根的運(yùn)算作為一個(gè)子程序;入口參量(AX):被開方數(shù);出口參量(CL):平方根。減奇數(shù)法開平方的算法:被開方數(shù)S逐個(gè)減去1開始的連續(xù)自然數(shù)的奇數(shù)1,3,5,……,直到相減結(jié)果等于0,或不夠減下一個(gè)奇數(shù)為止。夠減的次數(shù)就是S的近似平方根。P2557/26/202373主程序段:LOP:MOVAX,[SI] ;寄存器傳遞入口參數(shù)
PUSHCX ;保存信息
CALLSQR_PROCMOV[DI],CL
;存結(jié)果
POPCX ;恢復(fù)信息
……子程序段:SQR_PROCPROC XORCL,CL MOVDX,1SQR: SUBAX,DX;減奇數(shù)
JBEXIT ;夠減?
INCCL;夠減,計(jì)數(shù)
ADDDX,2;形成下一奇數(shù)
JMPSQR;繼續(xù)循環(huán)EXIT: RETSQR_PROC ENDP7/26/202374(2)使用存儲(chǔ)單元傳遞參量對上一例,入口參量(被開方數(shù)KFS)和出口參量(平方根SQRT)用存儲(chǔ)單元傳遞,程序修改如下:主程序段:LOP:MOVAX,[SI]MOVKFS,AXCALLSQR_PROCMOVAL,SQRTMOV[DI],AL……子程序段:SQR_PROCPROC …… MOVAX,KFS MOVSQRT,0 MOVDX,1SQR: SUBAX,DX JBEXIT INCSQRT
……SQR_PROC ENDP7/26/202375(3)使用地址表傳遞參量參量較多時(shí),先把參量所在的地址組成一個(gè)地址表,將地址表的首地址傳遞給子程序。例:編程,將兩個(gè)8位和16位的二進(jìn)制數(shù)分別轉(zhuǎn)換為相應(yīng)二進(jìn)制數(shù)的ASCII碼。分析:主程序提供待轉(zhuǎn)換數(shù)據(jù)、數(shù)據(jù)位數(shù)和轉(zhuǎn)換后存放ASCII碼的首址等3個(gè)參數(shù)的地址,并組成組成一個(gè)地址表,傳遞地址表首地址給子程序。設(shè)數(shù)據(jù)定義如下:BIN8 DB35HBIN16 DW0AB48HNUM DB8,16ASCBUF DB20HDUP(0)ADR_TAB DW3DUP(0)7/26/202376主程序段:地址均為16位的……MOVADR_TAB,OFFSETBIN8MOVADR_TAB+2,OFFSETNUMMOVADR_TAB+4,OFFSETASCBUFMOVBX,OFFSETADR_TAB;通過BX傳遞地址表首址CALL…… ;子程序調(diào)用
……子程序段:……MOVDI,[BX];取二進(jìn)制數(shù)地址MOVDH,[DI] ;取二進(jìn)制數(shù)……MOVDI,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年拍賣師資格考試題庫大全(含答案)
- 2024年企業(yè)人力資源管理師(三級)考前沖刺備考速記速練300題(含答案)
- 2025年度個(gè)人科技產(chǎn)品代理傭金協(xié)議
- 2025年度鋼材貿(mào)易結(jié)算與融資服務(wù)合同
- 2025年度個(gè)人債務(wù)轉(zhuǎn)讓與債務(wù)清理執(zhí)行協(xié)議4篇
- 網(wǎng)絡(luò)素養(yǎng)教育與小學(xué)生信息保護(hù)
- 二零二五年度新型建筑材料OEM研發(fā)與市場推廣協(xié)議3篇
- 2025年度個(gè)人地皮使用權(quán)轉(zhuǎn)讓與土地增值收益分配協(xié)議2篇
- 二零二五年度金融科技產(chǎn)品安全審查合同3篇
- 科技驅(qū)動(dòng)的綠色家居裝飾材料
- 七年級下冊-備戰(zhàn)2024年中考?xì)v史總復(fù)習(xí)核心考點(diǎn)與重難點(diǎn)練習(xí)(統(tǒng)部編版)
- 2024年佛山市勞動(dòng)合同條例
- 污水管網(wǎng)規(guī)劃建設(shè)方案
- 城鎮(zhèn)智慧排水系統(tǒng)技術(shù)標(biāo)準(zhǔn)
- 采購管理制度及流程采購管理制度及流程
- 新修訂藥品GMP中藥飲片附錄解讀課件
- 五年級美術(shù)下冊第9課《寫意蔬果》-優(yōu)秀課件4人教版
- 節(jié)能降耗課件
- 尼爾森數(shù)據(jù)市場分析報(bào)告
- 氧氣霧化吸入法
- 領(lǐng)導(dǎo)干部個(gè)人有關(guān)事項(xiàng)報(bào)告表(模板)
評論
0/150
提交評論