精易论坛

标题: 汇编 十到十六和十六到十 [打印本页]

作者: dnxl    时间: 2024-11-3 19:31
标题: 汇编 十到十六和十六到十
起因是我用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 })
' }
返回 (到文本 (缓冲区))


作者: 查过    时间: 2024-11-4 06:12
下个学习一下
作者: 豆豆灰常开心    时间: 2024-11-4 06:16
全都是大佬~
作者: qwe111qwe    时间: 2024-11-4 07:54
感谢分享!!!!
作者: year1970    时间: 2024-11-4 08:01
感谢分享
作者: sostemp    时间: 2024-11-4 14:28
全都是大佬~
作者: wgqxj    时间: 2024-11-4 14:32
谢谢分享
作者: ctry78985    时间: 2024-11-4 21:03
感谢分享
作者: 784326742    时间: 2024-11-5 04:27
楼主给我金币
作者: 查过    时间: 2024-11-5 06:09
感谢发布原创作品,精易因你更精彩!6666666666666
作者: 豆豆灰常开心    时间: 2024-11-5 06:13
已经顶贴,感谢您对论坛的支持!
作者: bianyuan456    时间: 2024-11-5 06:45
已经顶贴,感谢您对论坛的支持!
作者: please    时间: 2024-11-5 09:37
感谢分享,支持开源!!!
作者: alanwoo    时间: 2024-11-5 16:26
支持开源~!感谢分享
作者: czvv    时间: 2024-11-7 10:54
全都是大佬~
作者: beatone    时间: 2024-11-7 11:53
支持开源~!感谢分享
作者: zhangbiao    时间: 2024-11-8 22:56
感谢分享
作者: 佛学e语言    时间: 2024-11-9 08:06
谢谢大佬, 还有注释, 学习一下
作者: a3960382663    时间: 2024-11-10 13:07
支持开源~!感谢分享
作者: 光影魔术    时间: 2024-11-11 17:07
感谢分享
作者: ddrs    时间: 2024-11-14 21:52
已经顶贴,感谢您对论坛的支持!
作者: NekoCat    时间: 2024-11-19 21:03
佬如果还在更新的话可以把申请内存的范围从+- 1G跳到+-2G吗,这样刚好在近跳的范围内.
我自己改了源码,之前改某个游戏的时候发现一直申请不到地址,才发现1g距离内没有可用地址www
2g距离内基本都有可申请地址,而且刚好是近跳
作者: li609545570    时间: 2024-11-19 22:02
必须支持楼主
作者: 熊不熊    时间: 2024-12-4 04:39
感谢分享,很给力!~
作者: 七散    时间: 2025-1-23 19:54
很给力!~速度飞快
作者: nunu0530    时间: 7 天前
支持开源~!感谢分享




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4