计算机系统平台
上QQ阅读APP看书,第一时间看更新

2.4 汇编程序设计举例

汇编语言程序设计的基本步骤如下:

①分析问题:先对题目进行全面的分析,找出规律,形成基本思路。

②确定算法:选择一个合适的算法或数据结构来实现程序,如果没有可供选择的算法或数据结构,就需要针对具体问题进行设计。

③绘制流程图:流程图的功能使用图形化的方式把解决问题的算法描述出来。对于一个复杂的问题,画出流程图有助于理解问题和正确编写程序。

④分配存储空间和工作单元:用汇编语言编写程序时,需要给程序中的变量分配内存单元地址或者指定寄存器。

⑤编写程序:要把题目中需要处理的数据合理地根据前面几步的工作,选用合适的指令,按照一定的语法规则编写程序。

⑥静态检查:用人工的方式检查程序是否有错误,包括算法错误和语法错误等。如果有错误,及时改正。只有认真检查,才能发现和改正程序中的大部分错误。

⑦上机调试运行:利用机器提供的debug工具和其他工具软件进行程序的运行和调试,经过反复的“运行-发现错误-改正错误-运行”,才能最终得到正确的程序。

接下来,以TEC-2008教学计算机的指令系统为基础,举例说明汇编程序设计的几种不同结构。

(1)顺序结构程序设计

顺序程序是没有分支、没有循环的直线运行程序,程序执行按照IP内容自动增加的顺序进行。例如,下面是一段简单的用于在屏幕上输出字符的程序:

例1:在屏幕上输出显示一个字符‘6’。

A 2000;地址从十六进制的2000开始(内存RAM区的起始地址)

2000: MVRD R0,36;把字符‘6’的ASCII码送入R0

2002: OUT 80;输出显示字符‘6’,80为串口地址

2003: RET;每个用户程序都必须用RET指令结束

2004:(按回车键即结束源程序的输入过程)

(2)选择结构程序设计

选择结构又称选取结构或分支结构,此结构中必然包含一个判断,当给定的条件成立或者不成立的情况下,分别选择不同的分支路径进行执行。

例2:根据不同的条件(寄存器R1的值是否大于等于0)在屏幕上显示字符'0'或'1'。

A 2020;地址从十六进制的2020开始

2020: SHL R1;将R1左移一次

2021: JRC

2022: MVRD R0,0030;把字符'0'送入R0寄存器

2024: JR 2027;转去输出

2025: MVRD R0,0031;把字符'1'送入R0寄存器

2027: OUT 80;输出R0中存放的字符

2028: RET;程序结束

例2的程序在R1寄存器中的值是负数时输出1,非负数(≥0)时输出0。

(3)循环结构程序设计

循环结构又称重复结构,指反复执行某一部分的操作。

例3:计算1到10的累加和。

A 2060

MVRD R1 ,0000;置累加和的初值为0

MVRD R2 ,000A;最大的加数

SUB R3 ,R3;预置参加累加的数为0

(2065) INC R3;得到下一个参加累加的数

ADD R1 ,R3;累加计算

CMP R3 ,R2;判断是否累加完

J RNZ 2065;未完,开始下一轮累加

RET

例3通过循环十次达到了计算累加和的效果。运行过后,可以用R命令查看R1中的累加结果。

(4)子程序调用

有时候,主程序中需要多次调用某种功能来实现一些操作,在这种情况下,实现一小段子程序并在主程序中对其进行调用则可以在很大程度上使得程序更加清晰、结构更加清楚。

例4:设计一个有读写内存和子程序调用指令的程序,功能是读出指定内存中的大写字母字符,将其显示到屏幕上,转换为小写字母后再写回存储器的原存储单元。(用E命令送6个字符‘A’~‘F’到内存20F0开始的存储区域中,运行后用D命令查看。)

A 2080

MVRD R3 ,0006;指定被读数据的个数

MVRD R2 ,20F0;指定被读、写数据内存区首地址

(2084) LDRR R0,[R2];读内存中的一个字符到R0寄存器

CALA 2100;调用子程序,入口地址为2100

DEC R3;检查输出的字符个数

JRZ 208B;完成输出则结束程序的执行过程

INC R2;未完成,修改内存地址

JR 2084;转移到程序的2084处,循环执行规定的处理

(208B) RET

A 2100;输入用到的子程序到内存2100开始的存储区

OUT 80;输出保存在R0寄存器中的字符

MVRD R1 ,0020;转换保存在R0中的大写字母为小写字母

ADD R0,R1

STRR [R2],R0;写R0中的字符到内存,地址同LDRR所用的地址

(2105) IN 81;测试串行接口是否完成输出过程

SHR R0

JRNC 2105;未完成输出过程则循环测试

RET;结束子程序执行过程,返回主程序

例4中,通过调用一段起始地址为2100的子程序,则可以实现输出及大小写转换的功能。