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

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 进制了.

你可能感兴趣的:(汇编,Stream,String,Integer,byte,Delphi)