汇编——十进制数据输入转二进制/十六进制输出(含数字判断,不限位数)
题目描述
输入一串十进制数,需要判断是否为数字,并将其转化成二进制和十六进制输出。
代码:
二进制:
;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功能,确实不太好处理……
运行截图:
汇编——十进制数据输入转二进制/十六进制输出(含数字判断,不限位数)相关推荐
- 输入一个整数,输出每个数字对应的拼音 (c++)
输入一个整数,输出每个数字对应的拼音 (c++) 输入一个整数,输出每个数字对应的拼音.当整数为负数时,先输出fu字.十个数字对应的拼音如下: 0: ling 1: yi 2: er 3: san 4 ...
- 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: ...
- 念数字,输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:
输入一个整数,输出每个数字对应的拼音.当整数为负数时,先输出fu字.十个数字对应的拼音如下: 0: ling 1: yi 2: er 3: san 4: si 5: wu 6: liu 7: qi 8 ...
- 7-30 念数字。输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:
输入一个整数,输出每个数字对应的拼音.当整数为负数时,先输出fu字.十个数字对应的拼音如下: 0: ling 1: yi 2: er 3: san 4: si 5: wu 6: liu 7: qi 8 ...
- PTA--天梯赛--输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:
输入一个整数,输出每个数字对应的拼音.当整数为负数时,先输出fu字.十个数字对应的拼音如下: 0: ling 1: yi 2: er 3: san 4: si 5: wu 6: liu 7: qi 8 ...
- 输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下
输入一个整数,输出每个数字对应的拼音.当整数为负数时,先输出fu字.十个数字对应的拼音如下 0: ling 1: yi 2: er 3: san 4: si 5: wu 6: liu 7: qi 8: ...
- 【C语言】将十进制数转化为二进制并输出
十进制转化为二进制并输出(以整型为例) 首先需要明确十进制转为二进制的算法:将所需转化的数除以2,所得余数为k1,将所得商再除以2,所得余数为k2-...重复步骤直到商为0:读数时从最后一个余数读起, ...
- PHP输入123逆序输出321,编写程序,将一个三位数逆序输出,比如,原三位数为123,新数为321....
编写一个程序,输入一个三位数,把这个数的百位数与个位数对调,输出对调后的数 参考:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/5522 ...
- c语言编程如何实现-十进制数转换成二进制和输出
#include <iostream.h> void divideData(const float number, int &integer, float &decimal ...
最新文章
- NIPS 2017 | 线上分享第一期:似自然梯度的优化算法KFAC与强化学习算法ACKTR
- Hulu诚意出品 |《百面深度学习》重磅上市
- python线程暂停_在python中暂停一个线程和另一个线程
- cdt规约报文用程序解析_程序员必备的学习笔记《TCP/IP详解(二)》
- [android]netd与NetworkManagementService初印象
- PHP下拉框内容随单选框内容变化
- 苹果系统虚拟计算机win7,mac虚拟机安装win7教程
- Navicat 添加唯一索引
- 营业执照争夺背后:吴忌寒正在重塑比特大陆 |链捕手
- 计算机键盘中英文,苹果电脑键盘上的【⌘】键用英文怎么表达?和露营地又有什么关系...
- 2021-01-08
- 大学四年软件工程专业的学习回顾
- Mount is denied because the NTFS volume is already exclusively opened.The volume may be already ...
- linux进入桌面后CPU狂转,笔记本风扇狂转+CPU调节问题
- 品牌鞋的运作,如何判别鞋的品牌真伪
- Oracle12.2c统一审计(unified auditing)六问
- ssh 远程锁住解锁_超级管理员被锁定,如何解锁?
- matlab网页运行
- linux软件源历史版本,解决deepin 15.9.2以后版本软件太旧的问题,混合lion与panda源使用...
- 数组加链表实现hashMap代码