在傳統的匯編語言程序設計中,選擇結構程序設計一般用轉移指令(JMP)加標號來實現,這種程序結構實際上並不是真正的選擇結構;在循環程序設計中,一般用循環指令(LOOP)或轉移指令來實現循環,這種結構也不具有結構化程序中的"WHILE循環"或"REPEAT循環"的結構特征;在程序分支和循環的控制條件方面,每步判斷只能判斷一個條件,條件增多時,不得不增加判斷指令的條數,在這裡不能應用邏輯表達式進行條件判斷。本文介紹一些設計選擇結構程序、循環結構程序、過程子程序及其他一些用於結構化程序設計的語句及用於多條件判斷的邏輯表達式。利用這些語句可設計具有高級語言結構風格的結構化匯編語言程序。
1 程序變量說明
在進行變量說明時,可用[S]BYTE、[S]WORD]、[S]DWORD、FWORD、QWORD、TBYTE、REAL4、REAL8及REAL10類型說明符說明變量類型,其中的可選項[S]表示定義的數據為帶符號數。定義變量的格式為:
[變量名]類型說明符初始值[,初始值]...
2.MODEL偽指令
.MODEL偽指令用於說明存儲器模式等,格式為:
.MODELmemodel[,langtype][,ostype][,stackoption],其中,memmodel為存儲模式,langtype為語言類型(C,PASCAL,BASIC,FORTRAN等),ostype為操作系統類型(OS-DOS),stackoption為棧類型,可取NEARSTACK(SS=DS)或FARSTACK(SS〈〉DS)。
3程序起始及退出代碼的產生
語法: .STARTUP
.EXIT[表達式]
.STARTUP為給定的CPU類型及由.MODEL定義的存儲模式、操作系統及棧類型產生起始代碼,初始化DS、SS及SP,並定義起始地址標號。因而不需要在END指令中給出起始地址標號,程序將自動從.STARTUP處開始執行。在TINY存儲模式時還產生ORG100H指令。
.EXIT產生終止程序、返回操作系統或調用程序的代碼。[表達式]為返回給操作系統或調用程序的一個退出碼。
4選擇結構(塊IF語句)
語法:.IF條件1
語句塊2
[.ELSEIF條件2
語句塊2]
......
[.ELSE 語句塊n]
.END IF
看到,其語法結構和高級語言基本相同,執行情況也相同。其中的條件為一邏輯表達式,其運算符基本同C語言,為:==、!=、>、>=、<、<=、&、!、&&、。組成邏輯表達式的成分可為:變量、寄存器名、常量及符號CARRY?、OVERFLOW?、PARITY?、SIGN?和ZERO?(依次分別表示標志位CF、OF、PF、SF、ZF為1)。邏輯表達式的結果只有真(非0)或假(0)。邏輯表達式的求值順序為從左到右,可用括號改變順序。
上述的選擇結構可以嵌套。
5循環結構
結構1: 結構2: 結構3:
.WHILE條件 .REPEAT .REPEAT
語句塊 語句塊 語句塊
.ENEW .UNTIL條件 .UNTILCXZ[條件]
其中各"條件"均為一邏輯表達式。在語法1中給出的結構為"WHILE型循環",當條件為真時循環。在語法2和語法3中給出的結構均為"UNTIL型循環",當條件為假時循環。在結構3中語句.UNTILCXZ還將使CX減1,並測試其是否為0,當CX為0時也將退出循環。
上述各循環結構均可嵌套。循環體內的.BREAK[.IF條件]語句可無條件或有條件退出各循環,而.CONTINUE[.IF條件]語句可在本次循環中跳過循環體內沒有執行的代碼進入下一輪循環。
6過程的原型說明和調用
過程子程序仍然可用PROC定義,常用的語法可為:
namePROC[distance][langtype][USESreglst][,param[:tag]]...[LOCALvarlst]
過程體
nameENDP
其中,name為過程名,distance說明本過程的屬性,常用的為NEAR和FAR。USES說明過程將要用到的寄存器,它們將自動地在過程入口被保存入棧而在過程出口被彈出。langtype為語言類型。param為該過程的參數(將由棧傳遞)。tag為參數的類型,可為預定義的結構類型,記錄類型或BYTE,WORD......等類型。tag也可為VARARG,表示傳遞的參數個數可變,此時應作為最後一個參數,並應具有C,SYSCALL或STDCALL語言類型。當tag省略時,隱含類型為WORD。LOCAL用於在棧中定義局部變量,這些局部變量能通過名字存取,並能在退出過程時自動釋放。
過程原型說明用PROTO,格式為:
namePROTO[distance][langtype][,[param]:tag]...
過程由PROTO說明後,即可用INVOKE調用。和CALL調用相比,用INVOKE調用過程的優點是能自動將各參數壓入棧,而當從過程返回時被自動清除,並且在需要時,也能根據原型說明進行參數類型的轉換。INVOKE指令的格式為:
INVOKEexpression[,arquments] 其中,expression為要被調用的過程的名字或其地址產生式。arguments為要傳遞到過程的實際參數,可為寄存器對(用::分開)、表達式或"ADDR符號"(ADDR為取地址)。
所附程序的功能為首先取機器的當前年月,並計算該月有多少天。程序中使用了本文介紹的大部分語句或方法。