题目描述

输入一个最大长度为4的十六进制数,将其转换成10进制输出。
其中我们需要检测十六进制输入的正确性,比如大小写、特殊字符和数字的判断。

解决方式

程序分为两个部分,首先是处理我们的输入,以及通过除法计算十进制数的过程。

data SEGMENT USE16data ENDS
stack SEGMENT USE16db 32 dup(?)
stack ENDS
code SEGMENT USE16ASSUME CS:CODE, DS:DATA, SS:STACK
main PROCstart:   mov    ax,datamov    ds,axxor    bx,bxmov    dl,4loop1:   cmp    dl,0jz     nextmov    ah,1int    21hcmp    al,13jz     next;数字cmp    al,30hjb     loop1cmp    al,39hja     bigsub    al,30hdec    dljmp    finbig:     cmp    al,65jb     loop1cmp    al,70ja     smallsub    al,37hdec    dljmp    finsmall:   cmp    al,97jb     loop1cmp    al,102ja     loop1sub    al,87dec    dlfin:     mov    cl,4shl    bx,cland    ax,0fhadd    bx,axjmp    loop1next:    cmp    dl,0jnz    no_needmov    dl,10mov    ah,2int    21hmov    dl,13mov    ah,2int    21hno_need: mov    ax,bxmov    cx,10xor    bx,bxturn_in: xor    dx,dxdiv    cxpush   dxinc    blcmp    ax,0jz     turn_outjmp    turn_inturn_out:pop    dxadd    dl,30hmov    ah,2int    21hdec    blcmp    bl,0jnz    turn_outmov    ah,4chint    21h
main ENDP
code ENDS
end start

输入(next标号之前)

首先看一下输入部分,我们需要解决四个问题。

  • 输入结束有两个标准,一个是输入满四位,另一个是检测到回车
  • 不论是大小写还是数字,我们都需要读入(记住读入的是ascii,还需要处理一下)
  • 对于其他字符,我们需要跳过,进行下一个循环
  • 如果是需要读入,我们就需要将原来的数据左移四位(乘16),然后加上处理过的输入。

首先,我们将dl作为计数器,每一次循环观测dl是否为0,同时读入一个数据,判断是否为回车(ascii为13)。
然后我们判断一下输入的正确性问题。这里我画出了ascii表中数字和大小写的排列顺序。

所以我们是这样判断的:

这就是我们的跳转流程。
(为什么要减这些数,自己查一下ASCII,当增强记忆了)

与其说这个结构是if_else,我倒是感觉更像case,其中的jmp指令就像是break,如果没有break,那么我们就会将下一个分支也执行了,导致出错。

在每一次读入之后,我们说白了其实是将之前的作为高位,然后加入低位。
(比如输入十进制123,我们是先将12左移一位,也就是乘十,然后加三)
这里也一样,不过我们需要bx右移四位(寄存器中为二进制数),然后加上存储在al的值。

另外附上我们的测试案例:(1e23),可以看到BX值正确。

输出

这里因为是十进制的输出,我们之前还可以通过进制偷懒(指输出二进制或十六进制数),现在是不行了。
这里我们采用每一次除以10,将余数压栈的方式,存储好结果的相反顺序,然后pop到dl,进行输出。

这里先讲一下汇编的乘除法吧。
对于两个二进制数来说,a位乘以b位的,那么结果一定不会大于a+b位。
(2a-1-1和2b-1-1一定小于2a+b-1
我们在除的过程中也是如此,因为bx是16位,我们的除数10为4位,所以我们的结果是不能用al和ah放下的(余数小于等于除数的位数,商小于等于被除数位数减除数位数。)
那么我们还有一种办法,就是将DX:AX作为被除数,将CX作为除数,这样商在AX,余数在DX,就能放下了。
如果是再次除,我们只需要将dx置零。
效果:

通过这样一个案例,我们知道了选择除法范围也是有考量的,不是怎么方便怎么来的。

turn_in循环就实现了每一次将ax寄存器除以十,商在ax,余数在dx,将dx压栈后清零,再次进行除法。
每一次除法我们都将计数器bl自增,方便出栈使用。
当ax寄存器为0,我们结束循环,进入到输入(turn_out)部分。

turn_out部分我们每一个循环都弹出一个dx,因为dx的余数一定是小于10的,我们直接加30h输出即可。

这里写的不是太好,其实完全可以将bl放在cl中,然后直接loop的。

补充

这部分最重要应该就是跳转逻辑和我们的除法部分。

另外讲解一下no_need标签部分:
因为我们如果是输入满四位,会强制性结束输入,这时就没有我们的回车显示了,所以我加了一个判断来进行换行,看着比较舒服,没别的意思。

然后补充一下自己的十进制输入转二进制/十六进制输出的案例。

汇编——十六进制输入转换十进制输出(附加输入检测)相关推荐

  1. java十进制输出_JAVA输入一个十进制数N,输出r进制的数

    \\引入包 import java.util.Scanner; import java.util.Stack; public class Change { public static void mai ...

  2. c语言实验输入数字星期输出英文,输入数字星期,输出英文

    Problem G: C语言实验--输入数字星期,输出英文(选择结构-switch) Time Limit:1 Sec Memory Limit: 64 MB Submit:205 Solved:12 ...

  3. IEEE-754十六进制浮点数转换十进制浮点数

    def mConvertTo(mfloatingPoint) :mfloatingPointString = str(mfloatingPoint)[2:]#去除0bmfloatingPointStr ...

  4. 实现输入一个十进制正整数转换为二进制输出

    package com.study;import java.util.Scanner;/** 输入一个十进制正整数转换为二进制*/ public class Conversion {public st ...

  5. 输入重定向,输出重定向,管道相关内容及实现方法

    近期,通过实现shell了解了输入重定向,输出重定向,管道- 用自己的话总结定义: 输入重定向:把<右边的文件的内容输入到<左边的命令中. 输出重定向:把运行>左边命令得出的结果输入 ...

  6. 二进制、八进制、十进制和十六进制的转换

    二进制.八进制.十进制和十六进制的转换 进制概述 二进制.八进制.十进制和十六进制的组成 进制转换 其他进制到十进制 十进制到其他进制 二进制到八进制和二进制到十六进制的转换 十进制和二进制的快速转换 ...

  7. c语言整形变量x 进制转换,求一个C语言程序 输入整型变量x 输出整型变量x对应的十进制、八进制和十六进制形...

    满意答案 发的地方ssd发 推荐于 2018.05.10 采纳率:42%    等级:9 已帮助:112人 printf自带输出格式. %d是十进制输出, %x是十六进制输出. %o是八进制输出.用p ...

  8. 设计程序,从键盘输入十进制数,结果存放在BUFFER中(无符号数,16位),再把结果以十六进制方式在屏幕输出。

    只为记录汇编作业 题目:设计程序,从键盘输入十进制数,结果存放在BUFFER中(无符号数,16位),再把结果以十六进制方式在屏幕输出. 例如:若键盘输入: 65534:则转换完,屏幕输出:FFFE 代 ...

  9. c中输入一个十进制数,输出它的八进制二进制以及十六进制

    代码: #include <stdio.h> int main() { int i;scanf("%d",&i);printf("八进制为:%o\n& ...

最新文章

  1. Smokeping图表参数说明
  2. Android开发技术周报 Issue#81
  3. [概统]本科二年级 概率论与数理统计 第五讲 二元随机变量
  4. opencv python教程简书_OpenCV-Python系列二:常用的图像属性
  5. LeetCode之最大回文串--动态规划
  6. git commit --amend修改git commit提交的message
  7. 我被跨系统的换行符折磨疯了~~~
  8. jeecg-framework-3.1.0.RELEASE 正式发布
  9. python禁用警告
  10. lua 给userdata设置元表_提高Lua语言开发效率的简单方法
  11. [设计模式-行为型]迭代器模式(Iterator)
  12. c语言必背100代码,C语言代码大全(c语言必背项目代码)
  13. 『动态规划』最大子段和
  14. IEEE期刊最新的影响因子
  15. 使用Springboot+Feign Clients快速搭建REST客户端应用
  16. php免费人机验证,Antiboter是一个界面漂亮且方便使用的PHP后台的图片人机验证
  17. 越南语常用的40句口语
  18. 线段树求逆序对(hdu1394Minimum Inversion Number)
  19. PhpStudy在nginx下配置虚拟主机和伪静态
  20. Cesium中获取地形三角网并进行土方计算

热门文章

  1. SpringCloud学习笔记02-服务提供者与服务消费者
  2. Netty框架之概述及基本组件介绍
  3. 美和易思 · 「云农职互联网技术学院」HTML+CSS 做西普尼金表官网
  4. いたずら極悪 +イチャずら+かすたむアイドロイドAi 转区破解+界面汉化补丁
  5. Global Illumination_Horizon-Based Ambient Occlusion(HBAO)
  6. python模块安装的几种方法
  7. 程序员的四种境界 西安尚学堂
  8. 使用运行时间分析工具SE30优化ABAP程序
  9. 解决使用 MMKV Ashmem 报 MMKVContentProvider has invalid authority
  10. java sftp 上传文件_java使用SFTP上传文件到资源服务器