您當前的位置:首頁 > 歷史

組合語言程式設計第三篇——彙編程式結構

作者:由 林文澤 發表于 歷史時間:2020-05-18

學習一門語言,我們首先學其基本的資料型別和邏輯表示式的一些基本語句。為了使程式具有更加良好的執行效率,我們還需要學習它的一些設計結構。這一篇我們將以此為大家講解一些常見的程式結構,以及其在組合語言中的設計方法。

一個好的程式應滿足以下幾個要求:

結構化、簡明、易讀、易除錯、易維護;

執行速度快;

佔用儲存空間儘量少。

常見程式結構:

順序結構

分支結構

迴圈結構

子程式結構

一、順序結構

按照程式的書寫順序執行,這樣的程式結構就叫做順序結構。

例:設變數X、Y均為16位無符號數,試寫一個求表示式2X + Y值的程式:

DSEG SEGMENT

X DW 34H ; 表示將十六進位制數 34H 存放到 X 中

Y DW 56H

Z DW ?,? ; ?表示為空,也可以不寫

DSEG ENDS

CSEG SEGMENT

ASSUME CS: CSEG , DS: DSEG

START: MOV AX, DSEG

MOV DS, AX ; 讓DS指向自己定義的資料段

MY_D SEGMENT

XOR DX , DX

MOV AX , X

ADD AX , AX

ADC DX , 0 ; ADC能夠把進位加到D

ADD AX , Y

ADC DX,0

MOV Z , AX

MOV Z+2 , DX

MOV AH , 4CH ; 因為程式都執行完成要返回dos,要將中斷號4ch送AH

INT 21H ; 呼叫dos中斷21h,中斷呼叫號為AH( 即4ch),返回dos

CSEG ENDS

END START

組合語言

中的AX、BX、CX、DX作為CPU內部的通用暫存器中的資料暫存器助記專符用來存放參與運算的資料或是儲存運算的結果。這四個資料暫存器都是16位的,實際由兩個8位暫存器組合而成,這是為了靈活處理8位資料。

二、分支結構

順序結構的程式雖然能解決計算、輸出等問題,但不能做判斷再選擇。對於要先做判斷再選擇的問題就要使用分支結構。分支結構的執行是依據一定的條件選擇執行路徑,而不是嚴格按照語句出現的物理順序。分支結構的程式設計方法的關鍵在於構造合適的分支條件和分析程式流程,根據不同的程式流程選擇適當的分支語句。

例:判斷MEMS單元的資料,若資料>0,結果為1;若資料<0,結果為-1;若資料=0,結果為0;將結果存入MEMD單元:

MY_D SEGMENT

MEMS DB 08H

MEMD DB ?

MY_D ENDS

MY_C SEGMENT

ASSUME DS:MY_D , CS:MY_C

START: MOV AX , MY_D ; 獲取資料段的段地址

MOV DS, AX

MOV AL, MEMS ; 將待比較元素放入AL中

CMP AL, 0

JGE NEXT ; 有符號數如果>=0,則轉向next

MOV AL, -1 ; 如果不滿足 >=0, 則順序執行,給AL賦值-1

JMP DONE ; 無條件跳轉指令

NEXT: JE DONE je ; 表示等於就跳轉

MOV AL, 1 ; 如果不等於的話則賦值為1

DONE: MOV MEMD, AL

MOV AX , 4C00H

INT 21H

MY_C ENDS

END START

三、迴圈結構

在程式設計中遇到需要按照一定的規律或條件,多次重複執行一組指令的情況時,可以用迴圈程式實現。迴圈結構一般根據某一條件判斷為真或為假來確定是否重複執行迴圈體,條件永真或無條件的迴圈就是邏輯上的死迴圈。

迴圈程式通常由三部分組成:

迴圈初始化

迴圈體

迴圈控制部分

例:計算1~100的數字之和,並將結果存入變數SUM中:

DATA SEGMENT

SUM DW ? ; 用於儲存計算結果

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE , DS:DATA

START: MOV AX , DATA

MOV DS , AX

XOR AX , AX ; 將AX清零,將CF標誌位也清零

MOV CX , 100

AGAIN: ADD AX , CX

LOOP AGAIN ; 執行LOOP指令時,CPU自動將CX的值減1,若CX=0,則結束迴圈;

MOV SUM , AX

MOV AH, 4CH

INT 21H

CODE ENDS

END START

四、子程式結構

為了簡化程式設計,常把功能相對獨立的程式段單獨編寫和除錯,作為一個相對獨立的模組供程式使用,這就是子程式。

子程式的呼叫過程是透過CALL指令實現的,子程式的返回則透過RET指令完成。

為了使子程式結構清晰,可以

使用過程定義偽指令PROC和ENDP來定義子程式。

例:編寫子程式將暫存器AX內容乘10,結果仍存在AX中:

主程式:

X EQU 1000

CODE SEGMENT

ASSUME CS:CODE

START: MOV AX, X

CALL MUL10

MOV AX, 4C00H

INT 21H

MUL10 PROC

PUSHF

PUSH BX

ADD AX, AX

MOV BX, AX

ADD AX, AX

ADD AX, AX

ADD AX, BX

POP BX ; 彈出堆疊,恢復現場

POPF

RET

MUL10 ENDP

CODE ENDS

END START

標簽: ax  mov  子程式  DS  結構