开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1089|回复: 24
收起左侧

[易源码分享] 汇编 十到十六和十六到十

[复制链接]
结帖率:60% (3/5)
发表于 2024-11-3 19:31:18 | 显示全部楼层 |阅读模式   广西壮族自治区柳州市
分享源码
界面截图: -
是否带模块: -
备注说明: -
起因是我用winAPI 转换十六到十,发现结果错了,看了半天原来是我复16进制文本时未尾多了一个空格....
感觉API转换兼容性也是有点差,于是在论坛找了一圈汇编转换,发现还不少,但都不太理想,就自己动手撸了个,自认为还行的
十六到十_EX  像 “ 0x1e*240 " ,"   0x**1e240**" ,"1E240  " ,"1 e 2 4 0".等等这种有错误的格式都可以正确转换为10进制123456  ”-1e240",“-0x1E240"  可以转换为 -123456

既然撸了16到10那也顺便把10到16也整了,
十到十六_EX

可设转换后字符个数个,最多16(长整数的16进制最大字符个数),但是必须大于实际转换后的字符数才会生效(这个是参考了delphi  IntToHex的设定)
比如 123456 设转换后的字符数为8则返回 0001E240 如果设返回字符数为2那么会返回1E240,因为转换后实际字符数超过2,设置无效
还可以选择返回的16进制文本是否带0x标志的前缀....





  
子程序名返回值类型公开备 注
十六到十_EX长整数型 
参数名类 型参考可空数组备 注
十六进制文本文本型可以无限制文本字符数,但实际只会转换文本前20个字符中包括的的(0-9 A-F a-f),如果最前一个是"-"号,则转换后整数*-1
' __asm{
' ; push esi ;保存现场,32位 eax和你edx可以随便用,其他的要使用到的尽量保存一下,后面好还原
' ; push edi
' ; push ebx
' ; xor edx,edx ;清空一些奇存器
' ; mov eax,edx
' ; mov edi,eax
' ; xor ebx,ebx
' ; mov esi,dword [ebp+8]
' ; mov esi,dword [esi] ;取参数文本指针
' ; label_start: ;循环开始标记
' ; mov bl,byte [esi+edi];取单个字符的ASCII码,esi文本指针,edi字符计数器
' ; test bl,bl
' ; je short label_exit ;如果ASCII码为0表示已到字符串尾,没有字符要处理,跳出循环
' ; cmp bl,102
' ; ja short next ;ASCII码大于102也就是大于f,不是16进制字符,跳去循环尾准备处理下一个字符
' ; cmp bl,48
' ; jb short next ;ASCII码小于48 不是16进制字符
' ; cmp bl,97 ;先处理小写
' ; jb short upper ;ASCII码<97也就是48-96有可能是数字和大写字母,先跳去大写处理 再进一步分析
' ; sub bl,87 ;剩下97-102之间也就是小写 a-f 减去87就是实际数值10-15
' ; jmp short xxxxx
' ; upper: ;大写处理标记
' ; cmp bl,70
' ; ja short next ;ASCII码 >70 <97 不是16进制字符 ,跳去准备处理下一位字符
' ; cmp bl,65
' ; jb short number ;<65 48-64之间包括数字0-9的ASCII码 跳去数字处理
' ; sub bl,55 ;剩下65-70 就是A-F的ACSII码 减去55 就是实际数字10-15
' ; jmp short xxxxx ;跳去运算
' ; number: ;数字处理标记
' ; cmp bl,57
' ; ja short next ;大于 57 不是16进制字符,跳去准备处理下一位字符
' ; sub bl,48 ;剩下48-57之间为"0"-"9"的ASCII码 - 48 就是实际数值0-9
' ; xxxxx: ;运算标记
' ; shld edx,eax,4 ;edx左移4位,把eax高4位补给edx低4位,此时eax不变
' ; shl eax,4 ;再把eax左移4位
' ; add eax,ebx ;eax加上单个字符转换后的数字(0-15)
' ; next: ;循环尾部标记,准备下一次循环需要的数值
' ; inc edi ;字符计数器+1,定位下一字符
' ; cmp edi,19
' ; ja short label_exit ;如果字符大于19个,跳出循环,(16进制文本最多只有16个字符加上0x前缀(也可以没有)和-号,最多19个)
' ; jmp short label_start;跳到循环头部,处理下一个字符
' ; label_exit: ;循环结束标记
' ; cmp byte [esi],'-' ;处理负号,16进制可以带“-”号转换,比如0x1e240转换后是123456,那么-0x1e240转换后为-123456,就是相当于整数 * -1
' ; jne short label_ret ;如果第一个字符不是-号跳过
' ; not edx
' ; not eax
' ; inc eax
' ; adc edx,0 ;有“-”号的话就取反+1
' ; label_ret: ;
' ; pop ebx
' ; pop edi
' ; pop esi ;还原寄存器
' ; leave
' ; ret 4
置入代码 ({ 86, 87, 83, 49, 210, 137, 208, 137, 199, 49, 219, 139, 117, 8, 139, 54, 138, 28, 62, 132, 219, 116, 60, 128, 251, 102, 119, 47, 128, 251, 48, 114, 42, 128, 251, 97, 114, 5, 128, 235, 87, 235, 23, 128, 251, 70, 119, 27, 128, 251, 65, 114, 5, 128, 235, 55, 235, 8, 128, 251, 57, 119, 12, 128, 235, 48, 15, 164, 194, 4, 193, 224, 4, 1, 216, 71, 131, 255, 19, 119, 2, 235, 189, 128, 62, 45, 117, 8, 247, 210, 247, 208, 64, 131, 210, 0, 91, 95, 94, 201, 194, 4, 0 })
' }
返回 (0)
子程序名返回值类型公开备 注
十到十六_EX文本型 
参数名类 型参考可空数组备 注
数值__长整数型10进制数值
字符数整数型1-16 默认2,如转换后实际字符数超出设定则按实际字符数返回 此参数无效,如果实际小于设定则在前面补0
_0x前缀逻辑型默认假(无前缀)
变量名类 型静态数组备 注
缓冲区字节集 
缓冲区 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
' __asm{
' ; push ecx ;保存现场
' ; push ebx
' ; push edi
' ; push esi
' ; mov esi,dword [ebp-4]
' ; lea esi,dword [esi+8] ;得到缓冲区指针,存入esi
' ; cmp dword [ebp+24],0 ;判断是否要加0x前缀 (ebp+24)为参数3,因为参数2是可选会多占用4字节,为假时为0,为真时非0
' ; je short label1 ;这里是不等于时跳转
' ; mov word [esi],0x7830 ;置"0x"头
' ; add esi,2 ;前2个字节已经补"0x"占用了,缓冲区指针+2
' ; label1:
' ; cmp dword [ebp+16],16 ;判断参数2的设置是否超出范围(ebp+16)为参数2
' ; jle short label2
' ; mov dword [ebp+16],16 ;超出16后重置为最大16
' ; label2:
' ; cmp dword [ebp+16],0 ;判断参数2是否<=0
' ; jg short label3 ;大于跳走
' ; mov dword [ebp+16],2 ;如果<=0,重置为2 默认
' ; label3:
' ; mov eax,dword [ebp+8] ;64位整数低32位
' ; mov edx,dword [ebp+12] ;64位整数高32位
' ; mov ebx,eax
' ; mov edi,edx
' ; xor ecx,ecx ;计数寄存器清0
' ; do_count: ;循环计算转换后需要的最少字符个数
' ; test ebx,ebx
' ; je short count_exit
' ; shrd ebx,edi,4
' ; shr edi,4
' ; inc ecx
' ; jmp short do_count
' ; count_exit: ;循环结束,转换后的16进制字符数存于ecx
' ; cmp dword [ebp+16],ecx ;ecx跟参数2比较
' ; jbe short loop_start ;如果小于等于 如果参数2设置的字符数小于实际字符数则跳走,不使用参数2的数值
' ; mov ecx,dword [ebp+16] ;大于的话ecx=参数2 使用参数2的数值
' ; loop_start: ;循环开始标记,(ecx>0)时,每次取出长整数的低4位转换成ASCII码写入缓冲区对应该字节
' ; mov ebx,eax
' ; and ebx,15 ;取出32位整数低4位数据 0-15
' ; cmp ebx, 9 ;与9比效
' ; ja short label_A
' ; add ebx,48 ;<=9时+48 0-9变为字符"0"-“9”的ASCII码
' ; jmp short label_B
' ; label_A
' ; add ebx,55 ;>9时+55 10-15变为字符 A-F 的ASCII码
' ; label_B:
' ; mov byte [esi+ecx-1],bl ;把ASCII码写入缓冲区对应位置的字节中[指针+递减计数-1]
' ; shrd eax,edx,4
' ; shr edx,4
' ; loop loop_start ;循环尾 ecx 递减 ecx>0 时 回到循环开始处
' ; pop esi ;还原寄存器
' ; pop edi
' ; pop ebx
' ; pop ecx
置入代码 ({ 81, 83, 87, 86, 139, 117, 252, 141, 118, 8, 131, 125, 24, 0, 116, 8, 102, 199, 6, 48, 120, 131, 198, 2, 131, 125, 16, 16, 126, 7, 199, 69, 16, 16, 0, 0, 0, 131, 125, 16, 0, 127, 7, 199, 69, 16, 2, 0, 0, 0, 139, 69, 8, 139, 85, 12, 137, 195, 137, 215, 49, 201, 133, 219, 116, 10, 15, 172, 251, 4, 193, 239, 4, 65, 235, 242, 57, 77, 16, 118, 3, 139, 77, 16, 137, 195, 131, 227, 15, 131, 251, 9, 119, 5, 131, 195, 48, 235, 3, 131, 195, 55, 136, 92, 14, 255, 15, 172, 208, 4, 193, 234, 4, 226, 225, 94, 95, 91, 89 })
' }
返回 (到文本 (缓冲区))

评分

参与人数 7好评 +7 精币 +9 收起 理由
guoxue332 + 1 + 2 支持开源~!感谢分享
c295553914 + 1 + 2 很给力!~速度飞快
光影魔术 + 1 + 1 开源精神必须支持~
beatone + 1 支持开源~!感谢分享
李泽勇2 + 1 + 3 开源精神必须支持~
798924038 + 1 新技能已get√
KongChengY + 1 + 1 新技能已get√

查看全部评分


结帖率:100% (2/2)

签到天数: 12 天

发表于 2025-1-23 19:54:29 | 显示全部楼层   广东省中山市
很给力!~速度飞快
回复 支持 反对

使用道具 举报

签到天数: 9 天

发表于 2024-12-4 04:39:37 | 显示全部楼层   北京市北京市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

结帖率:90% (9/10)

签到天数: 7 天

发表于 2024-11-19 22:02:15 | 显示全部楼层   山东省青岛市
必须支持楼主
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)

签到天数: 2 天

发表于 2024-11-19 21:03:41 | 显示全部楼层   江西省新余市
佬如果还在更新的话可以把申请内存的范围从+- 1G跳到+-2G吗,这样刚好在近跳的范围内.
我自己改了源码,之前改某个游戏的时候发现一直申请不到地址,才发现1g距离内没有可用地址www
2g距离内基本都有可申请地址,而且刚好是近跳
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2024-11-14 21:52:56 | 显示全部楼层   山西省运城市
已经顶贴,感谢您对论坛的支持!
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 1 天

发表于 2024-11-11 17:07:11 | 显示全部楼层   广西壮族自治区柳州市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:30% (7/23)

签到天数: 9 天

发表于 2024-11-10 13:07:46 | 显示全部楼层   湖南省邵阳市
支持开源~!感谢分享
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 25 天

发表于 2024-11-9 08:06:16 | 显示全部楼层   四川省广安市
谢谢大佬, 还有注释, 学习一下
回复 支持 反对

使用道具 举报

签到天数: 6 天

发表于 2024-11-8 22:56:24 | 显示全部楼层   河南省开封市
感谢分享
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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