StrToInt / IntToStr Asm For Delphi

 

ContractedBlock.gif ExpandedBlockStart.gif Code
function IntToStr(Value: Integer): ShortString;
// Value  = eax
// Result = edx
asm
  push ebx
  push esi
  push edi

  mov edi,edx
  
xor ecx,ecx
  mov ebx,
10
  
xor edx,edx

  cmp eax,
0 // check for negative
  setl dl
  mov esi,edx
  jnl @reads
  neg eax

  @reads:
    mov  edx,
0   // edx = eax mod 10
    
div  ebx     // eax = eax div 10
    add  edx,
48  // '0' = #48
    push edx
    inc  ecx
    cmp  eax,
0
  jne @reads

  dec esi
  jnz @positive
  push 
45 // '-' = #45
  inc ecx

  @positive:
  mov [edi],cl 
// set length byte
  inc edi

  @writes:
    pop eax
    mov [edi],al
    inc edi
    dec ecx
  jnz @writes

  pop edi
  pop esi
  pop ebx
end

 

ContractedBlock.gif ExpandedBlockStart.gif Code


function StrToInt(Value: ShortString): Integer;
// Value   = eax
// Result  = eax
asm
  push ebx
  push esi

  mov esi,eax
  
xor eax,eax
  movzx ecx,Byte([esi]) 
// read length byte
  cmp ecx,
0
  je @exit

  movzx ebx,Byte([esi
+1])
  
xor edx,edx // edx = 0
  cmp ebx,
45  // check for negative '-' = #45
  jne @loop

  dec edx 
// edx = -1
  inc esi 
// skip '-'
  dec ecx

  @loop:
    inc   esi
    movzx ebx,Byte([esi])
    imul  eax,
10
    sub   ebx,
48 // '0' = #48
    add   eax,ebx
    dec   ecx
  jnz @loop

  mov ecx,eax
  
and ecx,edx
  
shl ecx,1
  sub eax,ecx

  @exit:
  pop esi
  pop ebx
end;

转载于:https://www.cnblogs.com/bsoom/archive/2009/11/26/1611589.html

你可能感兴趣的:(StrToInt / IntToStr Asm For Delphi)