当前位置: 首页 > 编程语言 > 汇编语言 > 正文

结构化程序方法在汇编语言中的应用

时间:2008-10-14 本站收集整理

在传统的汇编语言程序设计中,选择结构程序设计一般用转移指令(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为取地址)。


  所附程序的功能为首先取机器的当前年月,并计算该月有多少天。程序中使用了本文介绍的大部分语句或方法。