DUnit2的CallerAddr函数有什么作用,如何将其转换为64位?

时间:2012-08-18 22:55:45

标签: delphi assembly 32bit-64bit

我试图让DUnit2在64位下运行,但我对这种方法的作用感到困惑,更不用说如何将它转换为64位。纯粹的Pascal会更好,但由于它指的是堆栈(ebp),它可能是不可能的。

function CallerAddr: Pointer; assembler;
const
  CallerIP = $4;
asm
   mov   eax, ebp
   call  IsBadPointer
   test  eax,eax
   jne   @@Error

   mov   eax, [ebp].CallerIP
   sub   eax, 5   // 5 bytes for call

   push  eax
   call  IsBadPointer
   test  eax,eax
   pop   eax
   je    @@Finish

@@Error:
   xor eax, eax
@@Finish:
end;

2 个答案:

答案 0 :(得分:8)

function RtlCaptureStackBackTrace(FramesToSkip: ULONG; FramesToCapture: ULONG; 
  out BackTrace: Pointer; BackTraceHash: PULONG): USHORT; stdcall; 
  external 'kernel32.dll' name 'RtlCaptureStackBackTrace' delayed;

function CallerAddr: Pointer;
begin
  // Skip 2 Frames, one for the return of CallerAddr and one for the
  // return of RtlCaptureStackBackTrace
  if RtlCaptureStackBackTrace(2, 1, Result, nil) > 0 then
  begin
    if not IsBadPointer(Result) then
      Result := Pointer(NativeInt(Result) - 5)
    else
      Result := nil;
  end
  else
  begin
    Result := nil;
  end;
end;

答案 1 :(得分:-1)

function CallerAddr: Pointer; assembler;
    const
      CallerIP = $4;
    asm
       mov   rax, rcx ;For int.. XMM0 for float
       call  IsBadPointer
       test  rax,rax
       jne   @@Error

       mov   rax, [rcx].CallerIP
       sub   rax, 5   // 5 bytes for call

       push  rax
       call  IsBadPointer
       test  rax,rax
       pop   rax
       je    @@Finish

    @@Error:
       xor rax, rax
    @@Finish:
    end;