《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 解決方案 > 匯編基礎(chǔ):順序、分支與循環(huán)程序設(shè)計(jì)

匯編基礎(chǔ):順序、分支與循環(huán)程序設(shè)計(jì)

2017-06-10
關(guān)鍵詞: 匯編

一個(gè)算法用程序設(shè)計(jì)語(yǔ)言的語(yǔ)句有序地組合在一起加以描述,其組合方式稱為程序的控制結(jié)構(gòu)或簡(jiǎn)稱為程序結(jié)構(gòu)。程序的基本結(jié)構(gòu)形式有順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。

一、順序結(jié)構(gòu)

順序結(jié)構(gòu)是最簡(jiǎn)單的,也是最基本的程序結(jié)構(gòu)形式,這種結(jié)構(gòu)形式的程序的最大特點(diǎn)就是程序運(yùn)行時(shí)從開(kāi)始到結(jié)尾一直是按照編寫(xiě)指令的順序執(zhí)行,且每條指令僅執(zhí)行一次,具有順序結(jié)構(gòu)的程序或者程序段,成為順序程序。

我們拿一個(gè)簡(jiǎn)單的程序來(lái)說(shuō)明匯編的順序程序設(shè)計(jì)。

例:設(shè)兩個(gè)字存儲(chǔ)變量X和Y, 編程實(shí)現(xiàn)這兩個(gè)變量的交換。

分析:由于存儲(chǔ)單元之間不能夠直接進(jìn)行數(shù)據(jù)交換,所以利用通用寄存器AX來(lái)作為交換的中介。我在這里給出一個(gè)代碼范例:

DATA    SEGMENT    
   X   DW  1032H    
   Y   DW  2043H    
DATA    ENDS    
STACK1  SEGMENT PARA STACK    
   DW   20H   DUP (0)    
STACK1  ENDS    
CODE    SEGMENT    
ASSUME CS:CODE, DS:DATA, SS:STACK1    
BEGIN:  MOV     AX, DATA    
   MOV     DS, AX    
   MOV AX, X    
   XCHG    AX, Y    
   MOV X, AX    
   MOV AH, 4CH    
   INT 21H    
CODE    ENDS    
   END

代碼分析:前面一部分是對(duì)數(shù)據(jù)以及堆棧的定義,這里我就不再多說(shuō)了,我們從BEGIN開(kāi)始,因?yàn)閷?duì)于MOV來(lái)說(shuō),不能夠直接將DATA作為源操作數(shù),DS作為目的操作數(shù),所以要通過(guò)一個(gè)通用寄存器來(lái)實(shí)現(xiàn)兩者之間的賦值,MOV   AX, X意為將X的值先保存在AX中,而后執(zhí)行XCHG AX, Y將AX與Y的值進(jìn)行交換,此時(shí)Y里面存儲(chǔ)的便是X的值,AX中存儲(chǔ)的Y的值。緊接著MOV X, AX再將AX中存儲(chǔ)的Y的值賦予X,即實(shí)現(xiàn)X與Y值得交換。

二、分支程序設(shè)計(jì)

實(shí)現(xiàn)分支程序需要有相應(yīng)的轉(zhuǎn)移指令的支持,而轉(zhuǎn)移指令又分為無(wú)條件轉(zhuǎn)移指令與有條件轉(zhuǎn)移指令兩類(lèi),在有條件轉(zhuǎn)移指令中,不同的條件往往是通過(guò)標(biāo)志寄存器中條件標(biāo)志的不同狀態(tài)反映的。因而,分支程序設(shè)計(jì)中一個(gè)至關(guān)重要的問(wèn)題是如何根據(jù)標(biāo)志寄存器中標(biāo)志位的不同狀態(tài),配合使用合適的轉(zhuǎn)移指令實(shí)現(xiàn)程序的轉(zhuǎn)移。關(guān)于轉(zhuǎn)移指令請(qǐng)看我的另一篇文(http://yiluohuanghun.blog.51cto.com/3407300/940123)。

還是拿例子來(lái)說(shuō)吧:X為存儲(chǔ)單元中的有符號(hào)字?jǐn)?shù)據(jù),編寫(xiě)程序?qū)崿F(xiàn)計(jì)算其絕對(duì)值,并保存到原處。

分析:當(dāng)X>=0時(shí),X的絕對(duì)值就是它本身,否則利用求負(fù)指令將X變號(hào),并放回要原處,下面我給出了一個(gè)程序,大家可以參考下:

DATA    SEGMENT    
   X   DW  0F874H    
DATA    ENDS    
STACK1  SEGMENT PARA    STACK    
   DW  20H DUP  (0)    
STACK1  ENDS    
CODE    SEGMENT    
ASSUME  CS:CODE, DS:DATA, SS:STACK1    
BEGIN:  MOV AX, DATA    
   MOV DS, AX    
   MOV AX, X    
   TEST    AX, AX      
   JNS DONE    
   NEG X   ;負(fù)指令NEG對(duì)X取反    
DONE:   MOV AH, 4CH    
   INT 21H    
CODE    ENDS    
   END BEGIN

程序分析:TESTAX, AX;此處目的是為了重置標(biāo)志寄存器各位的值,以便于下一條指令JNS使用標(biāo)志寄存器

三、循環(huán)程序設(shè)計(jì)

在進(jìn)行循環(huán)程序設(shè)計(jì)之前同分支程序設(shè)計(jì)一樣,都要先知道一個(gè)基本控制指令,對(duì)于循環(huán)控制指令有如下4大類(lèi):

1、LOOPTARGET

執(zhí)行的操作:先將CX<-(CX)-1,如果(CX)不等于0,則將IP指向TARGET的偏移量

2、LOOPZ/LOOPETARGET

執(zhí)行操作:先將CX<-(CX)-1,如果(CX)不等于0并且ZF=1,則將IP指向TARGET的偏移量

3、LOOPNZ/LOOPNE   TARGET

執(zhí)行操作:先將CX<-(CX)-1,如果(CX)不等于0并且ZF不等于1,則將IP指向TARGET的偏移

4、JCXZTARGET

執(zhí)行操作:測(cè)試(CX)是否0,但不對(duì)CX寄存器進(jìn)行修改,如果(CX)=0,那么IP指向TARGET的偏移量

下面還是以實(shí)例來(lái)說(shuō)明問(wèn)題:數(shù)據(jù)段的ARY數(shù)組中存放有10個(gè)無(wú)符號(hào)數(shù),試找出其中最大者送入MAX單元。

分析:首先將數(shù)組中的第一個(gè)數(shù)取出放入AL,然后依次與數(shù)組中的其他元素進(jìn)行比較,將較大者放入AL中,遍歷數(shù)組后,AL中存放的就是最大的數(shù)。具體實(shí)現(xiàn)過(guò)成功如下:

DATA    SEGMENT    
   ARY DB  17, 5, 40, 0, 67, 12, 34, 78, 32, 10    
   MAX DB  ?    
DATA    ENDS    
STACK1  SEGMENT PARA    STACK    
   DW  20H DUP  (0)    
STACK1  ENDS    
CODE    SEGMENT    
ASSUME  CS:CODE, SS:STACK1, DS:DATA    
BEGIN:  MOV AX, DATA    
   MOV DS, AX    
   MOV SI, OFFSET  ARY ;SI指向ARY的第一個(gè)元素    
   MOV CX, 9       ;CX作循環(huán)次數(shù)計(jì)數(shù)    
   MOV AL, [SI]        ;取第一個(gè)元素到AL    
LOP:    INC SI      ;SI指向后一個(gè)元素    
   CMP AL, [SI]        ;比較兩個(gè)數(shù)    
   JAE BIGER       ;前一個(gè)元素大于后一個(gè)元素時(shí)轉(zhuǎn)移    
   MOV AL, [SI]        ;取較大數(shù)到AL    
BIGER:  LOOP    LOP     ;(CX)不等于0 則轉(zhuǎn)移    
   MOV MAX, AL    
   MOV AH, 4CH    
   INT 21H    
CODE    ENDS    
   END BEGIN

以上就介紹著三種程序設(shè)計(jì)方式。


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,請(qǐng)及時(shí)通過(guò)電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。