这是我原先的做法:
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