设为首页收藏本站淘宝杂货铺

从F到0 - From F to 0

 找回密码
 注册已关闭
搜索
查看: 3544|回复: 1
收起左侧

易语言汇编置入代码实现字节集与十六进制文本型字符串极速互相转换 (不区分大小写)

[复制链接]
发表于 2018-9-27 10:24:05 | 显示全部楼层 |阅读模式

  1. .版本 2
  2. .支持库 spec

  3. .程序集 程序集1

  4. .子程序 _启动子程序, 整数型, , 请在本子程序中放置易模块初始化代码


  5. _临时子程序 ()  ' 在初始化代码执行完毕后调用测试代码
  6. 返回 (0)  ' 可以根据您的需要返回任意数值

  7. .子程序 _临时子程序
  8. .局部变量 字节集, 字节集
  9. .局部变量 十六进制文本, 文本型
  10. .局部变量 字节集2, 字节集

  11. 字节集 = 到字节集 (“Hello World! 中文测试”)

  12. 十六进制文本 = 取空白文本 (左移 (取字节集长度 (字节集), 1))
  13. 置入代码_字节集到十六进制文本 (字节集, 十六进制文本, 真)

  14. 调试输出 (“十六进制文本”, 十六进制文本)

  15. 字节集2 = 取空白字节集 (右移 (取文本长度 (十六进制文本), 1))
  16. 置入代码_十六进制文本到字节集 (十六进制文本, 字节集2)
  17. 调试输出 (“转换后”, 到文本 (字节集2))
  18. ' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。



  19. .子程序 置入代码_字节集到十六进制文本, , 公开,  
  20. .参数 字节集, 字节集
  21. .参数 结果文本, 文本型, 参考, 调用前结果文本必须进行 取空白文本(左移(取字节集长度(字节集),1))
  22. .参数 大写, 逻辑型, , 是否以大写结果输出

  23. 置入代码 ({ 139, 69, 8, 138, 93, 16, 128, 227, 1, 139, 16, 139, 66, 4, 131, 194, 8, 185, 0, 0, 0, 0, 235, 11, 80, 138, 4, 17, 232, 10, 0, 0, 0, 88, 65, 59, 200, 114, 241, 201, 194, 12, 0, 80, 81, 82, 81, 209, 225, 139, 209, 89, 139, 77, 12, 139, 9, 138, 224, 192, 232, 4, 232, 18, 0, 0, 0, 136, 4, 10, 138, 196, 232, 8, 0, 0, 0, 136, 68, 10, 1, 90, 89, 88, 195, 36, 15, 60, 0, 114, 8, 60, 9, 119, 4, 4, 48, 235, 11, 128, 251, 1, 117, 4, 4, 55, 235, 2, 4, 87, 195 })
  24. ' mov eax,[ebp+8] ;字节集地址
  25. ' mov bl,[ebp+16] ;大小写 1大写0小写
  26. ' and bl,1
  27. ' mov edx,[eax] ;字节集数据地址
  28. ' mov eax,[edx+4] ;字节集长度
  29. ' add edx,8 ;字节集数据地址+8
  30. ' mov ecx,0 ;字节集指针计数
  31. ' .while ecx < eax
  32. ' push eax
  33. ' mov al,[edx+ecx] ;字节集值 送AL寄存器
  34. ' CALL WRITE_TEXT
  35. ' pop eax
  36. ' inc ecx
  37. ' .endw
  38. ' leave
  39. ' retn 12
  40. ' WRITE_TEXT: ;写文本 ECX 地址 AL值
  41. ' push eax
  42. ' push ecx
  43. ' push edx
  44. ' push ecx ; 高位地址 EDX=ECX*2 低位=高位+1
  45. ' shl ecx,1
  46. ' mov edx,ecx
  47. ' pop ecx
  48. ' mov ecx,[ebp+12] ;文本地址
  49. ' mov ecx,[ecx]  ;文本数据地址
  50. ' mov ah,al
  51. ' shr al,4
  52. ' CALL DEC2HEX
  53. ' mov [ecx+edx],al ;写高位
  54. ' mov al,ah
  55. ' CALL DEC2HEX
  56. ' mov [ecx+edx+1],al ;写低位
  57. ' pop edx
  58. ' pop ecx
  59. ' pop eax
  60. ' ret
  61. ' DEC2HEX: ;十进制整数(0~15)转十六进制Ascii (AL进出)
  62. ' AND AL,0FH ;处理低8位
  63. ' .if Al >=0 && Al <=9 ;数字
  64. ' ADD AL,30H
  65. ' .else
  66. ' .if BL == 1
  67. ' ADD AL,37H ;大写+37H
  68. ' .elseif
  69. ' ADD AL,57H ;小写+57H
  70. ' .endif
  71. ' .endif
  72. ' ret


  73. .子程序 置入代码_十六进制文本到字节集, , 公开
  74. .参数 输入文本, 文本型, , 不区分大小写,不得为奇数字节,非十六进制字符视为0处理
  75. .参数 结果字节集, 字节集, 参考, 调用前结果字节集必须进行 取空白字节集(右移(取文本长度(输入文本),1))

  76. 置入代码 ({ 139, 85, 8, 139, 18, 139, 77, 12, 139, 9, 131, 193, 8, 102, 139, 2, 102, 11, 192, 117, 2, 235, 15, 134, 224, 232, 10, 0, 0, 0, 136, 25, 131, 194, 2, 65, 235, 231, 201, 195, 102, 82, 138, 212, 232, 17, 0, 0, 0, 138, 218, 192, 227, 4, 138, 208, 232, 5, 0, 0, 0, 10, 218, 102, 90, 195, 128, 250, 48, 114, 10, 128, 250, 57, 119, 5, 128, 234, 48, 235, 32, 128, 250, 65, 114, 10, 128, 250, 70, 119, 5, 128, 234, 55, 235, 17, 128, 250, 97, 114, 10, 128, 250, 102, 119, 5, 128, 234, 87, 235, 2, 178, 0, 195 })
  77. ' mov edx,[ebp+8]  ;文本地址
  78. ' mov edx,[edx]  ;文本数据地址
  79. ' mov ecx,[ebp+12] ;字节集地址
  80. ' mov ecx,[ecx]  ;字节集数据地址
  81. ' add ecx,8  ;数据地址+8
  82. ' START:
  83. ' mov ax,[edx] ;读文本2字节到AX寄存器
  84. ' .if ax == 0 ;读到空字符
  85. ' JMP ASM_END  ;结束转换
  86. ' .endif
  87. ' xchg ah,al  ;AH与AL交换 (AX高低字节交换)
  88. ' CALL BYTE_HEX2DEC ;调用十六进制字符串转10进制
  89. ' mov [ecx],bl  ;将转换结果写入字节集
  90. ' add edx,2 ;文本数据地址+2
  91. ' inc ecx  ;字节集数据地址+1
  92. ' JMP START
  93. ' ASM_END:
  94. ' leave
  95. ' retn 8
  96. ' BYTE_HEX2DEC: ;将2个16进制字符串转为10进制 AX进 BL出(0~255)
  97. ' push dx
  98. ' mov dl,ah ;处理高位
  99. ' call HEX2DEC
  100. ' mov bl,dl
  101. ' shl bl,4 ;左移4位
  102. ' mov dl,al ;处理低位
  103. ' call HEX2DEC
  104. ' or bl,dl
  105. ' pop dx
  106. ' ret
  107. ' HEX2DEC: ;将1个16进制字符串转换为10进制 DL进DL出(0~15)
  108. ' .if dl >= 48 && dl <= 57 ;数字
  109. ' sub dl,48
  110. ' .elseif dl >= 65 && dl <=70 ;大写字母
  111. ' sub dl,55
  112. ' .elseif dl >= 97 && dl <=102 ;小写字母
  113. ' sub dl,87
  114. ' .else    ;非法字符
  115. ' mov dl,0
  116. ' .endif
  117. ' ret
复制代码


相关帖子

您需要登录后才可以回帖 登录 | 注册已关闭

本版积分规则

QQ|手机版|Archiver|从F到0 ( 蒙ICP备17002595号-1 )
蒙公网安备15010402000325号

腾讯云安全认证

GMT+8, 2024-4-20 10:39 , Processed in 0.422024 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表