汇编——十进制数据输入转二进制/十六进制输出(含数字判断,不限位数)

题目描述

输入一串十进制数,需要判断是否为数字,并将其转化成二进制和十六进制输出。

代码:
二进制:

;description
data SEGMENT
	
data ENDS 

;description
stack SEGMENT
	
stack ENDS

;description
code SEGMENT
	       ASSUME CS:CODE, DS:DATA, SS:STACK
	start: 
	       mov    ax,data
	       mov    ds,ax
	       xor    dx,dx
	begin: 
	       mov    ah,1h
	       int    21h
	       cmp    al,13
	       jz     next

	       cmp    al,39h
	       ja     begin
	       cmp    al,30h
	       jb     begin

	       mov    bx,dx
	       mov    cx,3
	       shl    dx,cl
	       shl    bx,1
	       add    dx,bx
	       and    ax,0FFh
	       sub    al,30h
	       add    dx,ax
	       jmp    begin
	next:  
	;已经得到了,在dx中
	       mov    bx,dx
	       mov    cx,16
	thorw: 
	       dec    cx
	       shl    bx,1
	       jc     ok1
	       jmp    thorw
	ok1:   
	       mov    dl,31h
	       mov    ah,2
	       int    21h
	ok2:   
	       shl    bx,1
	       jc     print1
	       mov    dl,30h
	       mov    ah,2
	       int    21h
	       jmp    next2
	print1:
	       mov    dl,31h
	       mov    ah,2
	       int    21h
	       jmp    next2
	next2: 
	       loop   ok2
		  
	       mov    ah,4ch
	       int    21h
code ENDS
end start

十六进制:

;description
data SEGMENT
	
data ENDS 

;description
stack SEGMENT
	
stack ENDS

;description
code SEGMENT
	      ASSUME CS:CODE, DS:DATA, SS:STACK
HTOA PROC
	      AND    AL,0FH
	      CMP    AL,10
	      JC     HTOA1
	      ADD    AL,7
	HTOA1:
	      ADD    AL,30H
	      RET
HTOA ENDP
main PROC
	start:
	      mov    ax,data
	      mov    ds,ax
	      xor    dx,dx
	begin:
	      mov    ah,1h
	      int    21h
	      cmp    al,13
	      jz     next

	      cmp    al,39h
	      ja     begin
	      cmp    al,30h
	      jb     begin

	      mov    bx,dx
	      mov    cx,3
	      shl    dx,cl
	      shl    bx,1
	      add    dx,bx
	      and    ax,0FFh
	      sub    al,30h
	      add    dx,ax
	      jmp    begin
	next: 
	;已经得到了,在dx中
	      mov    cx,4
	loop1:
	      push   cx
	      mov    cl,4
	      mov    ax,dx
	      shl    dx,cl
	      and    ax,0f000h
	      mov    cl,12
	      shr    ax,cl
	      pop    cx
	      call   htoa
	      push   dx
	      mov    dl,al
	      mov    ah,2
	      int    21h
	      pop    dx
	      loop   loop1
		  
	      mov    ah,4ch
	      int    21h
	      RET
main ENDP
code ENDS
end start

题目分析

判断数字

首先我们需要将输入进行筛选,并且因为是串行输入,我们还需要整合出最终的结果。
我的想法是每一个输入都进行一个判断,如果是回车(ASCII为13),就转出,证明输入结束;
如果大于39h(9 的ASCII)或者小于30h(0 的ASCII)就直接进入下一个循环。
如果是数字,将当前的数值乘十,然后加上输入的数据,继续循环。

问题:

  • 这里采用dx寄存器,所以如果输入太大其实会爆掉,但是为了简化问题,才这样做的。
  • 我们实际上的读入为ASCII值,在加上的过程中还需要减去30h。(这里的30h表示十六进制数)
  • 最开始的清零操作我采取的是xor(异或),这样比直接move要快一些。

所以我们的实现是这样的:
在这里插入图片描述
ja、jb这些跳转指令在这篇博客,shl、shr这样的位移指令在这篇博客,右侧目录快速查找。

二进制输出

十进制转其他的进制,最简单的办法其实就是直接进行除法,但是这样会造成我们每一次得到的数据是反着的,需要进行压栈出栈不好处理;另外这样实现也十分麻烦。

这里我们采取的是左移位方式,通过每一次移动一位到CF标志位,然后通过跳转指令来进行判断。
(另外一个思路是SF位,也是使用对应的跳转指令)

二进制数一共是16位,如果前面很多个0就不好看,所以我们利用一个循环将前面的0吃掉

此时我们的数据在dx寄存器中。(dx要输出,所以又放在bx中)
在这里插入图片描述
throw循环就是将SF为零的部分去掉。
注意到我们有一个ok1和2(命名规范就不要吐槽了),这是因为第一个跳出循环的一定为SF = 1,所以我们需要先进行输出。

十六进制输出

这个就不能一次移动1位了,我采取的是先复制,然后一次移动四位
内容还是在dx中,我们将其复制到ax中,然后取最高的四位,然后移动到dl第四位,这样数据顺序就是正确的。(源码中有一个and 0f000h,其实是没必要的)
在这里插入图片描述
对于一个在al低四位的十六进制数,我这里有一个现成的转ASCII子程序htoa,然后将结果打印输出即可。
在这里插入图片描述
子程序:
在这里插入图片描述
不过这部分我我就没有添加去0功能,确实不太好处理……

运行截图:
在这里插入图片描述

  • 10
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一段汇编语言代码,可以将十进制转换二进制输出: ``` MOV AX, 1234 ; 假设要将1234转换二进制 MOV BX, 2 ; 除为2 MOV CX, 16 ; 最多需要16二进制 MOV DX, 0 ; 存储余 convert_loop: XOR DX, DX ; 将余清零 DIV BX ; AX除以BX,结果存入AL,余存入AH PUSH DX ; 将余压入栈中 DEC CX ; 处理下一 CMP AX, 0 ; 如果商已经为0,则跳出循环 JNE convert_loop MOV CX, 16 ; 16二进制 print_loop: POP DX ; 从栈中弹出余 ADD DL, '0' ; 将余转换为ASCII码 MOV AH, 2 ; 调用DOS输出 MOV DL, DL ; 存储要输出的字符 INT 21h DEC CX ; 处理下一 CMP CX, 0 ; 如果已经输出了所有,跳出循环 JNE print_loop ``` 说明: 1. 首先,我们将要转换十进制存储在`AX`寄存器中,将除2存储在`BX`寄存器中,最多需要16二进制,我们将其存储在`CX`寄存器中,余存储在`DX`寄存器中。 2. 在循环中,我们反复地用除法计算商和余,将余压入栈中,直到商为0为止。循环结束后,栈中存储的余就是二进制的每一。 3. 在输出二进制时,我们反向弹出栈中的余,并将其转换为ASCII码输出即可。由于余是从低到高依次存储在栈中的,所以我们需要从栈顶开始弹出余,以保证输出二进制是从高到低的顺序。 注意:在实际使用中,我们需要根据具体情况对代码进行适当的修改,例如修改要转换十进制、除位数等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值