学习汇编语言-输入十进制数转为十六进制和二进制

需求分析

十进制接收:依次输入十进制数,运算存储在bx中以回车键结束
转十六进制:依次出栈十进制数,循环左移十进制,al转换十六进制,末尾拼接H
转二进制:利用寄存器除2取余实现末尾拼接B

难点:
十进制移位获取十六进制
寄存器除法

详细代码

data segment
	ctr db 0DH,0AH,'$'
	input_str db 'Enter a decimal number one by one. The Enter key is complete,Maximum 65535!','$'
	binary db '2-decimal: ','$'
	decimalism db '10-decimal: ','$'
	hexadecimal db '16-decimal: ','$'
data ends

stack segment
	
stack ends

code segment
	assume cs:code,ds:data,ss:stack
	start:
    mov ax,data
    mov ds,ax                  ;DS寄存器指向数据段
 
	main:
		lea dx,input_str  ;提示输入
		call pr09
		call crlf          ;在下一行显示
		call read          ;读入十进制数,结果在BX
		call crlf          ;在下一行显示
		push bx
		call convert2   ;进行转换并输出
		call crlf
		pop bx
		call crlf
		call convert16   ;进行转换并输出
		call crlf          ;在下一行显示
		jmp ex               ;跳转到程序结束
    
	read proc near    ;读入函数READ
		lea dx,decimalism
		call pr09
		mov bx,0
		newchar:
			mov ah,1          ; INT 21H, AH=1表示从键盘带回显读入字符到AL中
			int 21h
			xor ah,ah		  
			cmp al,'0'        ;如果输入‘0'-'9'之外的字符,则结束读入
			js exit
			cmp al,'9'
			ja exit
			sub al,'0'         ;把字符转换为数字,比如'8'转换为数字8,保存在AL
			xchg bx,ax     ;寄存器内容交换
			mov cx,0ah
			mul cx           ;把之前输入的数乘以10,加上本次输入,保存到BX.
			xchg bx,ax
			add bx,ax
			jmp newchar   ;结果在BX
   
    	exit:
    		ret
	read endp
  
	convert16 proc near   ;转换函数
		mov ch,04D
		lea dx,hexadecimal
		call pr09
		rotate:
			mov cl,04D
			rol bx,cl        ;BX循环左移4个bit, 也就是把最高位的16进制数放到BL的末尾
			mov al,bl
			and al,0FH      ;4位数放到AL
			add al,30H     ;转换为ASCII
			cmp al,'9'
			jb print        ;字符为'9'之下,直接显示;这个条件好象不对啊,应该是JBE才对
			add al,07H   ;'9'之上的,转换为'A'-'F'
		
		print:
			mov dl,al     ;显示字符
			call pr02
			dec ch
			jne rotate   ;循环
			mov dl,'H'     ;显示字符
			call pr02
			ret
	convert16 endp

	convert2 proc near   ;转换函数
		lea dx,binary
		call pr09
		mov ax,bx ;将记录的十进制数放入ax寄存器,预备除法
		mov cx,0 ;记录运算次数
		rotate1:
			inc cx
			mov dx,0 ;利用除数取模得到二进制,高位归0
			mov bx,2 ;设置被除数
			div bx ;执行除法

			push dx    ;余数入栈
    		cmp ax,0   ;比较商
    		ja rotate1   ;是否大于0,则继续除
		print1:
			pop ax      ;余数依次出栈,这里正好是倒着
    		add al,48   ; al+48形成ascii码
    		mov ah,0eh  ;打印
    		int 10h
			loop print1  ;循环打印,cx中存在记录
		mov dl,'B'     ;显示字符
		call pr02
		ret
	convert2 endp
	
	crlf proc near 
		lea dx,ctr
		mov ah,09h
		int 21h
		ret
	crlf endp

	pr09 proc near
		mov ah,09h
		int 21h
		ret
	pr09 endp
	
	pr02 proc near
		mov ah,2
		int 21h
		ret
	pr02 endp

	ex: 
		mov ah,4ch
		int 21h       
code ends
end start

参考文章

汇编语言练习题
十进制转十六进制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Min;

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值