年終獎沒發,心情有點低落,不想做公司的東西,于是将以前一個朋友問的關于字元串與16進制串的互相轉換的彙編代碼實作了一下,沒啥技術含量,按照Delphi的彙編規則走就行了,裡面也沒有涉及到任何算法!速度快或 不快都不重要,僅僅是無事發洩一下的玩意(隻測試2007,2010的我沒測試,如果有2010的自行測試一下),代碼如下:
<a></a>
代碼
function StrToHex(Const str: Ansistring): Ansistring;
asm
push ebx
push esi
push edi
test eax,eax
jz @@Exit
mov esi,edx //儲存edx值,用來産生新字元串的位址
mov edi,eax //儲存原字元串
mov edx,[eax-4] //獲得字元串長度
test edx,edx //檢查長度
je @@Exit {Length(S) = 0}
mov ecx,edx //儲存長度
Push ecx
shl edx,1
mov eax,esi
{$IFDEF VER210}
movzx ecx, word ptr [edi-12] {需要設定CodePage}
{$ENDIF}
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;
function HexToStr(const Str: AnsiString): AnsiString;
test eax,eax //為空串
mov edi,eax
mov esi,edx
mov edx,[eax-4]
test edx,edx
je @@Exit
mov ecx,edx
push ecx
shr edx,1
mov eax,esi //開始構造字元串
xor ebx,ebx
xor esi,esi
@@CharFromHex:
xor edx,edx
cmp dl, '0' //檢視是否在0到f之間的字元
JB @@Exit //小于0,退出
cmp dl,'9' //小于=9
ja @@DoChar//CompOkNum
sub dl,'0'
jmp @@DoConvert
@@DoChar:
//先轉成大寫字元
and dl,$DF
cmp dl,'F'
ja @@Exit //大于F退出
add dl,10
sub dl,'A'
@@DoConvert: //轉化
inc ebx
cmp ebx,2
je @@Num1
shl edx,4
jmp @@Num2
@@Num1:
add esi,edx
mov edx,esi
@@Num2:
dec ecx
test ecx,ecx
jnz @@CharFromHex
procedure TForm1.Button1Click(Sender: TObject);
var
str: Ansistring;
begin
str := '不得閑按時打發';
str := StrToHex(str);
ShowMessage(str);
ShowMessage(HexToStr(str));