用汇编实现二进制数和十六进制数的相互转换

淡淡的烟草味﹌ 2023-03-04 11:26 104阅读 0赞

用汇编实现二进制数向十六进制数的转换

一、实现功能

1)实现二进制数向十六进制数的转换
2)实现十六进制数向二进制数的转换‘

二、设计分析

  1. 汇编语言中,字符在机器中都是以ascii码的二进制格式存储,但是汇编语言写的时候常用十六进制,因此需要好好看看ascii码的十六进制表。
  2. 特别是进制转换一定要注意,**机器中存储的是数的二进制数本身,而我们输入输出的是数的ascii码的值,因此注意对寄存器中数的加减操作。**
  3. 四位二进制数对应一位十六进制数,**这里写的也是四位二进制和一位十六进制之间的的转换**。
  • 实现四位二进制数向十六进制数的转换

  1. 先输入四位的二进制数,每输入一位二进制数就判断输入的时0还是1,即将该数和30H做比较。
  2. 将DL赋值为0。如果输入的数是0,则将DL和0进行或运算(也可以不进行逻辑运算直接移位),将DL的最后一位置为0;如果输入的数是1,则将DL和1进行或运算,将DL的最后一位置为1。然后将DL向左移一位。进行4次循环,级输入4为二进制数。四位输入完毕后,DL就得到输入数的二进制。
  3. 判断DL是否在0-9之间,如果在则ADD DL,30H;如果大于0-9,则ADD DL,37H。(注意输出的字符的值是不等于机器中存放的二进制的值,因此需要进行加法)最后输出对应的16进制的ascii码的值。如果小于0-9则JMP到程序开始重新输入功能序号。
  4. 二进制转十六进制的流程图:
    watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDE5NDI5OQ_size_16_color_FFFFFF_t_70_pic_center

    • 实现一个十六进制数向二进制数的转换

  5. 先输入一个16进制数,判断输入字符的ascii码在30H-39H(0-9)之间,还是在41H-46H(A-F)之间,或者是在61H-66H(a-f)之间。如果是第一种情况则SUB DL,30H,如果是第二种情况则SUB DL,37H,如果是第三种情况则SUB DL,57H。即可得到输入的十六进制数的值,而不是字符的ascii码的值。

  6. 最后需要将DL中的值以二进制输出,因为机器里存放的就是以二进制存放。这里我用循环左移的方式,从二进制的高位到低位一次循环打印。将循环左移一位后的数与1进行与运算,得到最低位的大小(也就是当前准备输出的位置的大小),然后加上30H,得到0/1的ascii码值,依次将DL的值进行输出。
  7. 需要注意,第2步进行与运算的时候不能再原来的寄存器上进行,否则只能得到一位二进制数,后面几位都没法求了。
  8. 一个十六进制数向二进制数的转换流程图:
    在这里插入图片描述

三、设计分析

四位二进制数向十六进制数的转换

  1. DATA SEGMENT
  2. TIP DB 'INPUT THE NUMBER: ','$'
  3. TIP1 DB ' <=> ','$'
  4. DATA ENDS
  5. CODE SEGMENT
  6. ASSUME CS:CODE,DS:DATA
  7. START:
  8. MOV AX,DATA
  9. MOV DS,AX
  10. LEA DX,TIP
  11. MOV AH,09H
  12. INT 21H
  13. MOV CH,4
  14. MOV DL,0
  15. INPUT:
  16. MOV AH,1
  17. INT 21H
  18. CMP AL,30H
  19. JA L1 ;输入的是1
  20. ROL DL,1
  21. OR DL,0
  22. JMP AGAIN
  23. L1:
  24. ROL DL,1
  25. OR DL,1
  26. AGAIN:
  27. DEC CH
  28. JZ PRINT
  29. JMP INPUT
  30. PRINT:
  31. CMP DL,0
  32. JB EXIT
  33. CMP DL,9
  34. JA COMPER1
  35. ADD DL,30H
  36. JMP HEN
  37. COMPER1:
  38. ADD DL,37H
  39. HEN:
  40. MOV AL,DL
  41. LEA DX,TIP1
  42. MOV AH,09H
  43. INT 21H
  44. MOV DL,AL
  45. MOV AH,02H
  46. INT 21H
  47. EXIT:
  48. MOV AH,4CH
  49. INT 21H
  50. CODE ENDS
  51. END START

实现一个十六进制数向二进制数的转换

  1. DATA SEGMENT
  2. TIP DB 'INPUT THE NUMBER: ','$'
  3. TIP1 DB ' <=> ','$'
  4. DATA ENDS
  5. CODE SEGMENT
  6. ASSUME CS:CODE,DS:DATA,SS:STACK
  7. START:
  8. MOV AX,DATA
  9. MOV DS,AX
  10. LEA DX,TIP
  11. MOV AH,09H
  12. INT 21H
  13. INPUT:
  14. MOV AH,1
  15. INT 21H
  16. CMP AL,30H
  17. JB EXIT
  18. CMP AL,39H
  19. JA COMPER1
  20. JMP CHANGE1 ;在0~9之间
  21. COMPER1:
  22. CMP AL,41H
  23. JB EXIT
  24. CMP AL,46H
  25. JA COMPER2
  26. JMP CHANGE2 ;在A-F之间
  27. COMPER2:
  28. CMP AL,61H
  29. JB EXIT
  30. CMP AL,66H
  31. JA EXIT
  32. JMP CHANGE3 ;在a~f之间
  33. CHANGE1:
  34. SUB AL,30H
  35. JMP ENT
  36. CHANGE2:
  37. SUB AL,37H
  38. JMP ENT
  39. CHANGE3:
  40. SUB AL,57H
  41. JMP ENT
  42. ENT:
  43. LEA DX,TIP1
  44. MOV AH,09H
  45. INT 21H
  46. MOV CH,8
  47. MOV BL,AL
  48. PRINT:
  49. ROL BL,1
  50. MOV DL,BL
  51. AND DL,1
  52. ADD DL,30H
  53. MOV AH,02H
  54. INT 21H
  55. DEC CH
  56. JZ EXIT
  57. JMP PRINT
  58. EXIT:
  59. MOV AH,4CH
  60. INT 21H
  61. CODE ENDS
  62. END START

发表评论

表情:
评论列表 (有 0 条评论,104人围观)

还没有评论,来说两句吧...

相关阅读