输入5位以内的八进制数,存入BX中
bx为16位的寄存器。
5位以内的八进制数最多是15位二进制,bx最高位默认为0,不输出
只输出bx的5位8进制数
data segment
data ends
stack segment stack
dw 100 dup (?)
top label word
stack ends
code segment
assume cs:code,ds:data,ss:stack
main proc far
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
lea sp,top
mov cx,0 ;统计输入的合法字符
mov si,8
mov bx,0
L1:
mov ah,7 ;不回显
int 21h
cmp al,0dh ;输入回车,跳转到以8进制输出bx
je print
cmp al,30h
jb L1
cmp al,37h
ja L1
mov dl,al ;合法字符,输出
mov ah,2
int 21h
inc cx ;合法字符+1
;将输入字符转化成8进制,跟转化成10进制类似
;10进制bx*10+输入的字符
;8进制bx*8+输入的字符
;由于乘法指令mul默认在ax,记得要交换ax,bx
mov al,dl
and ax,7 ;屏蔽高13位
xchg ax,bx ;交换ax,bx
mul si
add bx,ax
cmp cx,5 ;判断输入的合法字符数,cx=5跳转到以8进制输出bx,否则继续输入
je print
jmp L1
;bx以8进制输出
print:
cmp cx,0 ;合法字符数为0,退出
je exit
mov dl,0dh ;回车
mov ah,2
int 21h
mov dl,0ah ;换行
mov ah,2
int 21h
mov cx,5 ;输出低15位对应的5位8进制
rol bx,1 ;输入了5位8进制,即5*3=15位二进制
;输出5位8进制的时候记得把最高位移走再进入循环
L2:
push cx
mov cl,3
rol bx,cl
mov dl,bl
and dl,7 ;屏蔽高5位
add dl,30h ;转换成数字字符
mov ah,2
int 21h
pop cx
loop L2
exit:
mov ah,4ch
int 21h
main endp
code ends
end main
输入6位以内的八进制数,存入BX中
bx想要存6位8进制数,最高位只能是0或1,输入其他情况以溢出处理。
data segment
string db 0ah,0dh,"overflow!",'$'
data ends
stack segment stack
dw 100 dup (?)
top label word
stack ends
code segment
assume cs:code,ds:data,ss:stack
main proc far
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
lea sp,top
mov bx,0
mov si,8
mov cx,0
L1:
mov ah,7
int 21h
cmp al,0dh
je print
cmp al,30h
jb L1
cmp al,37h
ja L1
mov dl,al
mov ah,2
int 21h
inc cx
mov al,dl
and ax,7
xchg ax,bx
mul si
jc overflow ;乘法溢出,(dx,ax)高16位不为0,即ax*8超出了16位的范围
add bx,ax
jc overflow ;加法溢出,bx+ax有进位,出了16位的范围
cmp cx,6 ;最多输入6个合法字符
je print
jmp L1
;输出bx中的6位8进制
print:
cmp cx,0
je exit
mov dl,0ah
mov ah,2
int 21h
mov dl,0dh
mov ah,2
int 21h
rol bx,1 ;最高位为0/1,直接循环左移1位输出
mov dl,bl
and dl,1 ;屏蔽高7位
add dl,30h ;转换成数字字符
mov ah,2
int 21h
mov cx,5 ;接下来输出5位8进制
L2:
push cx
mov cl,3
rol bx,cl
mov dl,bl
and dl,7 ;屏蔽高5位
add dl,30h ;转换成数字字符
mov ah,2
int 21h
pop cx
loop L2
jcxz exit ;跳过下面的overflow
overflow:
lea dx,string
mov ah,9
int 21h
exit:
mov ah,4ch
int 21h
main endp
code ends
end main