出自于:http://yiluohuanghun.blog.51cto.com/3407300/940198
一个算法用程序设计语言的语句有序的组合在一起加以描述,其组合方式称为程序的控制结构或简称为程序结构
。程序的基本结构有顺序结构,分支结构和循环结构。
一:顺序结构
顺序结构是最简单的,也是最基本的程序结构形式,这种结构形式的程序的最大特点点就是程序运行时从开始到结尾一直是按照编写指令的顺序执行,且每条指令仅执行一次,具有顺序结构的程序或者程序段,成为顺序程序。
我们拿一个简单的程序来说明汇编的顺序程序设计。
例:设两个字存储变量X和Y, 编程实现这两个变量的交换。
分析:由于存储单元之间不能够直接进行数据交换,所以利用通用寄存器AX来作为交换的中介。我在这里给出一个代码范例:
DATA SEGMENT
X DW 1032H
Y DW 2043H
DATA ENDS
STACK SEGMENT
DW 20H DUP(0)
ASSUME CS:CODE, DS:DATA, SS:STACK
START: MOV AX,DATA
MOV DS, AX
MOV AX , X
XCHG AX ,Y
MOV X ,AX
MOV AH, 4CH
INT 21H
CODE ENDS
END START
代码分析:前面一部分是对数据段以及堆栈段的定义,从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值得交换。
二:分支程序设计
实现分支程序需要有相应的转移指令的支持,而转移指令又分为无条件转移转移指令与有条件转移指令两类,在有条件转移指令中,不同的条件往往是通过标志寄存器中条件标志的不同状态反映的。因而,分支程序设计中一个至关重要的问题是如何根据标志寄存器中标志位的不同状态,配合使用合适的转移指令实现程序的转移。关于转移指令请看我的
还是拿例子来说吧:X为存储单元中的有符号字数据,编写程序实现计算其绝对值,并保存到原处。
分析:当X>=0时,X的绝对值就是它本身,否则利用求负指令将X变号,并放回要原处,下面我给出了一个程序,大家可以参考下:
DATA SEGMENT
X DW 0F874H
DATA ENDS
STACK SEGMENT
ASSUME CS:CODE, SS:STACK, DS:DATA
BEGIN: MOV AX,DATA
MOV DS,AX
MOV AX,X
TSET AX,AX ;比较两个数的大小
JNS DONE :跳转到DONE指令,若结果为正转移
NEG X :负指令NEG取反 若结果不为正,则对它进行取反
DONE: MOV AH,4CH
INT 21H
CODE ENDS
END BEGIN
程序分析:TEST
AX, AX;此处目的是为了重置标志寄存器各位的值,以便于下一条指令JNS使用标志寄存器
三:循环程序设计
在进行循环程序设计之前同分支程序设计一样,都要先知道一个基本控制指令,对于循环控制指令有如下4大类:
1、LOOP
TARGET
执行的操作:先将CX<-(CX)-1,如果(CX)不等于0,则将IP指向TARGET的偏移量
2、LOOPZ/LOOPE
TARGET
执行操作:先将CX<-(CX)-1,如果(CX)不等于0并且ZF=1,则将IP指向TARGET的偏移量
3、LOOPNZ/LOOPNE
TARGET
执行操作:先将CX<-(CX)-1,如果(CX)不等于0并且ZF不等于1,则将IP指向TARGET的偏移
4、JCXZ
TARGET
执行操作:测试(CX)是否0,但不对CX寄存器进行修改,如果(CX)=0,那么IP指向TARGET的偏移量
下面还是以实例来说明问题:数据段的ARY数组中存放有10个无符号数,试找出其中最大者送入MAX单元。
分析:首先将数组中的第一个数取出放入AL,然后依次与数组中的其他元素进行比较,将较大者放入AL中,遍历数组
DATA SEGMENT
ARY DB 17,8,9,62,53,48,19,27,68,73
MAX DB ?
DATA ENDS
STACK SEGMENT PARA STACK
DW 20H DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, SS:STACK, DS:DATA
START: 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 BIGGER ;前一个元素大于后一个元素是转移
MOV AL , [SI]; 取较大数AL
BIGGER: LOP LOP :(CX)不等与0则转移
MOV MAX,AL
MOV AH ,4CH
INT 21H
CODE ENDS
END START