您现在的位置:首页 >> 基础算法 >> window基础 >> 内容

Delphi与汇编学习4(两个转16进制的函数)

时间:2011/9/3 15:37:45 点击:

  核心提示:function StrToHex(Const str: string): string;asm push ebx push esi push edi test eax,eax jz @@Exit m...
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;

作者:不得闲 来源:原创
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 盒子文章(www.2ccc.com) © 2024 版权所有 All Rights Reserved.
  • 沪ICP备05001939号