汇编语言——输入八进制数,存入BX中

输入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
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值