两个16位二进制数减法模拟
功能说明:输入两组16位二进制代码模拟两为16位二进制整数,对其求差并以16进制输出.
基本算法:采用补码,模拟二机制减法(加法类同),得到差(补码)转换成原码后,转化成十六进制并输出.16为二进制转换成4为十六进制数的方法是采用:将16位二进制分成4组,每组由连续4位二进制组成,模拟4位二进制到一位十六进制转换,将每组转换成16进制数并输出.详见代码
本代码在MASM.5调试通过
运行界面:
如
binary(YuanMa) num1=1000000000001011 ;被减数原码
binary(YuanMa) num2=1000000000001101 ;减数原码
binary(Buma) num1 BM=1111111111110101 ;被减数补码
binary(Buma) num2 BM=1111111111110011 ;减数补码
binary(Buma) diff sub=0000000000000010 ;差补码
binary(YuanMa)diffsub=0000000000000010 ;差原码
hex sumHEX=0002
;/************************************************/
;
;bsub.asm
;hbyufan@163.com
;
TSOUT MACRO dx0
mov ah,09h
mov dx,offset dx0
int 21h
ENDM
data segment
num1 db 19 dup('$')
num2 db 19 dup('$')
sum db 19 dup('$')
hexsum db 5 dup('$')
tsnum1 db 0ah,0dh,'binary(YuanMa) num1=$'
tsnum2 db 0ah,0dh,'binary(YuanMa) num2=$'
tssum db 0ah,0dh,'binary(Buma) diff sub=$'
tsnum11 db 0ah,0dh,'binary(Buma) num1 BM=$'
tsnum22 db 0ah,0dh,'binary(Buma) num2 BM=$'
tssum33 db 0ah,0dh,'binary(YuanMa)diffsub=$'
tssumhex db 0ah,0dh,'hex sumHEX=$'
data ends
code segment
assume ds:data,cs:code
start:
mov ax,data
mov ds,ax
re:
TSOUT tsnum1
mov si,0
n1roat:
mov ah,01h
int 21h
cmp al,'0' ;对NUM1输入错误简单处理---重新输入
jl re
cmp al,'1'
ja re
mov num1[si],al
inc si
cmp si,16
jl n1roat
re2:
TSOUT tsnum2
mov si,0
n2roat:
mov ah,01h
int 21h
cmp al,'0' ;对NUM1输入错误简单处理---重新输入
jl re2
cmp al,'1'
ja re2
mov num2[si],al
inc si
cmp si,16
jl n2roat
mov bx,offset num1
call questBuma
mov bx,offset num2
call questBuma
TSOUT tsnum11;//
TSOUT num1;//
TSOUT tsnum22;//
TSOUT num2;//
call bsubproc
TSOUT tssum;
TSOUT sum ;//test
lea bx,sum
call questBuma
TSOUT tssum33;//
TSOUT sum;//
lea bx,sum
call BinaryToHexAndOut
TSOUT tssumhex;//
TSOUT hexsum;//
;******************************
mov ah,4ch
int 21h
;*******************************************
questBuma proc near ;功能:求补码
;算法:模拟求补码运算,如二进制求补码方法一致.
;bx ;bx作为参数,传入NUM1或NUM2内存空间首地址
mov al,[bx+0]
cmp al,'0'
jz qbret ;如果是正整数,函数返回;如果是负数,符号位不变,其余位取反加1.
mov si,1
qbroat:
mov al,[bx][si]
cmp al,'0'
jz qb1
mov al,'0'
mov [bx][si],al
jmp qb2
qb1:
mov al,'1'
mov [bx][si],al
qb2:
inc si
cmp si,16
jl qbroat
qnext:
mov dh,1 ;加1处理.方法类似减法
mov si,15
qbincre:
mov al,[bx][si]
sub al,'0'
add al,dh
mov dh,0
cmp al,2
jnz qbi1
mov al,0
mov dh,1
qbi1:
add al,'0'
mov [bx][si],al
dec si
cmp si,0
jnl qbincre
qbret:
ret
questBuma endp
;*******************************************
bsubproc proc near ;功能:16位二进制数减法模拟.
;算法:逐位相减,flag为借位标志(BX)
push ax
push bx
push cx
push si
mov bx,0 ;//flag
mov si,15
broat: mov al,num1[si]
add al,bh
mov bh,0 ;//clear bh
cmp al,num2[si]
jnl bnext
add al,2
dec bh
bnext:
sub al,num2[si]
add al,'0'
mov sum[si],al
dec si
cmp si,0
jnl broat
pop si
pop cx
pop bx
pop ax
ret
bsubproc endp
;*******************************************
BinaryToHexAndOut proc near ;功能如函数名
;bx ;bx作为参数,传入NUM1或NUM2内存空间首地址
mov dh,2
mov si,0
bth1:
mov al,0 ;分组转换,模拟4为二进制到1为16进制数的转换
mov di,0
bth2:
mul dh
add al,[bx][di]
sub al,'0'
inc di
cmp di,4
jl bth2
cmp al,9
jna bth3
sub al,10
add al,'A'
jmp bth4
bth3:
add al,'0'
bth4:
mov hexsum[si],al
inc si
add bx,4
cmp si,4
jl bth1
ret
BinaryToHexAndOut endp
;*******************************************
code ends
end start
<<<<
学习箴言:
1,一知半解是危险的
2,如果一门语言不能影响你对编程的想法,那它就不值得去学
>>>