汇编语言程序设计
4.1 顺序结构程序设计
顺序程序又称作简单程序。它一般是根据算法编出的完全顺序执行的程序,关于它的流程的设计已经在前面的课程中讲解过了,这里重点讲解编写汇编语言程序时候应该注意的问题。虽然,顺序结构的流程很简单,但是,很多学生在编写程序时会出现一些问题,主要有:
1) 数据类型不匹配;
2) 计算机资源的使用有冲突;
3) 忽视汇编语言指令的一些缺省的条件。
下面介绍一个简单的顺序程序设计实例:
例4.1:
将变量X的值加上变量Y的值,结果保存在变量Z中。
分析:这个题目的流程很简单,但是要注意汇编语言的特点。
程序如下:
;…………数据段…………
DATA SEGMENT
X DB 6 ;X是一个字节类型的变量
Y DB 9 ;Y是一个字节类型的变量
Z DB ? ;Z是一个字节类型的变量
DATA ENDS
;…………代码段…………
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA ;DATA不能直接赋值给DS
MOV DS,AX ;对DS赋值
MOV AL,X ;存储器寻址方式不能确定数据类型
MOV BL,Y ;X、Y先分别送到不同的字节(8位)寄存器中
ADD AL,BL
MOV Z,AL
HLT
CODE ENDS
END START
下面再介绍一个程序实例。
例4.2:
变量A乘以变量B再除以C,结果保存在D中。
分析:这个例题的流程仍然比较简单,但是要注意乘法指令与除法指令的使用以及寄存器的使用。
程序如下:
;…………数据段…………
DATA SEGMENT
A DB 5
B DB 12
C DB 6
D DB ?
DATA ENDS
;…………代码段…………
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV AL,A
MOV BL,B
MUL BL
MOV BL,C
DIV BL
MOV D,AL
HLT
CODE ENDS
END START
这里应该特别注意寄存器的使用不要冲突。
虽然实际应用的程序比顺序结构复杂的多,但它是构成程序的基础,它的质量直接影响整个程序的质量,因此如何充分利用硬件资源,合理地选择指令是编制简单程序,提高整个汇编语言程序质量的关键。
例4.3:
设在X单中存放一个0-9之间的整数,用查表法求出其平方值,并将结果存入Y单元。
分析:根据题意,首先将0-9所对应的平方值存入连续的八个单元中,构成一张平方值表,其首地址为SQTAB。
由表的存放规律可知:表首址SQTAB与X单元中的数i之和,正是i2所在单元的的地址。
程序如下:
;…………数据段…………
DATA SEGMENT
SQTAB DB 0,1,4,9,16,25,36,49,64,81;平方值表
X DB 5
Y DB ?
DATA ENDS
;…………堆栈段…………
STACK SEGMENT PARA STACK ‘STACK’
TAPN DB 100 DUP (?)
TOP EQU LENGTH TAPN
STACK ENDS
;…………代码段…………
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX ;对DS段寄存器赋值
MOV AX,STACK
MOV SS,AX ;对SS段寄存器赋值
MOV AL,X ;取数I
MOV AH,0 ;注意这一行的作用
MOV BX,OFFSET SQTAB;BX<-表首址
ADD BX,AX
MOV AL,[BX] ;取i2并保存
MOV Y,AL
HLT
CODE ENDS
END START
对这个问题还可以用另外一种方式来解决:
例4.3_b:
…
…;前面的同例4.3
START:MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV AL,X
MOV BX,OFFSET SQTAB;
XLAT
ADD BX,AX
MOV Y,AL
HLT
CODE ENDS
END START
显然,上面两个代码段用到了不同的指令,致使程序的长短、效率自然也不相同。
下面再举两个综合的题目。
例4.4:
计算公式F= X3 Y2 Z-1000,假设X、Y均在0~9之间,|Z|≤100
分析:将前面几个例题中讲解的知识合在一起考虑。
程序如下:
:…………数据段…………
DATA SEGMENT
XYZF DW 7,6,97,? ;分别对应为变量X、Y、Z和结果的值
X3 DW 0,1,8,27,64,125,216,343,512,729;立方值表
Y3 DW 0,1,4,9,16,25,36,49,64,81 ;平方值表
DATA ENDS
;…………代码段…………
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:;
MOV AX,DATA
MOV DS,AX
;
MOV BX,OFFSET X3
MOV AX,[XYZF]
ADD AX,AX
ADD BX,AX
MOV DX,[BX]
;
MOV BX,OFFSET Y2
MOV AX,[XYZF 2]
ADD AX,AX
ADD BX,AX
MOV AX,[BX]
;
ADD DX,AX
ADD DX,[XYZF 4]
SUB DX,1000
MOV [XYZF 6],DX
HLT
CODE ENDS
END START
例4.5:
试编写一程序计算表达式W=(V-(X*Y Z-100))/X的值。式中X、Y、Z、V均为有符号字数据变量,
结果存放在双字变量W之中,
程序如下:
;…………数据段…………
DATA SEGMENT
X DW 200
Y DW 100
Z DW 3000
V DW 10000
W DW 2 DUP (?)
DATA ENDS
;…………代码段…………
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
;
MOV AX,X
MOV BX,Y
IMUL BX
MOV CX,AX
MOV BX,DX
MOV AX,Z
CWD
ADD,CX,AX
ADC,BX,DX
SUB CX,100
SBB BX,0
MOV AX,V
CWD
SUB AX,CX
SBB DX,BX
MOV BX,X
IDIV BX
;
MOV W,AX
MOV W 2,DX
HLT
CODE ENDS
END START