题目描述

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

代码:
二进制:

;description
data SEGMENTdata ENDS ;description
stack SEGMENTstack ENDS;description
code SEGMENTASSUME CS:CODE, DS:DATA, SS:STACKstart: mov    ax,datamov    ds,axxor    dx,dxbegin: mov    ah,1hint    21hcmp    al,13jz     nextcmp    al,39hja     begincmp    al,30hjb     beginmov    bx,dxmov    cx,3shl    dx,clshl    bx,1add    dx,bxand    ax,0FFhsub    al,30hadd    dx,axjmp    beginnext:  ;已经得到了,在dx中mov    bx,dxmov    cx,16thorw: dec    cxshl    bx,1jc     ok1jmp    thorwok1:   mov    dl,31hmov    ah,2int    21hok2:   shl    bx,1jc     print1mov    dl,30hmov    ah,2int    21hjmp    next2print1:mov    dl,31hmov    ah,2int    21hjmp    next2next2: loop   ok2mov    ah,4chint    21h
code ENDS
end start

十六进制:

;description
data SEGMENTdata ENDS ;description
stack SEGMENTstack ENDS;description
code SEGMENTASSUME CS:CODE, DS:DATA, SS:STACK
HTOA PROCAND    AL,0FHCMP    AL,10JC     HTOA1ADD    AL,7HTOA1:ADD    AL,30HRET
HTOA ENDP
main PROCstart:mov    ax,datamov    ds,axxor    dx,dxbegin:mov    ah,1hint    21hcmp    al,13jz     nextcmp    al,39hja     begincmp    al,30hjb     beginmov    bx,dxmov    cx,3shl    dx,clshl    bx,1add    dx,bxand    ax,0FFhsub    al,30hadd    dx,axjmp    beginnext: ;已经得到了,在dx中mov    cx,4loop1:push   cxmov    cl,4mov    ax,dxshl    dx,cland    ax,0f000hmov    cl,12shr    ax,clpop    cxcall   htoapush   dxmov    dl,almov    ah,2int    21hpop    dxloop   loop1mov    ah,4chint    21hRET
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功能,确实不太好处理……

运行截图:

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

  1. 输入一个整数,输出每个数字对应的拼音 (c++)

    输入一个整数,输出每个数字对应的拼音 (c++) 输入一个整数,输出每个数字对应的拼音.当整数为负数时,先输出fu字.十个数字对应的拼音如下: 0: ling 1: yi 2: er 3: san 4 ...

  2. L1-007 念数字 (10分) 输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下: 0: ling 1: yi 2: er 3: san 4: si 5:

    L1-007 念数字 (10分) 输入一个整数,输出每个数字对应的拼音.当整数为负数时,先输出fu字.十个数字对应的拼音如下: 0: ling 1: yi 2: er 3: san 4: si 5: ...

  3. 念数字,输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:

    输入一个整数,输出每个数字对应的拼音.当整数为负数时,先输出fu字.十个数字对应的拼音如下: 0: ling 1: yi 2: er 3: san 4: si 5: wu 6: liu 7: qi 8 ...

  4. 7-30 念数字。输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:

    输入一个整数,输出每个数字对应的拼音.当整数为负数时,先输出fu字.十个数字对应的拼音如下: 0: ling 1: yi 2: er 3: san 4: si 5: wu 6: liu 7: qi 8 ...

  5. PTA--天梯赛--输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:

    输入一个整数,输出每个数字对应的拼音.当整数为负数时,先输出fu字.十个数字对应的拼音如下: 0: ling 1: yi 2: er 3: san 4: si 5: wu 6: liu 7: qi 8 ...

  6. 输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下

    输入一个整数,输出每个数字对应的拼音.当整数为负数时,先输出fu字.十个数字对应的拼音如下 0: ling 1: yi 2: er 3: san 4: si 5: wu 6: liu 7: qi 8: ...

  7. 【C语言】将十进制数转化为二进制并输出

    十进制转化为二进制并输出(以整型为例) 首先需要明确十进制转为二进制的算法:将所需转化的数除以2,所得余数为k1,将所得商再除以2,所得余数为k2-...重复步骤直到商为0:读数时从最后一个余数读起, ...

  8. PHP输入123逆序输出321,编写程序,将一个三位数逆序输出,比如,原三位数为123,新数为321....

    编写一个程序,输入一个三位数,把这个数的百位数与个位数对调,输出对调后的数 参考:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/5522 ...

  9. c语言编程如何实现-十进制数转换成二进制和输出

    #include <iostream.h> void divideData(const float number, int &integer, float &decimal ...

最新文章

  1. NIPS 2017 | 线上分享第一期:似自然梯度的优化算法KFAC与强化学习算法ACKTR
  2. Hulu诚意出品 |《百面深度学习》重磅上市
  3. python线程暂停_在python中暂停一个线程和另一个线程
  4. cdt规约报文用程序解析_程序员必备的学习笔记《TCP/IP详解(二)》
  5. [android]netd与NetworkManagementService初印象
  6. PHP下拉框内容随单选框内容变化
  7. 苹果系统虚拟计算机win7,mac虚拟机安装win7教程
  8. Navicat 添加唯一索引
  9. 营业执照争夺背后:吴忌寒正在重塑比特大陆 |链捕手
  10. 计算机键盘中英文,苹果电脑键盘上的【⌘】键用英文怎么表达?和露营地又有什么关系...
  11. 2021-01-08
  12. 大学四年软件工程专业的学习回顾
  13. Mount is denied because the NTFS volume is already exclusively opened.The volume may be already ...
  14. linux进入桌面后CPU狂转,笔记本风扇狂转+CPU调节问题
  15. 品牌鞋的运作,如何判别鞋的品牌真伪
  16. Oracle12.2c统一审计(unified auditing)六问
  17. ssh 远程锁住解锁_超级管理员被锁定,如何解锁?
  18. matlab网页运行
  19. linux软件源历史版本,解决deepin 15.9.2以后版本软件太旧的问题,混合lion与panda源使用...
  20. 数组加链表实现hashMap代码

热门文章

  1. 浅析物联网的商业模式
  2. Kafka简介及详细安装教程
  3. Java实现调用摄像头拍照
  4. 2018-2019-2 20175317 实验三《敏捷开发与XP实践》实验报告
  5. Catalan 数之Python演示
  6. 人工湖对环境温度的调节问题
  7. ristretto255对外API抽象及基于Curve25519的ristretto255层实现
  8. vuex4 极速入门到上手
  9. Win10 上使用 MSYS 开发 Android NDK 程序
  10. 基于MPLAB X IDE配置位设置讲解