第 4 章 汇编语言程序设计简介第 4章 汇编语言程序设计简介
4.1 伪指令
4.2 汇编语言程序设计第 4 章 汇编语言程序设计简介
4.1 伪 指 令一,汇编起始指令 ORG
指令格式为,
ORG nn
该指令的作用是指明后面的程序或数据块的起始地址,
它总是出现在每段源程序或数据块的开始 。 式中,nn为 16 位地址,汇编时 nn确定了此语句后面第一条指令或第一个数据的地址,此后的源程序或数据块就依次连续存放在以后的地址内,直到遇到另一个 ORG指令为止 。
第 4 章 汇编语言程序设计简介例,ORG 2000H
MOV SP,# 60H
MOV R0,# 2FH
MOV R2,# 0FFH
ORG伪指令说明其后面程序的目标代码在存储器中存放的起始地址是 2000H,
存储器地址
2000H 75 81 60
2003H 78 2F
2005H 7A FF
第 4 章 汇编语言程序设计简介二,等值指令 EQU
指令格式,
字符名称 EQU
功能,使指令中的字符名称等价于给定的数字或汇编符号 。
使用等值指令可给程序的编制,调试,修改带来方便,如果在程序中要多次使用到某一地址,由 EQU指令将其赋值给一个字符名称,一旦需要对其进行变动,只要改变 EQU命令后面的数字即可,而不需要对程序中涉及到该地址的所有指令逐句进行修改 。 但要注意,由 EQU等值的字符名称必须先赋值后使用,且在同一个源程序中,同一个标号只能赋值一次 。 例,
PA8155 EQU 8001H
即给标号 PA8155赋值为 8001H。
第 4 章 汇编语言程序设计简介三,定义字节指令 DB
指令格式,
[ 标号,] DB 8
功能,把 8 位二进制数表依次存入从标号开始的连续的存储单元中 。
格式中,标号区段可有可无,DB指令之后的 8 位二进制数表是字节常数或用逗号隔开的字节串,也可以是用引号括起来的 ASCII码字符串 (一个 ASCII字符相当于一个字节 )。
例,
第 4 章 汇编语言程序设计简介
ORG 1000H
BUF1,DB 38H,7FH,80H
BUF2,DB 45H,66H
ORG伪指令指定了标号 BUF1的地址为 1000H,而 DB伪指令是将其后的二进制数表 38H,7FH,80H依次存放在
1000H,1001H,1002H 3 个连续单元之中,BUF2也是一个标号,其地址与前一条伪指令连续,即 1003H,1004H地址单元中依次存放 45H,66H。
第 4 章 汇编语言程序设计简介四,定义字指令 DW
指令格式,
[ 标号,] DW 16
该指令的功能与 DB相似,区别仅在于从指定地址开始存放的是指令中的 16 位数据,而不是字节串 。 每个 16 位数据要占两个存储单元,高 8 位先存,低 8 位后存,这和 MCS -51指令中的 16位数据存放顺序是一致的 。
第 4 章 汇编语言程序设计简介五,汇编结束指令 END
指令格式,
[ 标号,] END
格式中标号以及 END后面的地址或标号可有可无 。
功能,提供汇编结束标志 。 汇编程序遇到 END后就停止汇编,对 END以后的语句不予处理,故 END应放在程序的结束处 。
第 4 章 汇编语言程序设计简介
4.2 汇编语言程序设计
4.2.1 简单程序设计例 1 两个无符号双字节数相加 。
设被加数存放于内部 RAM的 40H( 高位字节 ),41H( 低位字节 ),加数存放于 50H( 高位字节 ),51H( 低位字节 ),
和数存入 40H和 41H单元中 。
第 4 章 汇编语言程序设计简介程序如下,
START,CLR C ; 将 Cy
MOV R0,# 41H ; 将被加数地址送数据指针 R0
MOV R1,# 51H ; 将加数地址送数据指针 R1
AD1,MOV A,@R0 ; 被加数低字节的内容送入 A
ADD A,@R1 ;
MOV @R0,A ;
DEC R0 ;
DEC R1 ;
MOV A,@R0 ; 被加数高位字节送入 A
ADDC A,@R1 ; 两个高位字节带 Cy
MOV @R0,A ;
RET
第 4 章 汇编语言程序设计简介例 2 将两个半字节数合并成一个一字节数 。
设内部 RAM 40H#,41H单元中分别存放着 8 位二进制数,
要求取出两个单元中的低半字节,并成一个字节后,存入
50H单元中 。 程序如下,
START,MOV R1,# 40H ; 设置 R1
MOV A,@R1 ;
ANL A,# 0FH ;
SWAP A ;
INC R1 ;
XCH A,@R1 ;
ANL A,# 0FH ;
ORL A,@R1 ;
MOV 50H,A ;
RET
第 4 章 汇编语言程序设计简介
4.2.2 分支程序设计图 4.1
(a) 单分支流程 ; (b) 多分支流程第 4 章 汇编语言程序设计简介例 3 x#,y均为 8位二进制数,设 x存入 R0,y存入 R1,求解,

0
1
1
y
0
0
0
x
x
x
程序如下,
START,CJNE R0,# 00H,SUL1; R0中的数与 00比较不等转移
MOV R1,# 00H; 相等,R1← 0
SJMP SUL2
SUL1,JC NEG ; 两数不等,若( R0) <0,转向 NEG
MOV R1,# 01H ; ( R0) >0,则 R1←01H
SJMP SUL2
NEG,MOV R1,# 0FFH ; ( R0) <0,则 R1←0FFH
SUL2,RET
第 4 章 汇编语言程序设计简介图 4.2
第 4 章 汇编语言程序设计简介例 4 比较两个无符号数的大小 。
设外部 RAM 的存储单元 ST1和 ST2中存放两个不带符号的二进制数,找出其中的大数存入外部 RAM 中的 ST3单元中 。
图 4.3
第 4 章 汇编语言程序设计简介
ORG 1000H
ST1 EQU 2000H
ST2 EQU 2100H
ST3 EQU 2200H
START,CLR C ; 清零 Cy
MOV DPTR,# ST1 ;
MOVX A,@DPTR ;
MOV R2,A ;
MOV DPTR,# ST2 ;
MOVX A,@DPTR ;
CLR C
第 4 章 汇编语言程序设计简介
SUBB A,R2;
JNC BIG1 ; 若第二个数大,
XCH A,R2;
BIG0,MOV DPTR,# ST3
MOVX @DPTR,A ;
RET
BIG1,MOVX A,@DPTR;
SJMP BIG0
RET
第 4 章 汇编语言程序设计简介
4.2.3 循环程序设计一,循环程序图 4.4
第 4 章 汇编语言程序设计简介循环程序一般由四个主要部分组成,
(1) 初始化部分,为循环程序做准备,如规定循环次数,给各变量和地址指针预置初值 。
(2) 处理部分,为反复执行的程序段,是循环程序的实体,也是循环程序的主体 。
(3) 循环控制部分,这部分的作用是修改循环变量和控制变量,并判断循环是否结束,直到符合结束条件时,跳出循环为止 。
(4) 结束部分,这部分主要是对循环程序的结果进行分析、
处理和存放。
第 4 章 汇编语言程序设计简介例 5 工作单元清零 。
在应用系统程序设计时,有时经常需要将存储器中各部分地址单元作为工作单元,存放程序执行的中间值或执行结果,工作单元清零工作常常放在程序的初始化部分中 。
设有 50个工作单元,其首址为外部存储器 8000H单元,则其工作单元清零程序如下,
第 4 章 汇编语言程序设计简介
CLEAR,CLR A
MOV DPTR,# 8000H ; 工作单元首址送指针
MOV R2,50 ;
CLEAR1,MOVX @DPTR,A
INC DPTR ;
DJNZ R2,CLEAR1;
RET
第 4 章 汇编语言程序设计简介例 6 设在内部 RAM的 BLOCK单元开始处有长度为
LEN个的无符号数据块,试编一个求和程序,并将和存入内部 RAM的 SUM单元 ( 设和不超过 8 位 ) 。
BLOCK EQU 20H
LENEQU 30H
SUM EQU 40H
START,CLR A ; 清累加器 A
MOV R2,# LEN; 数据块长度送 R2
MOV R1,# BLOCK ; 数据块首址送 R1
LOOP,ADD A,@R1 ;
INC R1;
DJNZ R2,LOOP ;
MOV SUM,A;
RET
第 4 章 汇编语言程序设计简介二,多重循环例 7 10 秒延时程序 。
延时程序与 MCS - 51 执行指令的时间有关,如果使用 6
MHz晶振,一个机器周期为 2 μs,计算出一条指令以至一个循环所需要的执行时间,给出相应的循环次数,便能达到延时的目的 。 10 秒延时程序如下,
DELAY,MOV R5,# 100
DEL0,MOV R6,# 200
DEL1,MOV R7,# 248
DEL2,DJNZ R7,DEL2
DJNZ R6,DEL1
DJNZ R5,DEL0
RET
第 4 章 汇编语言程序设计简介上例程序中采用了多重循环程序,即在一个循环体中又包含了其它的循环程序,这种方式是实现延时程序的常用方法 。
使用多重循环时,必须注意,
(1) 循环嵌套,必须层次分明,不允许产生内外层循环交叉 。
(2) 外循环可以一层层向内循环进入,结束时由里往外一层层退出 。
(3) 内循环可以直接转入外循环,实现一个循环由多个条件控制的循环结构方式 。
第 4 章 汇编语言程序设计简介例 8 在外部 RAM中,BLOCK开始的单元中有一无符号数据块,其个数为 LEN个字节 。 试将这些无符号数按递减次序重新排列,并存入原存储区 。
ORG 1000H
START,MOV DPTR,# BLOCK;
MOV P2,DPH ; P2
MOV R7,# LEN ;
DEC R7 ; 比较与交换 n-1
第 4 章 汇编语言程序设计简介
LOOP0,CLR F0 ; 交换标志清 0
MOV R0,DPL;
MOV R1,DPL ;
INC R1
MOV R6,R7 ;
LOOP1,MOVX A,@R0 ;
MOV B,A ;
MOVX A,@R1 ;
CJNE A,B,NEXT; 相邻两数比较,
SJMP NOCHA ; 相等不交换第 4 章 汇编语言程序设计简介
NEXT,JC NOCHA; Cy =1,则前者大于后者,
SETB F0 ; 否则,
MOVX @R0,A ;
XCH A,B ; 两数交换,大者在前,
MOVX @R1,A ;
NOCHA,INC R0
INC R1;
DJNZ R6,LOOP1 ; 内循环未完,
JNB F0,EXIT ; 若从未交换,
DJNZ R7,LOOP0; 外循环未完,
EXIT,RET
第 4 章 汇编语言程序设计简介图 4.5
第 4 章 汇编语言程序设计简介例 9 设某系统的模数转换器是 ADC0809,它的转换结束信号 EOC连接到 8031 的 P1.7端,当 EOC的状态由低变高时,则结束循环等待,并读取转换值,其程序如下,
START,MOV DPTR,# addr ; 0809端口地址送 DPTR
MOV A,# 00H ; 启动 0809
MOVX @DPTR,A
LOOP,JNB P1.7,LOOP; 检测 P1.7状态,判是否转换结束
MOVXCA,@DPTR;…
第 4 章 汇编语言程序设计简介例 10 在内部 RAM中从 50H单元开始的连续单元依次存放了一串字符,该字符串以回车符为结束标志,要求测试该字符串的长度 。
程序如下,
START,MOV R2,# 0FFH
MOV R0,# 4FH ; 数据指针 R0
LOOP,INC R0
INC R2
CJNE @R0,# 0DH,LOOP
RET
第 4 章 汇编语言程序设计简介
4.2.4
散转程序是分支程序的一种,它可根据运算结果或输入数据将程序转入不同的分支 。 MCS - 51 指令系统中有一条跳转指令 JMP@A+DPTR,用它可以很容易地实现散转功能 。 该指令把累加器的 8 位无符号数与 16 位数据指针的内容相加,
并把相加的结果装入程序计数器 PC,控制程序转向目标地址去执行 。 此指令的特点在于,转移的目标地址不是在编程或汇编时预先确定的,而是在程序运行过程中动态地确定的 。
目标地址是以数据指针 DPTR的内容为起始的 256 字节范围内的指定地址,即由 DPTR的内容决定分支转移程序的首地址,
由累加器 A的内容来动态选择其中的某一个分支转移程序 。
第 4 章 汇编语言程序设计简介例 11 根据工作寄存器 R0 内容的不同,使程序转入相应的分支 。
(R0)=0 对应的分支程序标号为 PR0;
(R0)=1 对应的分支程序标号为 PR1;
(R0)=N 对应的分支程序标号为 PRN。

第 4 章 汇编语言程序设计简介程序如下,
LP0,MOV DPTR,# TAB ;
MOV A,R0
ADD A,R0 ; R0内容乘以 2
JNC LP1 ;
INC DPH ;
LP1,JMP @A+DPTR;
TAB,AJMP PR0
AJMP PR1
AJMP PRN


第 4 章 汇编语言程序设计简介本例程序仅适用于散转表首地址 TAB和处理程序入口地址 PR0,PR1,…,PRN在同一个 2 KB范围的存储区内的情形 。
若超出 2 KB范围可在分支程序入口处安排一条长跳转指令,
可采用如下程序,
MOV DPTR,# TAB
MOV A,R0
MOV B,# 03H ; 长跳转指令占 3
MUL AB
XCH A,B
第 4 章 汇编语言程序设计简介
ADD A,DPH
MOV DPH,A
XCH A,B
JMP @A+DPTR;
TAB,LJMP PR0;
LJMP PR1
LJMP PRN


第 4 章 汇编语言程序设计简介
4.2.5 子程序和参数传递一,子程序的概念通常把这些基本操作功能编制为程序段作为独立的子程序,以供不同程序或同一程序反复调用 。 在程序中需要执行这种操作的地方放置一条调用指令,当程序执行到调用指令,就转到子程序中完成规定的操作,并返回到原来的程序继 续执行下去 。
第 4 章 汇编语言程序设计简介二,
调用子程序的指令有,ACALL”和,LCALL”,执行调用指令时,先将程序地址指针 PC 改变 (,ACALL”加 2,
“LCALL”加 3),然后 PC值压入堆栈,用新的地址值代替 。 执行返回指令时,再将 PC值弹出 。
子程序调用中,主程序应先把有关的参数存入约定的位置,
子程序在执行时,可以从约定的位置取得参数,当子程序执行完,将得到的结果再存入约定的位置,返回主程序后,主程序可以从这些约定的位置上取得需要的结果,这就是参数的传递 。
第 4 章 汇编语言程序设计简介例 12 把内部 RAM某一单元中一个字节的十六进制数转换成两位 ASCII码,结果存放在内部 RAM的连续两个单元中 。
假设一个字节的十六进制数在内部 RAM 40H单元,而结果存入 50H#,51H单元,可以用堆栈进行参数传递,程序如下,
MAIN,MOV R1,# 50H ; R1
MOV A,40H ; A
SWAP A ;
PUSH ACC ;
LCALL HEASC ; 调用将低半字节的内容转换 ;
成 ASCII码子程序 HEASC
POP ACC
MOV @R1,A ;
INC R1
PUSH 40H
第 4 章 汇编语言程序设计简介
LCALL HEASC
POP ACC
MOV @R1,A ;
END
HEASC,MOV R0,SP
DEC R0
DEC R0 ; R0
XCH A,@R0 ;
ANL A,# 0FH ;
ADD A,# 2 ; 修改 A
MOVC A,@A+PC ;
XCH A,@R0;
RET
TAB,DB 30H,31H,32H,…
第 4 章 汇编语言程序设计简介
4.2.6 查表程序设计查表程序是一种常用程序,它广泛使用于 LED显示控制,
打印机打印控制,数据补偿,数值计算,转换等功能程序中,
这类程序具有简单,执行速度快等特点 。
所谓查表法,就是预先将满足一定精度要求的表示变量与函数值之间关系的一张表求出,然后把这张表存于单片机的程序存储器中,这时自变量值为单元地址,相应的函数值为该地址单元中的内容 。 查表,就是根据变量 X在表格中查找对应的函数值 Y,使 Y=f(X)。
第 4 章 汇编语言程序设计简介
MCS - 51指令系统中,有两条查表指令,
MOVC A,@A+PC
MOVC A,@A+DPTR
第 4 章 汇编语言程序设计简介例 13 一个十六进制数存放在内部 RAM 的 HEX单元的低 4 位中,将其转换成 ASCII码并送回 HEX单元 。
十六进制 0~ 9的 ASCII码为 30H~ 39H,A~ F的 ASCII
码为 41H~ 46H,ASCII码表格的首地址为 ASCTAB。 编程如下,
ORG 1000H
HEXASC,MOV A,HEX
ANL A,# 0FH
ADD A,# 3;
MOVC A,@A+PC
MOV HEX,A
RET
第 4 章 汇编语言程序设计简介
ASCTAB,DB 30H,31H,32H,33H,34H
DB 35H,36H,37H,38H,39H
DB 41H,42H,43H,44H,45H
DB 46H
在这个程序中,查表指令 MOVC A,@A+PC到表格首地址有两条指令,占用 3 个字节地址空间,故修改指针应加 3。
第 4 章 汇编语言程序设计简介例 14 设有一个巡回检测报警装置,需对 96 路输入进行控制,每路有一个额定的最大值,是双字节数 。 当检测量大于该路对应的最大值时,就越限报警 。 假设 R2 为保存检测路数的寄存器,其对应的最大额定值存放于 31H和 32H单元中 。
查找最大额定值的程序如下,
FMAX,MOV A,R2
ADD A,R2 ; 表中一个额定值为 2
MOV 31H,A
MOV DPTR,# TAB ;
第 4 章 汇编语言程序设计简介
MOVC A,@A+DPTR;
XCH A,31H ; 第一个字节内容存入 31H
INC DPTR
MOVC A,@A+DPTR;
MOV 32H,A ; 第二字节的内容存入 32H
TAB,DW 1230H,1450H,...
DW 2230H,2440H,...
DW 3120H,3300H,..,
第 4 章 汇编语言程序设计简介例 15 在一个温度检测系统中,温度模拟信号由 10 位 A/D
输入 。 将 A/D结果转换为对应温度值,可采用查表方法实现 。
先由实验测试出整个温度量程范围内的 A/D转换结果,把 A/D
转换结果 000H~ 3FFH所对应的温度值组织为一个表存储在程序存储器中,那么就可以根据检测到的模拟量的 A/D转换值查找出相应的温度值 。
设测得的 A/D转换结果已存入 20H#,21H单元中 ( 高位字节在 20H中,低位字节在 21H中 ),查表得到的温度值存放在 22H#,23H单元 ( 高位字节在 22H中,低位字节在 23H中 ) 。
第 4 章 汇编语言程序设计简介程序如下,
FTMP,MOV DPTR,# TAB ; DPTR←
MOVA,21H ; ( 20H)( 21H) × 2
CLRC
RLCA
MOV21H,A
MOVA,20H
RLCA
MOV20H,A
MOVA,21H ; 表首地址 +偏移量
ADDC A,DPL
MOVDPL,A
第 4 章 汇编语言程序设计简介
MOVA,20H
ADDC A,DPH
MOVDPH,A
CLR A
MOVC A,@A+DPTR;
MOV22H,A
CLRA
INCDPTR
MOVC A,@A+DPTR;
MOV23H,A
RET
TAB,DW …
第 4 章 汇编语言程序设计简介
4.2.7 数制转换例 16 将一个字节二进制数转换成 3 位非压缩型 BCD码 。
设一个字节二进制数在内部 RAM 40H单元,转换结果放入内部 RAM 50H#,51H,52H单元中 ( 高位在前 ),程序如下,HEXBCD,MOV A,40H
MOV B,# 100
DIV AB
MOV 50H,A
MOV A,# 10
XCH A,B
DIV AB
MOV 51H,A
MOV 52H,B
RET
第 4 章 汇编语言程序设计简介例 17 设 4 位 BCD码依次存放在内存 RAM中 40H~43H
单元的低 4 位,高 4 位都为 0,要求将其转换为二进制数,结果存入 R2R3 中 。
一个十进制数可表示为,
Dn× 10n +Dn-1× 10n-1 +… + D0× 100
=( …(( Dn× 10+Dn-1) × 10+Dn-2) × 10+…) +D0
当 n=3时,上式可表示为,
(( D3× 10+D2) × 10+D1) × 10+D0
第 4 章 汇编语言程序设计简介
BCDHEX,MOV R0,# 40H ; R0
MOV R1,# 03 ; 计数值送 R1
MOV R2,# 0 ;
MOV A,@R0
MOV R3,A
LOOP,MOV A,R3
MOV B,# 10
MULAB
MOV R3,A ; (R3)× 10 的低 8 位送 R3
MOV A,B
XCHA,R2 ; (R3)× 10的高 8 位暂存 R2
MOVB,# 10
第 4 章 汇编语言程序设计简介
MULAB
ADD A,R2
MOVR2,A ; R2× 10+( R3× 10)高 8 位送 R2
INCR0 ; 取下一个 BCD
MOVA,R3
ADDA,@R0
MOVR3,A
MOVA,R2
ADDC A,# 0 ;
MOVR2,A
DJNZ R1,LOOP
RET
第 4 章 汇编语言程序设计简介
4.2.8 运算程序一,加、
例 18 将 40H开始存放的 10 个字节的数与 50H开始存放的 10 个字节的数相减 ( 假设被减数大于减数 ) 。
设被减数指针为 R0,减数指针为 R1,差数放回被减数单元,
R5 存放字节个数,则程序如下,
第 4 章 汇编语言程序设计简介
SUB,MOV R0,# 40H
MOV R1,# 50H
MOV R5,# 10
CLR C
SUB1,MOV A,@R0
SUBB A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R5,SUB1
RET
第 4 章 汇编语言程序设计简介二,
在计算机中,常将乘法采用移位和加法来实现 。
例 19 将 ( R2R3) 和 ( R6R7) 中双字节无符号数相乘,
结果存入 R4R5R6R7。
此乘法可以采用部分积右移的方法来实现,其程序框图如图 4.6 所示,程序如下,
NMUL,MOV R4,# 0 ;
MOV R5,# 0
CLR C
MOV R0,# 16
第 4 章 汇编语言程序设计简介
NMUL1,MOV A,R4 ; CyR4R5R6R7
RRC A
MOV R4,A
MOV A,R5
RRC A
MOV R5,A
MOV A,R6
RRC A
MOV R6,A
MOV A,R7
RRC
MOV R7,A
JNC NMUL2; C
MOV A,R5 ; ( R4R5) +( R6F7)→ ( R4R5)
第 4 章 汇编语言程序设计简介
ADD A,R3
MOV R5,A
MOV A,R4
ADDC A,R2
MOV R4,A
NMUL2,DJNZR0,NMUL1; 循环 16
MOV A,R4;
RRC A
MOV R4,A
MOV A,R5
RRC A
MOV R5,A
MOV A,R6
第 4 章 汇编语言程序设计简介
RRC A
MOV R6,A
MOV A,R7
RRC A
MOV R7,A
RET
第 4 章 汇编语言程序设计简介图
4.
6N
MU
L
程序框图第 4 章 汇编语言程序设计简介例 20 假定被乘数在( R4R3)中,乘数放在 R2中,乘积放在 R7R6和 R5中。
MCS - 51 中有 8 位数的乘法指令 MUL,用它来实现多字节乘法时,
( R4R3) × ( R2) =[( R4) × 28+( R3)] × ( R2
=( R4) × ( R2) × 28+( R3) × ( R2
其中( R4) × ( R2)和( R3) × ( R2)都是可直接用 MUL
指令来实现,而乘以 28意味着左移 8 位。由此可编写如下程序,
第 4 章 汇编语言程序设计简介
NMUL1,MOV A,R2
MOV B,R3
MUL AB ; ( R3) × ( R2
MOV R5,A ; 积的低位送 R5
MOV R6,B ; 积的高位送 R6
MOV A,R2
MOV B,R4
MUL AB ; ( R4) × ( R2
ADD A,R6 ; ( R3) × ( R2)的高位加 (R4)× (R2)
MOV A,B
ADDC A,# 00H ; ( R4) × ( R2)的高位加 Cy
MOV R7,A ; 结果送 R7
RET
第 4 章 汇编语言程序设计简介三,除法运算程序除法是乘法的逆运算,用移位,相减的方法来完成 。 首先比较被除数的高位字与除数,如被除数高位大于除数,则商为 1,并从被除数中减去除数,形成一个部分余数 ; 否则商位为 0,
不执行减法 。 然后把新的部分余数左移一位,并与除数再次进行比较 。 循环此步骤,直到被除数的所有位都处理完为止,一般商的字长为 n,则需循环 n次 。 一般计算机中,被除数均为双倍位,即如果除数和商为双字节,则被除数为四字节 。 如果在除法中发生商大于规定字节,称为溢出 。 在进行除法前,应该检查是否会产生溢出 。 一般可在进行除法前,先比较被除数的高位与除数,如被除数高位大于除数,则溢出,置溢出标志,不执行除法 。
第 4 章 汇编语言程序设计简介图 4.7 除法程序的流程第 4 章 汇编语言程序设计简介例 21 将 ( R4R5R6R7) 除以 ( R2R3),商放在 ( R6R7)
中,余数放在 ( R4R5) 中 。
NDIV,MOV A,R5 ;
CLR C
SUBB A,R3
MOV A,R4
SUBB A,R2
JNC NDIV1 ; 溢出,
MOV B,# 16; 无溢出,执行除法第 4 章 汇编语言程序设计简介
NDIV2,CLR C ; 被除数左移一位,低位送 0
MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5
RLC A
MOV R5,A
XCH A,R4
RLC A
XCH A,R4
第 4 章 汇编语言程序设计简介
MOV F0,C ;
CLR C
SUBB A,R3 ;
MOV R1,A
MOV A,R4
SUBB A,R2
JB F0,NDIV3; 移出的高位为 1,
JC NDIV4 ; 否则,(Cy) = 0
NDIV3,MOV R4,A ;
MOV A,R1
MOV R5,A
INC R7 ; 商上 1
第 4 章 汇编语言程序设计简介
NDIV4,DJNZ B,NDIV2; 循环次数减 1,若不为零则循环
CLR F0 ; 正常执行无溢出 F0 = 0
RET
NDIV1,SETB F0 ; 溢出 F0=1
RET