第 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