dseg segment
msg0 db 'Input Binary Num:$'
msg1 db 0dh,0ah, 'Hex Num:$'
inBin db 17 ;存储输入的2进制字符串,最大长度16, 最后一个字符存储回车
db 0 ;实际的输入长度
db 17 dup(0) ;存储输入的字符串
n dw 0
dseg ends
assume cs:cseg, ds:dseg
cseg segment
start:
mov ax, dseg
mov ds, ax
call readBin ;调用输入2进制的函数,结果存储在n中
call outHex ;调用将n按16进制输出的函数
mov ax, 4c00h
int 21h
readBin proc near
mov ah, 9 ;输出
lea dx, msg0 ;msg0
int 21h ;这个字符串
mov ah,10 ;读取输出的字符串到inBin中
lea dx, inBin ;
int 21h ;
mov cl, inBin+1 ;输入的字符串长度放入cx中
mov ch, 0 ;
mov bx, 2 ;bx指向第1个实际输出字符的位置
xor ax, ax ;ax清0
r0:
mov dl, inBin[bx] ;读取第[bx]个输入的字符
and dl, 0FH ;字符转换为实际的数值 0或1
shl ax, 1 ;ax 左移1位
add al, dl ;(al)+(dl)
inc bx ;bx指向下一个字符
loop r0 ;循环处理输入的2进制字符串
mov n, ax ;将最后结果存入n中
ret
readBin endp
outHex proc near
mov ah,9 ;显示
lea dx, msg1 ;字符串
int 21h ;msg1
mov ch, 4 ;一个字,有4个字符,所以需要处理4次
mov cl, 4 ;每一次,移位的数量为4个bit
mov bx, n ;读取n到(bx)中
mov ah,0eh ;为调用int 10h,输出(al)中的字符做准备
O0:
rol bx, cl ;bx循环左移4位,第1次时,即最高4位->最低4位
mov al, bl ;(al)<-(bl)
and al, 0FH ;(al)中数据只保留低4位
cmp al, 10 ;(al)<=9?,则+30H转为数字对应的ASCII字符
jb O1 ;(al)>9,则为16进制的A-F
add al, 7 ; 所以要加上7,转为对应的ASCII字符
O1:
add al, 30h ;统一+30H
int 10h ;调用10h中断,输出到屏幕上
dec ch ;ch--
jnz O0 ;
ret
outHex endp
cseg ends
end start