汇编语言——输入16位二进制数,存入BX

本文介绍了两种编程方法,通过逻辑操作和INT21H中断处理程序,实现用户输入的ASCII码转换为16位二进制表示,包括使用左移和右移运算以及带进位加法的版本。
摘要由CSDN通过智能技术生成

在这里插入图片描述

这是我原先的做法:

shl bx,1			;bx逻辑左移一位
sub dl,30h			;键盘输入的0/1,ASCII码分别为30h/31h,要转换成0/1
add bl,dl			;bl逻辑左移一位后加上现在输入的字符
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 bx,0			;bx清零
	mov cx,16			;最多输入16位0/1
L1:	
	mov ah,7			;用7号功能输入,不会回显
	int 21h
	
	;判断输入合法性
	cmp al,0dh			;回车结束		
	je L2
	cmp al,30h			;输入的字符ASCII码小于30h,重新输入
	jb L1
	cmp al,31h			;输入的字符ASCII码大于31h,重新输入
	ja L1
	
	mov dl,al			;合法输入回显
	mov ah,2
	int 21h
	
	shl bx,1			;bx逻辑左移一位
	sub dl,30h			;键盘输入的0/1,ASCII码分别为30h/31h,要转换成0/1
	add bl,dl			;bl逻辑左移一位后加上现在输入的字符
		
	dec cx				;输入计数
	cmp cx,0			;已经输入16位,退出
	je L2
	jmp L1

;输出bx中的16位二进制
;如果不以回车结束,直接输出会跟在原来的输入后面
;给输出加上回车和换行	
L2:
	mov cx,16			;循环16次
	
	mov dl,0dh			;回车
	mov ah,2
	int 21h
	
	mov dl,0ah			;换行
	mov ah,2
	int 21h
	
L3:	
	mov dl,30h
	rol bx,1
	adc dl,0
	mov ah,2
	int 21h
	loop L3
	
	mov ah,4ch
	int 21h
main endp
code ends
	end main

第二种做法:

shl bx,1			;bx逻辑左移一位
shr dl,1			;dl逻辑右移一位(使用int 21h后ax的值已经改变,不能使用al)
adc bx,0			;带进位加法
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 bx,0			;bx清零
	mov cx,16			;最多输入16位0/1
L1:	
	mov ah,7			;用7号功能输入,不会回显
	int 21h
	
	;判断输入合法性
	cmp al,0dh			;回车结束		
	je L2
	cmp al,30h			;输入的字符ASCII码小于30h,重新输入
	jb L1
	cmp al,31h			;输入的字符ASCII码大于31h,重新输入
	ja L1
	
	mov dl,al			;合法输入回显
	mov ah,2
	int 21h
	
	shl bx,1			;bx逻辑左移一位
	shr dl,1			;dl逻辑右移一位(使用int 21h后ax的值已经改变,不能使用al)
	adc bx,0			;带进位加法
		
	dec cx				;输入计数
	cmp cx,0			;已经输入16位,退出
	je L2
	jmp L1

;输出bx中的16位二进制
;如果不以回车结束,直接输出会跟在原来的输入后面
;给输出加上回车和换行	
L2:
	mov cx,16			;循环16次
	
	mov dl,0dh			;回车
	mov ah,2
	int 21h
	
	mov dl,0ah			;换行
	mov ah,2
	int 21h
	
L3:	
	mov dl,30h
	rol bx,1
	adc dl,0
	mov ah,2
	int 21h
	loop L3
	
	mov ah,4ch
	int 21h
main endp
code ends
	end main
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值