
学习一门语言,我们首先学其基本的数据类型和逻辑表达式的一些基本语句。为了使程序具有更加良好的运行效率,我们还需要学习它的一些设计结构。这一篇我们将以此为大家讲解一些常见的程序结构,以及其在汇编语言中的设计方法。
一个好的程序应满足以下几个要求:
- 结构化、简明、易读、易调试、易维护;
- 执行速度快;
- 占用存储空间尽量少。
常见程序结构:
- 顺序结构
- 分支结构
- 循环结构
- 子程序结构
一、顺序结构
按照程序的书写顺序执行,这样的程序结构就叫做顺序结构。
例:设变量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