var
  I,Max:Integer;
  ExBp:Integer;
asm
   mov eax,[Params];
   call System.@DynArrayHigh;
   test eax,eax;
   jl  @L2;
   inc eax;
   mov [Max],eax;
   mov [I],$00000000;
@L1:
   mov eax,[Params];
   mov edx,[I];
   mov eax,[eax+edx*4];
   push [eax];
   inc dword ptr [I];
   dec dword ptr[Max];
   jnz @L1;
@L2:
   push CallSelf;
   push [RetParam];
   call [CallAddr];
@L3:
end;

解决方案 »

  1.   

    附上变量:  CallSelf:Pointer;
      CallAddr:Pointer;
      Params:array of Pointer;
      RetParam:Integer;
      

  2.   

    楼主我找到全部代码了
    不过貌似Params长度超过1,运行后就权限错,结果可以输出上面那段汇编好像就取出数组最后的一个元素,也就是字符串指针
      

  3.   


    procedure xxxxx ;
    var
      I, Max, ExBp, tmp: Integer ;
      tmpary: array of Pointer ;
    begin
      tmpary := nil ;
      if Length(Params) > 0 then
      begin
        SetLength(tmpary, Length(Params)) ;
        for i := 0 to High(params) do
          Move(params[i], tmpary[i], 4);
      end;
      asm
        pushad
          push tmpAry
          push CallSelf
          push RetParam
          call calladdr
        popad
      end;
    end;
      

  4.   


    tmpary这部份出错,算了,结帖
      

  5.   

    看了两三天汇编,最后搞明白了,只是把数组的值放到寄存器然后PUSH,SayHello读取默认EAX,即PUSH的值,然后SHOWMESSAGE.