汇编实验:十进制转二进制

题目

  1. 重复从键盘输入不超过5位的十进制数,按回车键结束输入
  2. 将该十进制数转换成二进制数;结果以2进制数的形式显示在屏幕上
  3. 如果输入非数字字符,则报告出错信息,重新输入
  4. 直到输入’Q’或’q’时程序运行结束

算法流程图

代码

data segment
buffer db 5 dup(?)
input db 'please input a number <= 5 digits', 0ah, 0dh, '$'
outOfBound db 0ah, 0dh, 'error: more than 5 digits',0ah, 0dh, '$'
notANum db 0ah, 0dh, 'error: not a number',0ah, 0dh,'$'
data ends

code segment
	      assume ds:data, cs:code
	start:
		mov    ax, data
	    mov    ds, ax
		mov bx, 0
		mov si, offset buffer
		mov ah, 09h
		mov dx, offset input
		int 21h
	l1:   ; 输入及判定
		mov ah, 01h
		int 21h
		cmp al, byte ptr 'q'
		je over
		cmp al, byte ptr 'Q'
		je over
		cmp al, 0dh
		je deal
		inc bx
		cmp bx, 5  
		ja error1
		cmp al, byte ptr '0'
		jb error2
		cmp al, byte ptr '9'
		ja error2
		mov [si], al
		inc si
		jmp l1
	deal:  ; 输入结束,处理数字
		mov cx, bx
		mov si, offset buffer
		mov ah, 0   ; 清除高位
		mov al, [si]
		sub al, 30h
		cmp cx, 1  ; 一位数则直接输出
		je printOne
		dec cx
	l2:
		mov bx, 0ah
		mul bx
		inc si
		mov bl, [si]
		sub bx, 30h
		add ax, bx
		loop l2
		jmp printAll
	error1:
		mov ah, 09h
		mov dx, offset outOfBound
		int 21h
		jmp start
	error2:
		mov ah, 09h
		mov dx, offset notANum
		int 21h
		jmp start
	printOne:
		mov ah, 02h
		add al, 30h
		mov dl, al
		int 21h
		jmp over
		
	printAll:
		mov cx, 10h
		mov bx, ax
	l3:		
		mov ax, bx
		and ax, 8000h  ; 取最高位
		rol ax, 1  ; 循环左移,将最高位移到最低位
		mov ah, 02h
		add al, 30h
		mov dl, al
		int 21h
		shl bx, 1
		loop l3
	over:	
		mov ah, 4ch
		int 21h
code ends
end start