需求分析
十进制接收:依次输入十进制数,运算存储在bx中以回车键结束
转十六进制:依次出栈十进制数,循环左移十进制,al转换十六进制,末尾拼接H
转二进制:利用寄存器除2取余实现末尾拼接B
难点:
十进制移位获取十六进制
寄存器除法
详细代码
data segment
ctr db 0DH,0AH,'$'
input_str db 'Enter a decimal number one by one. The Enter key is complete,Maximum 65535!','$'
binary db '2-decimal: ','$'
decimalism db '10-decimal: ','$'
hexadecimal db '16-decimal: ','$'
data ends
stack segment
stack ends
code segment
assume cs:code,ds:data,ss:stack
start:
mov ax,data
mov ds,ax ;DS寄存器指向数据段
main:
lea dx,input_str ;提示输入
call pr09
call crlf ;在下一行显示
call read ;读入十进制数,结果在BX
call crlf ;在下一行显示
push bx
call convert2 ;进行转换并输出
call crlf
pop bx
call crlf
call convert16 ;进行转换并输出
call crlf ;在下一行显示
jmp ex ;跳转到程序结束
read proc near ;读入函数READ
lea dx,decimalism
call pr09
mov bx,0
newchar:
mov ah,1 ; INT 21H, AH=1表示从键盘带回显读入字符到AL中
int 21h
xor ah,ah
cmp al,'0' ;如果输入‘0'-'9'之外的字符,则结束读入
js exit
cmp al,'9'
ja exit
sub al,'0' ;把字符转换为数字,比如'8'转换为数字8,保存在AL
xchg bx,ax ;寄存器内容交换
mov cx,0ah
mul cx ;把之前输入的数乘以10,加上本次输入,保存到BX.
xchg bx,ax
add bx,ax
jmp newchar ;结果在BX
exit:
ret
read endp
convert16 proc near ;转换函数
mov ch,04D
lea dx,hexadecimal
call pr09
rotate:
mov cl,04D
rol bx,cl ;BX循环左移4个bit, 也就是把最高位的16进制数放到BL的末尾
mov al,bl
and al,0FH ;把4位数放到AL
add al,30H ;转换为ASCII
cmp al,'9'
jb print ;字符为'9'之下,直接显示;这个条件好象不对啊,应该是JBE才对
add al,07H ;'9'之上的,转换为'A'-'F'
print:
mov dl,al ;显示字符
call pr02
dec ch
jne rotate ;循环
mov dl,'H' ;显示字符
call pr02
ret
convert16 endp
convert2 proc near ;转换函数
lea dx,binary
call pr09
mov ax,bx ;将记录的十进制数放入ax寄存器,预备除法
mov cx,0 ;记录运算次数
rotate1:
inc cx
mov dx,0 ;利用除数取模得到二进制,高位归0
mov bx,2 ;设置被除数
div bx ;执行除法
push dx ;余数入栈
cmp ax,0 ;比较商
ja rotate1 ;是否大于0,则继续除
print1:
pop ax ;余数依次出栈,这里正好是倒着
add al,48 ; al+48形成ascii码
mov ah,0eh ;打印
int 10h
loop print1 ;循环打印,cx中存在记录
mov dl,'B' ;显示字符
call pr02
ret
convert2 endp
crlf proc near
lea dx,ctr
mov ah,09h
int 21h
ret
crlf endp
pr09 proc near
mov ah,09h
int 21h
ret
pr09 endp
pr02 proc near
mov ah,2
int 21h
ret
pr02 endp
ex:
mov ah,4ch
int 21h
code ends
end start