机器码指令保存于变量中。 
要求同时可以传递参数和接收参数。 
请问如何实现?

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    type MyFuncType = function (x, y: Integer): Integer;
    const code: PChar = #$03#$D0#$8B#$C2#$C3#$F7#$EA#$C3;
    // 此code所指的机器码包括两个函数,
    //   第一个函数实现两个整数的加法
    //   第二个函数实现两个整数的乘法
    var
      fp: Pointer;
      f1, f2: MyFuncType;
      res1, res2: Integer;
    begin
      fp := VirtualAlloc(nil, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
      Move(code^, fp^, 8);
      f1 := fp;
      f2 := Pointer(Integer(fp) + 5);
      res1 := f1(10, 20);
      ShowMessage(IntToStr(Res1));
      res2 := f2(10, 20);
      ShowMessage(INtToStr(Res2));
      VirtualFree(fp, 0, MEM_RELEASE);
    end;
      

  2.   

    内联汇编好了啊。
    asm
    end;
      

  3.   

    内联汇编好了啊。
    asm
    end;
      

  4.   

    二楼spirit_sheng(老盛)的代码有效。
    只是只能输入2个参数分别到eax和edx中,如果需要输入多个参数,应该如何实现呢?
      

  5.   

    多个参数用stdcall接口规范,
    var
      Fun : Pointer;
      参数一 P1, P2 , P3 ......
      fResult : integer;
    begin
      Fun := you function address
      asm
        PUSH Pn;
        ...
        PUSH p2;
        PUSH P1;
        Call Fun;
        MOV fResult , EAX;  //返回值 
      end;
      

  6.   

    以前trubo pascal 有个inline关键字,专门用来执行机器指令的,不知道delphi下还能不能用