请问下面嵌入汇编的函数返回值,是EAX吗?function Start:DWORD;stdcall;
asm
     CALL @@1
  @@1:
     POP EAX
     SUB EAX, 5
end;//转为C嵌入汇编如下,对不对?
DWORD __stdcall Start()
{
  DWORD rs;
   asm{   
      CALL @@1
      @@1:
      POP EAX
      SUB EAX, 5
      MOV rs, EAX 
     }  return rs;
 
}

解决方案 »

  1.   

    1.返回call指令地址到eax
    2.功能来说是一样的,不过好象vc没有这种标号写法...记不清了,如果能编译,算我没说.
      

  2.   

    加注释的部分可以不要,有个无返回值警告可以不理DWORD   __stdcall   Start()
    {
    //    DWORD   rs;
          asm{      
                CALL   @@1
                @@1:
                POP   EAX
                SUB   EAX,   5
    //            MOV   rs,   EAX  
              }//    return   rs;
     
      

  3.   


    这样的问题试一下就知道了,,,procedure TForm1.Button1Click(Sender: TObject);
    var
      i,j:dword;
    begin
        i:=0;
        i:=Start;
        j:=i+7;
        showmessage(inttostr(j));
    end;在i:=start前面加一个断点,的CPUview中看到的是lea ebx,[eax+$07]说明Start返回值在EAX中   
                                                 Syant J. Wang  
      

  4.   

    哈哈~是获取EIP的~最常见的Shell,Patch和Virus技术手段
      

  5.   


    多谢各位, 本人Pascal比较菜,见到有函数好像不返回,就有些疑惑,呵呵!
      

  6.   

    其实那个局部变量可以不要吧,因为反正最后也是mov eax,[rs]&retn。但没有实际编译过,不清楚能不能编译通过。
    另外,C++就不支持@@标志。好像也不支持标记在使用之后声明的写法。
      

  7.   


    to pig4210:    在Cbuilder下是可以的。    http://topic.csdn.net/u/20071123/12/ddefb0fa-ffc7-40da-a73c-7b4443b6debc.html