const
 PCount = 10;
var
  aaa: array [0..PCount-1] of Pointer;
for i=0 to PCount-1
  aaa[I] := VMP.VMAlloc(4096*3);单个的刚搞明白
asm
  mov cl,$01
  mov edx,$00003000
  mov eax,[VMP]
  call TVirtualMemPool.VMAlloc
  mov edx,[aaa]
  mov ecx,[I]
  mov [edx+ech*4],eax
end      asm
        pushad
        mov eax, PCount
        push eax
        xor edx, edx
        pop ecx
        @p1:
          //mov cl,$01
          //mov edx,$00003000
          //mov eax,[VMP]
          //call TVirtualMemPool.VMAlloc
          //mov edx,[aaa]
          //mov ecx,[I]
          //mov [[aaa]+[I]*4],eax
          inc edx
          loop @p1
        popad
      end;
另外如果VMAlloc有2个或三个参数我又应该怎么操作寄存器?我现在理解不了,觉得寄存器不够用,大牛们莫笑啊

解决方案 »

  1.   

    Delphi默认格式是Registry(区别于stdcall等)
    参数传递规则是:参数小于3个时,从左到右分别用EAX,EDX,ECX传递
    3个之后,分别压入栈中,顺序从左到右
    返回值EAX,如果存在返回值的话
    程序不需要保护EAX,EDX,ECX,其他继承器需要保护
      

  2.   

    楼上大牛我怎么把返回的eax赋值给数组元素呢单个的是mov edx,[aaa]
    mov ecx,[I]
    mov [edx+ecx*4],eax  @p1:
       //mov edx,[aaa]
       //mov ecx,[I]
       //mov [[aaa]+[I]*4],eax
       inc edx   //如果这里已经返回eax,下面怎么把返回的eax赋值给数组元素呢?   loop @p1
     
     
      

  3.   

    const
     PCount = 10;
    var
      aaa: array [0..PCount-1] of Pointer;
    for i=0 to PCount-1
      aaa[I] := VMP.VMAlloc(4096*3);针对这段程序的asm优化
    asm
      PUSH EDI;
      LEA  EDI , aaa;
      MOV  ECX , PCount
      @lp1:
         PUSH ECX;
         MOV  EAX , [VMP]
         MOV  EDX , 4096*3
         CALL TVirtualMemPool.VMAlloc
         POP  ECX;
         MOV  [EDI + ECX  - 4] , EAX;
      Loop @lp1;
    end;
      

  4.   

    Loop @lp1
    后面加上
    POP EDI
    还没睡醒,对不起
      

  5.   

    MOV [EDI + ECX - 4] , EAX;
    改成
    MOV [EDI + ECX*4 - 4] , EAX;
      

  6.   

    BASM有环境要求,代码嵌入在Delphi代码中间,或者对象,类方法中,有区别,贴下你的代码
      

  7.   

    program VMPool;{$APPTYPE CONSOLE}uses
      SysUtils,
      Windows,
      uVirtualMemPool in 'uVirtualMemPool.pas';const
      AllCount = 100;
      PCount = 10;var
      VMP: TVirtualMemPool;
      aaa: array of Pointer;
    begin
      try
        { TODO -oUser -cConsole Main : Insert code here }
        VMP := TVirtualMemPool.Create(AllCount);
        try
          SetLength(aaa, PCount);
          asm
            push edi;
            lea edi ,aaa
            mov ecx ,PCount
            xor edx, edx
            @lp1:
              {
               push ecx;
               mov eax , [VMP]
               mov edx , 4096*3
               CALL TVirtualMemPool.VMAlloc
               pop ECX;
               }
               inc edx
               mov [edi+edx*4-4],edx
               loop @lp1;
               pop edi
          end;
          Readln;
        finally
          FreeAndNil(VMP);
        end;
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
    end.
      

  8.   

    貌似把lea edi, aaa改成
    mov edi,[aaa]就可以了,现在又有一个问题了你这个数组元素赋值怎么是倒序的啊?怎么改成正序的?
      

  9.   

    aaa: array of Pointer;

    aaa: array [0..PCount-1] of Pointer;
    是两个不同的情况前者使用维数时
    LEA  EDI , aaa;
    需要改成
    MOV  EDI , aaa; ///需要加上这句
      

  10.   

          asm
            push edi;
            mov edi,[aaa]
            mov ecx,PCount
            @lp1:
               push ecx;
               mov eax,[VMP]
               mov edx,4096*3
               call TVirtualMemPool.VMAlloc
               pop ecx;
               mov [edi+ecx*4-4],eax
               loop @lp1;
               pop edi
          end;可以了,怎么改成正序?
      

  11.   

    MOV  [EDI + ECX*4 - 4] , EAX;
    改成
    MOV  [EDI] , EAX;
    ADD  EDI , 4
      

  12.   

    建议楼主,搜索一下BASM相关资料,挺多,不过这玩意也麻烦,版本的兼容性不好,大量使用不是好事
      

  13.   

    谢谢大牛,先学点basm,再搞masm也会很容易转吧
    能不能推荐几本学asm的书?
      

  14.   

    http://blog.csdn.net/futurezwl/article/details/4093047