汇编语言程序设计
INC R0
SETB 00H
;置交换标志
NOEX:DJNZ R2,ST1
JB
00H,ST
SJMP $
22
a-b
a=b ;a-b=0 a>b ;Cy=0 a<b ;Cy=1
12
汇编语言程序设计-求极值
带符号数a、b大小关系的判断
a-b
a-b=0则a=b ov=0则ab
a-b0且 ov=1则ab ov=0则ab
a-b0且 ov=1则ab
13
汇编语言程序设计-求极值 【例】从片内存RAM的BLOCK单元开始有一组无
4 常用汇编语言程序设计
1
汇编语言程序设计
汇编语言程序设计的步骤 熟悉与分析工作任务,明确其要求和要达到的 工作目的、技术指标等; 确定解决问题的计算方法和工作步骤; 画工作流程图; 分配内存工作单元,确定程序与数据区存放地 址; 按流程图编写源程序; 上机调试、修改及最后确定源程序。
HTA:MOV A,@R0;取数
CLR C
SUBB A,#0AH ;判断数值范围在0~9或A~F
JC H09
;Cy=1,数值在0~9转H09
MOV A,@R0
ADD A,#37H ;A~F,加37H得ASCII码
MOV @R0,A
RET
H09:MOV A,@R0
ADD A,#30H ;0~9,加30H得ASCII码
;ASCII 码表
9
汇编语言程序设计-代码转换
【例】编程将ASCII码(十六进制数码)转换为十六进 制数。设ASCII码存放在A中,转换结果放到B中。
方法1:
ASH1:CJNE A,#3AH,NX;判断数码范围
NX: JC SS
;在30H~39H转SS
SUBB A,#07H
SS: CLR C
SUBB A,#30H
C
A,@R1 ;比较
NEXT ;若A中的数较大,则继续跟下一数比较
A,@R1 ;取大数
NEXT1
A,@R1 ;恢复A值
R1
;指向下一个单元
R2,LOOP
MAX,A
$
15
汇编语言程序设计-搜索、统计
搜索(在一组数据中查找是否有指定的关键字) 统计(统计一组数据中符合某个指定条件的关键 字的个数)
2
汇编语言程序设计-代码转换
代码转换 由于计算机内部的运算都是用二进制,而在计 算机与外设的数据传送中常采用BCD码、 ASCII码和其他代码,因此存在代码转换问题。
代码转换的方法 算法处理 根据待转换的两种代码的某种数学上的运算关 系,通过一定的算法进行转换。
查表法 将两种待转换的代码对应列表,然后用查表指 令进行转换。
MOV @R0,A
RET
8
汇编语言程序设计-代码转换
方法二:查表法 HAC: MOV A,@R0 ;取数
MOV DPTR,#TAB ;ASCII码表首地址 MOVC A,@A+DPTR ;查表 MOV @R0,A RET TAB: DB 30H,31H,32H,. . . ,39H DB 41H,42H,. . . ,46H;0~F的
JB ACC.7,NX ;数值为负,判断下一个
INC 30H ;正数个数加1
NX:INC R0
;指向下一个单元
DJNZ R5,LP
SJMP $
17
汇编语言程序设计-排序
排序(对一组数据按升序或降序排列) 【例】设有N个无符号数,连续存放在BUF开始的片内
RAM,编程将它们按升序(从小到大)排列。 冒泡法排序:(假设有5个数据:5,19,7,25,1 )
第一轮排序:
5不 5
5
交
19 换 19 交 7
5
5
7
7
7
7 换 19 不 19
19
25
25
25
交 换
25 交
1
1
1
1
1 换 25
18
汇编语言程序设计-排序
第二轮排序:
55 5 5 5 77 7 7 7 19 19 19 1 1 1 1 1 19 19 25 25 25 25 25
...
最多应进行N-1轮排序。为 减少比较次数,设置一个 标志位反映一轮排序过程 中是否发生数据交换,如 果没有发生数据交换,就 表示数据已按顺序排列。
字符
ASCII码
0~9
30H~39H
A~Z
41H~5AH
a~z
61H~7AH
6
汇编语言程序设计-代码转换
ห้องสมุดไป่ตู้
【例】将R0所指单元中的十六进制数转换成ASCII码, 并把结果存于原单元中。
方法一:算法处理方法
十六进制数码
0
¦
+30H
9
A
¦
+37H
F
ASCII码 30H ¦ 39H 41H ¦ 46H
7
汇编语言程序设计-代码转换
CLR 00H
;交换标志清0
ST1:MOV A,@R0
;取Xi
MOV B,A
INC R0
;指向Xi+1
CLR C
SUBB A,@R0 ;比较
JC NOEX ;Cy=1,即Xi Xi+1,不交换
21
汇编语言程序设计-排序
MOV A,B
XCH A,@R0
DEC R0
MOV @R0,A ;两数交换存储位置
符号数据,个数为N,试求出其最大数,并存入 MAX单元。
14
汇编语言程序设计-求极值
MOV MOV MOV LOOP:CLR SUBB JNC MOV SJMP NEXT:ADD NEXT1:INC DJNZ MOV SJMP
R1,#BLOCK ;设置指针,指向第一个数
R2, #N ;比较次数
A,#0 ;第一次比较的参照数
;十位数移到高半字节
ORL A,B ;合并形成十位和个位的压缩BCD码
MOV @R0,A
RET
5
汇编语言程序设计-代码转换
ASCII码(美国标准信息交换码,American Standard Code for Information Interchange)
用7位二进制数表示一个字母或字符的编码方法, 可表示128个字符,其中包括数码0~9以及英文字 母等可打印的字符。常见的如:
MOV B,A
RET
10
汇编语言程序设计-代码转换
方法2:
ASH2:CLR C
SUBB A,#30H ;先减去30H
CJNE A,#0AH,SS ;再判断数码范围
SS: JC SS1
;在0~9转SS1
SUBB A,#07H
SS1: MOV B,A
RET
11
汇编语言程序设计-求极值
求极值(在一组数据中求最大值或最小值) 基于比较的操作 无符号数a、b大小关系的判断
3
汇编语言程序设计-代码转换
【例】将累加器A中0~FFH范围内的二进制数 转换为BCD数(0~255)。
说明:
BCD码有两种存放形式
一个字节存放一位BCD码,高半字节取0, 常用于显示和输出;
一个字节存放两位BCD码,即压缩BCD码, 有利于节省存储空间。
编程思路
将A中的二进制数除以100,所得商即为百位
【例】设有50个有符号数,连续存放在以31H为首地 址的片内数据存储器中,编程统计其中正数的个数, 并将个数存入片内RAM 30H单元。
16
汇编语言程序设计-搜索、统计
MOV R0,#31H ;设置指针
MOV R5,#50 ;循环次数
MOV 30H,#0
LP:MOV A,@R0 ;取数
JZ NX
;数值为0,判断下一个
19
流程图:
开始
设置地址指针,循环次数,有 序标志位(00H)=0
取相邻两数Xi Xi+1比较
YY
Xi<Xi+1N N
交换位置
置无序标志位(00H)=1
本轮比较结束
NN
YY NN
有序
? YYY
结束
20
汇编语言程序设计-排序
ST: MOV R2,#(N-1) ;置每轮比较次数
MOV R0,#BUF ;置数据首单元地址
数,将余数再除以10,所得商即为十位数,余
数即为个位数。
4
汇编语言程序设计-代码转换
BTB:MOV B,#100
DIV AB
;A中为百位数,B中为余数
MOV @R0,A ;存百位数
INC R0
;指向存放十位和个位的单元
MOV A,#10
XCH A,B
DIV AB
; A中为十位数,B中为个位数
SWAP A