原来IntToHex是这么实现的。。。

看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,integer,function,string,byte,div)