ADC A,#00H ;加上低8位运算产生的进位 AD A,R2 ;重新计算高8位的结果
PUSH A ;压栈保存起来
NEXT : SL R0 ;被乘数带进位左移
SLL R2 ;高8位也相应带进位左移 SHR R1 ;乘数右移一位 GOTO LOOP ;LAST : POP A ; MOV R2,#00H ; ADD R2,A ; ENDP ;乘法流程图如下:
跳转到下一次测试
将高8位结果出栈 先清空R2的值 将高8位结果送入R2中 程序结束 开始初始化乘数与被乘数及存放最后结果的寄存器将R的值送入栈中先保存起来乘数是否为0N 测试被乘数 最低位是否为1YY计算部分积输出 结果N结束被乘数带进位左移乘数不带进位右移
(2)除法
8位除法的算法流程图与汇编语言程序清单:
MOV R0,#7EH ;初始化被除数126
MOV R1,#0BH ;初始化除数11 MOV R2,#0H ;初始化商0 MOV R3,#00H ;初始化计数器0 TEST R1,#0FFH ;测试除数是否为0
JZ OVERFLOW ;是0转到溢出处理 MOV A,R1 ;除数送累加器 PUSH A ;保存除数
LOOP: TEST R1,#80H ;测试R1的最高位是否为0
JZ ZERO ;为0则跳转到ZERO GOTO NEXT ;不为0就跳转到NEXT
ZERO: ADD R3,#01H ;NEXT: ADD R3,#01H ; JC NEGATIVE ; GOTO OVERFLOW ;NEGATIVE : SHL R2 ; SHR R1 ; ADD R3,#1H ; SUB R3,#4H ; JZ DEAL ; ADD R0,A ; JC POSITIVE ; GOTO NEGATIVE ;POSITIVE : SHL R2 ; ADD R2,#01H ; SHR R1 ; ADD R3,#01H ; JZ DEAL ;SHL R1 ;GOTO LOOP ;MOV A,R1 ;SUB R0,A ;SUB R3,#04H ;对计数器进行加1操作
对寄存器R1右移一位 继续循环
计算循环次数,保存到R3
移位后除数送累加器 被除数减去移位后除数
结果为负数,商0
首次没借位会得出5位商,溢出处理商左移一位
除数右移一位 计数器加1 计数器与4比较 计数器为4,处理结束
右移后的除数送累加器
上次运算结果加上右移后的除数 结果为正数,商1 结果为负数,商0 商左移一位
商加1 除数右移一位 计数器加1
计数器与4比较
计数器为4,跳转
移位后除数送累加器
MOV A,R1 ; MOV A,R1 ;SUB R0,A ;上次运算结果减去右移后除数
JC NEGATIVE ;结果为负数,商0 GOTO POSITIVE ;结果为正数,商1 DEAL : TEST R0,#80H ;测试余数是否为负
JZ LAST ;为正不用处理 POP A ;恢复除数 ADD R0,A ;GOTO LAST ;OVERFLOW: MOV R2,#0FFH ;LAST : ENDP ;无符号除法流程图如下:
余数加上除数 跳转到程序结束
溢出,商置全1 程序结束 开始初始化被除数R0,除数R1,商R2为 计算循环的次数,存入R3寄存器溢出处理Y除数R1为0 N被除数R0 减 除数R1恢复除数R2,余数R0 加 除数R2结束Y有借位么 N N余数R0为负Y商R2左移一位,加0商R2左移一位,加1除数R1右移一位,计数器R3减1 除数R1右移一位,计数器R3减1 Y计数器R3为1 N被除数R0 加除数 除数R1Y计数器R3为1 N被除数R0 减 除数R1 N有进位么有借位么 N
6.上述程序的运行情况(跟踪结果)
程序运行的过程: ① 乘法程序运行过程: