众所周知,加法和移位操作可以作乘法,加法和移位操作也可以作除法。
今天写一段汇编语言控制加法器作乘除法程序:
乘除法器原理
定点乘法器原理
算法
- 部分积装入被乘数
- 计数器C装入初始值(乘数数位的个数)
- 计数器C为0吗?是,跳出,否,顺序执行
- 第1位乘数是1还是0?
- 是1,部分积左移1位
- 加上被乘数,跳(8)
- 是0,部分积左移1位
- 乘数左移1位
- 计数器C减1
- 跳(3)
汇编语言具体代码如下:
;默认采用ML6.11汇编程序
DATAS SEGMENT
X DB ?
Y DB ?
LEN EQU 8
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV CL,LEN
MOV X,14
MOV Y,15
MOV AL,X
MOV BL,Y
MOV DL,AL
LOP1: SAL bl,1
DEC CL
JNC LOP1
LOP: JZ LOP4
SAL DL,1
SAL BL,1
JNC LOP2
ADD DL,AL
LOP2:
DEC CL
JNZ LOP
LOP4: mov al,dl ;显示三位数
MOV AH,0 ;对应百位数
MOV BL,100
DIV BL
MOV BL,AH
MOV AH,2
ADD AL,30H
MOV DL,AL
INT 21H
MOV AL,BL ;对应十位数
MOV AH,0
MOV BL,10
DIV BL
MOV BL,AH
MOV AH,2
ADD AL,30H
MOV DL,AL
INT 21H
MOV DL,BL ;对应个位数
ADD DL,30H
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
定点除法器原理
算法
- 部分积装入被除数
- 计数器C装入初始值
- 部分积大于除数吗?是,跳(4),否,跳(6)
- 小于等于除数,
- 商上1,跳(8)
- 大于除数,部分积减去除数n倍,装入部分积
- 商上1后面跟n-1个0
- 原来商与现在商相加
- 跳(3)
部分积最后是余数,商上到被除数寄存器。
汇编语言具体代码如下:
;默认采用ML6.11汇编程序
DATAS SEGMENT
X DB ?
Y DB ?
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AL,0
MOV X,129
MOV Y,1
MOV DL,x
MOV BL,Y
mov bh,0
LOP1:CMP dL,bL
Jz LOP5
Jb LOP3
mov cl,1
LOP: SAL BL,1
CMP BL,DL
inc cl
JbE LOP
RCR BL,1
SUB DL,BL
mov al,0
dec cl
STC
RCL AL,cl
add bh,al
JMP LOP2
LOP3: MOV AL,0
STC
RCL AL,1
add bh,al
SUB DL,BL
jmp lop2
LOP5: MOV AL,0
STC
RCL AL,1
add bh,al
SUB DL,BL
LOP2: MOV BL,Y
cmp dl,bl
Jae LOP1
MOV cL,DL
mov al,bh ;显示三位数商
MOV AH,0 ;对应百位数
MOV BL,100
DIV BL
MOV BL,AH
MOV AH,2
ADD AL,30H
MOV DL,AL
INT 21H
MOV AL,BL ;对应十位数
MOV AH,0
MOV BL,10
DIV BL
MOV BL,AH
MOV AH,2
ADD AL,30H
MOV DL,AL
INT 21H
MOV DL,BL ;对应个位数
ADD DL,30H
MOV AH,2
INT 21H
MOV DL,cL ;显示余数
ADD DL,30H
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START