一個算法用程序設計語言的語句有序地組合在一起加以描述,其組合方式稱為程序的控制結構或簡稱為程序結構。程序的基本結構形式有順序結構、分支結構和循環結構。
一、順序結構
順序結構是最簡單的,也是最基本的程序結構形式,這種結構形式的程序的最大特點就是程序運行時從開始到結尾一直是按照編寫指令的順序執行,且每條指令僅執行一次,具有順序結構的程序或者程序段,成為順序程序。
我們拿一個簡單的程序來說明匯編的順序程序設計。
例:設兩個字存儲變量X和Y, 編程實現這兩個變量的交換。
分析:由於存儲單元之間不能夠直接進行數據交換,所以利用通用寄存器AX來作為交換的中介。我在這裡給出一個代碼范例:
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
代碼分析:前面一部分是對數據以及堆棧的定義,這裡我就不再多說了,我們從BEGIN開始,因為對於MOV來說,不能夠直接將DATA作為源操作數,DS作為目的操作數,所以要通過一個通用寄存器來實現兩者之間的賦值,MOV AX, X意為將X的值先保存在AX中,而後執行XCHG AX, Y將AX與Y的值進行交換,此時Y裡面存儲的便是X的值,AX中存儲的Y的值。緊接著MOV X, AX再將AX中存儲的Y的值賦予X,即實現X與Y值得交換。
二、分支程序設計
實現分支程序需要有相應的轉移指令的支持,而轉移指令又分為無條件轉移指令與有條件轉移指令兩類,在有條件轉移指令中,不同的條件往往是通過標志寄存器中條件標志的不同狀態反映的。因而,分支程序設計中一個至關重要的問題是如何根據標志寄存器中標志位的不同狀態,配合使用合適的轉移指令實現程序的轉移。關於轉移指令請看我的另一篇文(http://yiluohuanghun.blog.51cto.com/3407300/940123)。
還是拿例子來說吧:X為存儲單元中的有符號字數據,編寫程序實現計算其絕對值,並保存到原處。
分析:當X>=0時,X的絕對值就是它本身,否則利用求負指令將X變號,並放回要原處,下面我給出了一個程序,大家可以參考下:
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 ;負指令NEG對X取反 DONE: MOV AH, 4CH INT 21H CODE ENDS END BEGIN
程序分析:TESTAX, AX;此處目的是為了重置標志寄存器各位的值,以便於下一條指令JNS使用標志寄存器
三、循環程序設計
在進行循環程序設計之前同分支程序設計一樣,都要先知道一個基本控制指令,對於循環控制指令有如下4大類:
1、LOOPTARGET
執行的操作:先將CX<-(CX)-1,如果(CX)不等於0,則將IP指向TARGET的偏移量
2、LOOPZ/LOOPETARGET
執行操作:先將CX<-(CX)-1,如果(CX)不等於0並且ZF=1,則將IP指向TARGET的偏移量
3、LOOPNZ/LOOPNE TARGET
執行操作:先將CX<-(CX)-1,如果(CX)不等於0並且ZF不等於1,則將IP指向TARGET的偏移
4、JCXZTARGET
執行操作:測試(CX)是否0,但不對CX寄存器進行修改,如果(CX)=0,那麼IP指向TARGET的偏移量
下面還是以實例來說明問題:數據段的ARY數組中存放有10個無符號數,試找出其中最大者送入MAX單元。
分析:首先將數組中的第一個數取出放入AL,然後依次與數組中的其他元素進行比較,將較大者放入AL中,遍歷數組後,AL中存放的就是最大的數。具體實現過成功如下:
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的第一個元素 MOV CX, 9 ;CX作循環次數計數 MOV AL, [SI] ;取第一個元素到AL LOP: INC SI ;SI指向後一個元素 CMP AL, [SI] ;比較兩個數 JAE BIGER ;前一個元素大於後一個元素時轉移 MOV AL, [SI] ;取較大數到AL BIGER: LOOP LOP ;(CX)不等於0 則轉移 MOV MAX, AL MOV AH, 4CH INT 21H CODE ENDS END BEGIN
以上就介紹著三種程序設計方式。在我們的下一篇我們就開始我們的子程序設計專題了。
本文出自 “驿落黃昏” 博客,請務必保留此出處http://yiluohuanghun.blog.51cto.com/3407300/940198