看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;
其实生成随机密码也可以用这个原理。