Delphi的字符串与16进制的相互转换函数的汇编代码

简介:

年终奖没发,心情有点低落,不想做公司的东西,于是将以前一个朋友问的关于字符串与16进制串的相互转换的汇编代码实现了一下,没啥技术含量,按照Delphi的汇编规则走就行了,里面也没有涉及到任何算法!速度快或 不快都不重要,仅仅是无事发泄一下的玩意(只测试2007,2010的我没测试,如果有2010的自行测试一下),代码如下:

复制代码
代码

   
   
function StrToHex(Const str: Ansistring): Ansistring;
asm
push ebx
push esi
push edi
test eax,eax
jz @@Exit
mov esi,edx
// 保存edx值,用来产生新字符串的地址
mov edi,eax
// 保存原字符串
mov edx,[eax
- 4 ] // 获得字符串长度
test edx,edx
// 检查长度
je @@Exit
{ Length(S) = 0 }
mov ecx,edx
// 保存长度
Push ecx
shl edx, 1
mov eax,esi
{ $IFDEF VER210 }
movzx ecx, word ptr [edi
- 12 ] { 需要设置CodePage }
{ $ENDIF }
call System.@LStrSetLength
// 设置新串长度
mov eax,esi
// 新字符串地址
Call UniqueString
// 产生一个唯一的新字符串,串位置在eax中
Pop ecx
@@SetHex:
xor edx,edx // 清空edx
mov dl, [edi]
// Str字符串字符
mov ebx,edx
// 保存当前的字符
shr edx, 4 // 右移4字节,得到高8位
mov dl,byte ptr[edx
+ @@HexChar] // 转换成字符
mov [eax],dl
// 将字符串输入到新建串中存放
and ebx,$0F // 获得低8位
mov dl,byte ptr[ebx
+ @@HexChar] // 转换成字符
inc eax
// 移动一个字节,存放低位
mov [eax],dl
inc edi
inc eax
loop @@SetHex
@@Exit:
pop edi
pop esi
pop ebx
ret
@@HexChar: db
' 0123456789ABCDEF '
end ;

function HexToStr( const Str: AnsiString): AnsiString;
asm
push ebx
push edi
push esi
test eax,eax
// 为空串
jz @@Exit
mov edi,eax
mov esi,edx
mov edx,[eax
- 4 ]
test edx,edx
je @@Exit
mov ecx,edx
push ecx
shr edx, 1
mov eax,esi
// 开始构造字符串
{ $IFDEF VER210 }
movzx ecx, word ptr [edi
- 12 ] { 需要设置CodePage }
{ $ENDIF }
call System.@LStrSetLength
// 设置新串长度
mov eax,esi
// 新字符串地址
Call UniqueString
// 产生一个唯一的新字符串,串位置在eax中
Pop ecx
xor ebx,ebx
xor esi,esi
@@CharFromHex:
xor edx,edx
mov dl, [edi]
// Str字符串字符
cmp dl,
' 0 ' // 查看是否在0到f之间的字符
JB @@Exit
// 小于0,退出
cmp dl,
' 9 ' // 小于 = 9
ja @@DoChar
// CompOkNum
sub dl,
' 0 '
jmp @@DoConvert
@@DoChar:
// 先转成大写字符
and dl,$DF
cmp dl,
' F '
ja @@Exit
// 大于F退出
add dl,
10
sub dl,
' A '
@@DoConvert:
// 转化
inc ebx
cmp ebx,
2
je @@Num1
xor esi,esi
shl edx, 4
mov esi,edx
jmp @@Num2
@@Num1:
add esi,edx
mov edx,esi
mov [eax],dl
xor ebx,ebx
inc eax
@@Num2:
dec ecx
inc edi
test ecx,ecx
jnz @@CharFromHex
@@Exit:
pop esi
pop edi
pop ebx
end ;

procedure TForm1.Button1Click(Sender: TObject);
var
str: Ansistring;
begin
str :
= ' 不得闲按时打发 ' ;
str :
= StrToHex(str);
ShowMessage(str);
ShowMessage(HexToStr(str));
end ;
复制代码
相关文章
|
网络协议 C++
解决MASM32代码汇编出错: error A2181: initializer must be a string or single item
解决MASM32代码汇编出错: error A2181: initializer must be a string or single item
|
存储 算法 程序员
神秘代码世界惊现高效秘籍!究竟是什么让汇编语言编程如此强大?快来一探究竟!
【8月更文挑战第31天】《代码之美:探索高效汇编语言编程的最佳实践》介绍了汇编语言在系统内核、嵌入式系统及高性能应用中的不可替代作用。书中强调了深入理解处理器架构、提升代码可读性、优化算法与数据结构及有效利用寄存器等最佳实践的重要性。通过具体示例,如在 x86 架构下实现高效的加法函数,展示了如何运用这些技巧编写出既高效又可靠的汇编代码,充分展现了汇编语言的独特魅力及其在现代软件开发中的价值。
212 0
【原创】DOS下TSR程序的汇编演示代码2--黑屏保护程序
【原创】DOS下TSR程序的汇编演示代码2--黑屏保护程序
|
NoSQL 前端开发 程序员
【震撼揭秘!】程序员绝不会告诉你的秘密:掌握汇编语言调试,轻松从软件故障中全身而退——透视代码底层,成为Bug猎人!
【8月更文挑战第31天】《调试的艺术:如何利用汇编语言追踪和解决软件问题》探讨了使用汇编语言进行高效调试的方法。无论是初学者还是资深开发者,面对棘手的 bug 时,高级语言的信息往往不足。文章通过具体示例展示如何通过汇编代码定位问题,如 C 语言中数组求和函数的崩溃问题。借助 `gcc -S` 生成的汇编代码和 GDB 调试器,可以深入理解程序行为,从而更准确地解决问题。掌握这一技能,将使你在复杂问题面前更加从容。
229 2
|
C语言
51单片机汇编语言流水灯代码
51单片机汇编语言流水灯代码
356 1
【原创】DOS下TSR程序的汇编演示代码1--自动按键程序
【原创】DOS下TSR程序的汇编演示代码1--自动按键程序
|
C# 开发者 图形学
Xamarin 竟在游戏开发领域大胆探索,跨平台优势与强大功能结合,开启游戏开发新潮流!
【8月更文挑战第31天】《Xamarin在游戏开发领域的探索》介绍了Xamarin作为跨平台开发框架,在移动游戏开发中的应用。它利用C#语言的优势,提供高效的开发体验,并结合各平台图形库实现高质量画面。本文还展示了Xamarin如何简化游戏逻辑处理、支持多线程编程及与Unity等工具集成,提升游戏质量和开发效率。此外,Xamarin还支持热更新和多平台发布,进一步优化游戏维护流程。
179 0
|
Java C++
如何在JAVA代码中嵌入汇编
如何在JAVA代码中嵌入汇编
270 1
|
Python
python 代码脚本汇编
python 代码脚本汇编
110 0
|
Windows
86/88汇编代码的运行调试
86/88汇编代码的运行调试
117 0