8位无符号数除法不恢复余数算法
发现每周的微机原理与接口技术实验都在网上找不到答案,只能自己花时间做。而且如何利用有限的寄存器完成指定的任务,这是与高级语言不同的。高级语言比如C++往往注重算法和类与对象,但是汇编语言注重的是比如怎么把一个循环加法用寄存器做载体实现,甚至连比较大小都不能用“>”,还是很有难度的。
编制程序DIV_8,实现8位(1字节)自然二进制数除法,要求使用模拟硬件除法器,使用不恢复余数除法算法实现。要求变量定义如下:
0x0400 DIV1 被除数2字节
0x0402 DIV2 除数 1字节
0x0403 DIVR 除法结果 1字节
0x0404 DIVF 报警标志 1字节
代码实现:
data segment
A dw 0333h ;被除数
B db 03h ;除数
C db 00h ;商
D db 00h ;报警位
data ends
code segment
assume cs:code, ds:data
main:
mov ax, data
mov ds, ax
mov bx, A ; 读入数据
mov al, B
mov dh, 09h ; 设置循环次数(dh为循环次数的手动设置)
sub bh, al
jc m4 ;如果无溢出
mov dl, 01h ;有溢出则赋值D为1
mov D, dl
sub dh, 01h
stc
rcl bx, 1
m1:
sub bh, al ; 处理上一余数大于等于0情况
jnc m2 ; 无借位则跳转m2
clc ; 有借位则将标志置零
m4:
sub dh, 01h ; 处理上一余数小于0情况,循环次数-1
jz m5 ;如果循环次数到了就结束
rcl bx, 1 ; 带C循环左移,同时移动结果单元和商
add bh, al ; 乘2后加除数
jc m2 ; 根据结果(借位情况)判断分支
clc
jmp m4 ; 如果仍然不够则继续进行m4
m2:
stc ; 无借位,够减,商1
m3:
rcl bx, 1 ; 带C循环左移,同时移动结果单元和商
sub dh, 01h
jnz m1
jmp m6 ; 循环次数到了就结束
m5: rcl bx, 1 ; 余数小于0时结束,补上最后一位
m6:
mov C, bl ;商存放在C
jmp $
code ends
end main