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 进制了.
初学 Delphi 嵌入汇编[1] - 汇编语言与机器语言 初学 Delphi 嵌入汇编[2] - 汇编语言关键字 初学 Delphi 嵌入汇编[3] - 第一个 Delphi汇编的例子 初学 Delphi 嵌入汇编[4] - 寄存器在过程与函数中的使用 初学 Delphi 嵌入汇编[5] - 寄存器在过程与函数中的使用 - 续 初学 Delphi 嵌入汇编[6] - & 操作符 初学 Delphi 嵌入汇编[7] - 使用常量 初学 Delphi 嵌入汇编[8] - 8 位寄存器、16 位寄存器与 32 位寄存器 初学 Delphi 嵌入汇编[9] - asm 可以代替 begin 初学 Delphi 嵌入汇编[10] - 函数返回值与寄存器 初学 Delphi 嵌入汇编[11] - 用汇编重写一个 Delphi 函数 初学 Delphi 嵌入汇编[12] - 在汇编代码中可以直接使用 Result 初学 Delphi 嵌入汇编[13] - 地址参数用 [] 取值 初学 Delphi 嵌入汇编[14] - 常量与变量在汇编中的一个区别 初学 Delphi 嵌入汇编[15] - 需要保护的寄存器 初学 Delphi 嵌入汇编[16] - 进制的表示方法 初学 Delphi 嵌入汇编[17] - 逻辑运算 初学 Delphi 嵌入汇编[18] - SHL 与 SHR 初学 Delphi 嵌入汇编[19] - Delphi 的无符号整数类型 初学 Delphi 嵌入汇编[20] - DelphiInteger 类型 初学 Delphi 嵌入汇编[21] - Delphi 的其他整数类型 初学 Delphi 嵌入汇编[22] - 在汇编代码中使用记录 初学 Delphi 嵌入汇编[23] - LOOP 循环 初学 Delphi 嵌入汇编[24] - 汇编语言的简单数据类型 初学 Delphi 嵌入汇编[25] - 在汇编中调用函数 初学 Delphi 嵌入汇编[26] - 大小写字母换 初学 Delphi 嵌入汇编[27] - XCHG 指令: 交换寄存器的内容 初学 Delphi 嵌入汇编[28] - 把 EAX 的值置为 0 的三种方法与效率 初学 Delphi 嵌入汇编[29] - 寄存器所能接受的数值范围 初学 Delphi 嵌入汇编[30] - 寄存器表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值