当前位置: 第五章 指令、指令系统和汇编语言程序设计 >> 第二十二讲
讲选: 18/19/20/21/22

教学机指令功能及其在程序中的作用

·指令功能及其在程序中的作用

例5.1:在显示器屏幕上循环显示95个可打印字符。
例5.2:把字符A~F写到内存2040~2045单元中,然后读出并在屏幕上显示。
例5.3:从键盘输入字符并送到显示器显示。

本章主要内容

指令格式与寻址方式概述

汇编语言程序设计

汇编语言程序设计

  机器语言是计算机硬件能够直接识别和运行的指令的集合,是二进制码组成的指令,对程序设计人员来说很难以接受,直接用机器指令设计程序实在是太困难了。
  汇编语言大体上是对计算机机器语言的符号化处理的结果,再增加一些为方便程序设计而实现的扩展功能。汇编语言至少有2大优点。首先实现用英文单词或其缩写形式替代二进制的指令代码,更容易记忆和理解;其次可以选用英文单词来表示程序中用到的数据(常量和变量),并且避免程序设计人员亲自为这些数据分配存储单元,而是留给汇编程序自己去安排,这样的语言就达到了实用的最基本的标准。如果在此基础上,再在支持程序的不同结构特性(如循环和重复执行等结构),子程序所用哑变元替换为真实参数等方面提供必要的支持,使用这个语言设计程序就更为方便了。汇编语言程序经汇编器程序翻译为机器语言程序后方可运行。
  高级语言又称算法语言,它的实现思路,不再是过分地“靠拢”计算机硬件的指令系统,而是着重面向解决实际问题所用的算法,更多的是是为方便程序设计人员写出自己解决问题的处理方案和解题过程的程序。目前常用的高级语言有BASIC、C、C++、,PASCAL、JAVA、PROLOG、VHDL等几百种。用这些语言设计出来的程序,通常需要经过一个叫做编译程序的软件先编译成机器语言程序,或者首先编译成汇编程序后,再经过汇编操作后得到机器语言程序,才能在计算机的硬件系统上予以执行;也可以由一个叫做解释执行程序的软件,逐条取来相应高级语言程序的每个语句并直接控制其完成执行过程,而不是把整个程序编译为机器语言程序之后再一起交给硬件系统加以执行。

教学计算机中的汇编程序的例子

例5.4:设计一个程序,在屏幕上输出显示一个字符‘6’。

A 2000        ;地址从16进制的2000(内存RAM区的起始地址)开始
2000: MVRD R0,0036  ;把字符‘6’的ASCII码送入R0
2002: OUT 80     ;在屏幕上输出显示字符‘6’,80为串行接口地址
2003: RET       ;每个用户程序都必须用RET指令结束
2004:        (按回车键即结束源程序的输入过程)

例5.5:设计一个程序,用次数控制在终端屏幕上输出‘0’到‘9’十个数字符。

A 2020
MVRD R2,000A    ;送入输出字符的个数
MVRD R0,0030    ;‘0’字符的ASCII码
OUT 80       ;输出保存在R0低位字节的字符
DEC R2        ;输出字符个数减1
JRZ 202E       ;判全部字符输出完否,已完,则转移到程序结束处
PUSH R0       ;未完,保存R0的值到堆栈中
(2028) IN 81     ;查询接口状态,判字符的串行输出过程结束否
SHR R0       ;
JRNC 2028      ;未完成,则循环等待
POP R0       ;已完成,准备继续输出下一字符,从堆栈恢复
;          ;R0 的值
INC R0        ;得到下一个要输出的字符
JR 2024       ;转去输出字符
(202E) RET

例5.6:从键盘上连续键入多个属于‘0’到‘9’的数字符并在屏幕上显示,遇非数字符结束程序。从地址2040开始输入下列程序:

A 2040
MVRD R2,0030    ;用于判数字符的下界值
MVRD R3,0039   ;用于判数字符的上界值
(2044) IN 81    ;判键盘上是否按了一个键
SHR R0       ;即串行口是否有了输入的字符
SHR R0
JRNC 2044      ;尚没有输入则循环测试
IN 80        ;把输入字符读到R0低位字节
MVRD R1, 00FF
AND R0, R1     ;将R0的高位字节清0
CMP R0, R2    ;判输入的字符 < 字符‘0’否
JRNC 2053     ;是,则转到程序结束处
CMP R3, R0    ;判输入的字符 > 字符‘9’否
JRNC 2053     ;是,则转到程序结束处
OUT 80       ;输出刚输入的数字符
JMPA 2044     ;转去程序前边2044处等待输入下一个字符
(2053) RET

例5.7:计算1到10的累加和。
A 2060
MVRD R1,0000   ;置累加和的初值为0
MVRD R2,000A   ;最大的加数
SUB R3,R3     ;预置参加累加的数为0
(2064) INC R3   ;得到下一个参加累加的数
ADD R1, R3    ;累加计算
CMP R3, R2    ;判断是否累加完
JRNZ 2065     ;未完,开始下一轮累加
RET
运行过后,可以用R命令看R1中的累加结果。

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

A 2080
MVRD R3, 0006      ;指定被读数据的个数
MVRD R2, 20F0      ;指定被读、写数据内存区首地址
(2084) LDRR R0, [R2]   ;读内存中的一个字符到R0寄存器
CALA 2100         ;调用子程序,入口地址为2100,
             ;完成显示、字符转换和写回内存的功能
DEC R3          ;检查输出的字符个数
JRZ 208C         ;完成输出则结束程序的执行过程
INC R2          ;未完成,修改内存地址
JR 2084          ;转移到程序的2084处,循环执行规定的处理
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            ;结束子程序执行过程,返回主程序

运行过程中,可以直接看到屏幕上显示的内容,运行过后,再用D 20F0命令看内存的20F0区域中保存的运行结果,6个大写的英文字母已经被修改为小写字母:0061 0062 0063 0064 0065 0066

教学计算机中的伪指令

写在程序中的、指示汇编程序如何对该程序执行汇编操作的命令叫做伪指令。例如:

ORG : ORG exp     指定程序执行的开始地址
END :         指定程序执行的结束地址
EQU : var EQU exp   定义变量的值
var = exp
DW : adr DW exp    以为首地址在存储器中
            写入指定的值
BLK : BLK n      保留 n 个存储单元

讲选: 18/19/20/21/22