看delphi自带的源码是如此:
function IntToHex(Value: Integer; Digits: Integer): string;
// FmtStr(Result, '%.*x', [Digits, Value]);
asm
CMP EDX, 32 //为什么是edx呢?因为delphi函数的顺序是eax,edx,ecx,超过3个就push,所以 edx=digits.
JBE @A1 //digits小于等于32,跳到@A1
XOR EDX, EDX //大于32就 digits := 0;
@A1: PUSH ESI //保存esi
MOV ESI, ESP //esp是栈顶指针。
SUB ESP, 32 //分配8个局部变量(32 div 4 = 8)
PUSH ECX //返回值得指针
MOV ECX, 16 // CvtInt的参数,0表示signed decimal, 10 or 16 表示unsigned
CALL CvtInt //delphi自己定义的一个函数,在SysUtils单元
MOV EDX, ESI //esi是一个指向转换后文本的开始地址的指针
POP EAX // result ptr
CALL System.@LStrFromPCharLen pchar to Str的转换
ADD ESP, 32 //清除局部变量
POP ESI
end;
而分析一个可执行程序却发现,原来可以这样:
c_HexStr='0123456789ABCDEF';
function TForm2.ByteToChr(b: byte): char;
begin
result := c_hexstr[b+1];
end;
其实生成随机密码也可以用这个原理。
博客主要分析了Delphi自带的IntToHex函数源码,解释了函数中寄存器使用及跳转逻辑,还介绍了另一种将字节转换为字符的方法,最后提到生成随机密码也可运用此原理,涉及Delphi编程相关信息技术内容。
614

被折叠的 条评论
为什么被折叠?



