博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Delphi与汇编学习4(两个转16进制的函数)
阅读量:4149 次
发布时间:2019-05-25

本文共 2312 字,大约阅读时间需要 7 分钟。

Delphi与汇编学习
4 (两个转
16 进制的函数)由于在工作中需要,用汇编写了一个字符串转
16 进制的函数,有详细注释,应该对想学习的人有所帮助的。呵呵
DelphiCode:
{功能:字符串转16进制 作者:不得闲} function StrToHex(Const str: string): string; asm     push ebx     push esi     push edi     test eax,eax     jz   @@Exit     mov  esi,edx       //保存edx值,用来产生新字符串的地址     mov  edi,eax       //保存原字符串     mov  edx,[eax-4]  //获得字符串长度     mov  ecx,edx       //保存长度     Push ecx     add  edx,edx     mov  eax,esi     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; 在群中,有人说要指针转16进制的函数,其实字符串本身就是按照指针的形式保存的,所以稍微修改一下就是指针区信息转16进制的函数了如下: {功能:指针区信息转16进制 参数: Ptr指定指针,Len指定取得的数据长度 作者:不得闲} function PointToHex(Const Ptr: pointer;Const Len: integer): string; asm     Push ebx     push esi     push edi     test eax,eax     jz   @@Exit     mov  edi,eax     mov  esi,ecx     mov  ecx,edx     push ecx     add  edx,edx     mov  eax,esi     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; 使用比如: var   Stream:TMemoryStream;   s: String;   i: integer; begin   Stream := TMemoryStream.Create;   s := '不得闲';   i := 511;   Stream.WriteBuffer(pointer(s)^,Length(s));   ShowMessage(PointToHex(Stream.Memory,Stream.size));   Stream.free;
这样就把整个Stream都转换成
16 进制了.

转载地址:http://kesti.baihongyu.com/

你可能感兴趣的文章
EasySwift/YXJOnePixelLine 极其方便的画出真正的一个像素的线
查看>>
Ubuntu系统上安装Nginx服务器的简单方法
查看>>
Ubuntu Linux系统下apt-get命令详解
查看>>
ubuntu 16.04 下重置 MySQL 5.7 的密码(忘记密码)
查看>>
Ubuntu Navicat for MySQL安装以及破解方案
查看>>
HTTPS那些事 用java实现HTTPS工作原理
查看>>
oracle函数trunc的使用
查看>>
MySQL 存储过程或者函数中传参数实现where id in(1,2,3,...)IN条件拼接
查看>>
java反编译
查看>>
Class.forName( )你搞懂了吗?——转
查看>>
jarFile
查看>>
EJB3.0定时发送jms(发布/定阅)方式
查看>>
EJB与JAVA BEAN_J2EE的异步消息机制
查看>>
数学等于号是=那三个横杠是什么符
查看>>
HTTP协议详解
查看>>
java多线程中的join方法详解
查看>>
ECLIPSE远程调试出现如下问题 ECLIPSE中调试代码提示找不到源
查看>>
java abstract修饰符
查看>>
数组分为两部分,使得其和相差最小
查看>>
java抽象类和接口
查看>>