一段程序用addr 与 @ 来取地址,但结果不同,如下function Msg(a:integer;b:integer):integer;stdcall;
var
    sa,sb:array [0..10] of char;
    s:string;
begin
    s:=intTostr(a);
    StrPCopy (sa,s);    s:=intTostr(b);
    StrPCopy (sb,s);
    MessageBox(0,Pchar(@sa),Pchar(@sb),MB_OK);
end;procedure TForm1.Button1Click(Sender: TObject);
var
    p:pointer;
    a,b:integer;
begin
    p:=@Msg;
    a:=22;
    b:=11;
    asm
        push b
        push a        call addr(msg)     //有错,出现非法操作
        //call p       //可以
    end;
end;//请高手帮忙诊断

解决方案 »

  1.   

    我试了一下,你的问题在于Call addr(Msg)这句procedure TForm1.Button1Click(Sender: TObject);
    var
        p:pointer;
        a,b:integer;
    begin
       // p:=@Msg;
        p:=addr(Msg);
        a:=22;
        b:=11;
        asm
            push b
            push a       // call addr(msg)     //有错,出现非法操作
            call p       //可以
        end;
    end;
    这样也没有问题
    看来是Call 的用法有问题
      

  2.   

    在borland 新闻组找到了答案,是call 用错了,应该是call msg谢谢Cipherliu(孤鹰)