




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