我可能用如下方法获得EAX的值 
var
  N:Integer;
begin
  asm
    Mov N,EAX
  end;  ShowMessage('EAX='+IntToStr(N));
end;
但这个方法不适用EIP,因为EIP没定义,记得8086汇编中$就相当于当前指令的址,可以通过Mov AX,$
当前指令的地址,不知在Delphi下有没有类似的方法得到当前的指令地址??

解决方案 »

  1.   

    Function GetEIP : DWORD;
    asm
      POP  EAX;
      PUSH EAX
    end;在其他地方调用一下就行了。
      

  2.   

    更正
    应该是
    Function GetEIP : DWORD;stdcall;
    忘记加规范了,Sorry
      

  3.   

    再想了想,觉得刚才那样还是不安逸,
    以下方法可以得到@Label处的地址
    var
      n : integer;
    begin
      asm
        @Label:
        LEA EAX , @Label;//这样子写,也就是得到运行到此处时的EIP
        MOV n , EAX;
      end;
      ShowMessage(Inttohex(n,8));
    end;
      

  4.   

    哈哈
    给一个我最拿手的方法,病毒或PE壳最最经典的方法:
    ASM
            CALL    @Delta
    @Delta:
            POP     EAX        // get current EIP
            SUB     EAX, OFFSET @Delta    // calculate and adjust offset (current EIP)
    END;http://lysoft.7u7.net