首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

在 Visual C++ 中运用内联汇编(三)

2012-08-03 
在 Visual C++ 中使用内联汇编(三)在 Visual C++ 中使用内联汇编(三) 2011年04月21日  七、调用函数  内联

在 Visual C++ 中使用内联汇编(三)

在 Visual C++ 中使用内联汇编(三)
2011年04月21日
  七、调用函数   
  内联汇编调用C/C++函数必须自己清除堆栈,下面是一个调用C/C++函数例子:     
  #include        
  char   szformat[]   =   "%s   %s\n";     
  char   szHello[]   =   "Hello";     
  char   szWorld[]   =   "   world";     
  void   main()     
  {     
  __asm     
  {     
  MOV           EAX,   OFFSET   szWorld     
  PUSH         EAX     
  MOV           EAX,   OFFSET   szHello     
  PUSH         EAX     
  MOV           EAX,   OFFSET   szformat     
  PUSH         EAX     
  CALL         printf     
  //内联汇编调用C函数必须自己清除堆栈     
  //用不使用的EBX寄存器清除堆栈,或ADD   ESP,   12     
  POP           EBX     
  POP           EBX     
  POP           EBX     
  }     
  }     
  注意:函数参数是从右向左压栈。     
  不能够访问C++中的类成员函数,但是可以访问extern   "C"函数。     
  如果调用Windows   API函数,则不需要自己清除堆栈,因为API的返回指令是RET   n,会自动清除堆栈     
  比如下面的例子:     
  #include        
  char   szAppName[]   =   "API   Test";     
  void   main()     
  {     
  char   szHello[]   =   "Hello,   world!";     
  __asm     
  {     
  PUSH         MB_OK   OR   MB_ICONINformATION     
  PUSH         OFFSET   szAppName         ;   全局变量用OFFSET   
  LEA           EAX,   szHello                 ;   局部变量用LEA   
  PUSH         EAX     
  PUSH         0     
  CALL         DWORD   PTR   [MessageBoxA]           ;   注意这里,我费了好大周折才发现不是CALL   MessageBoxA   
  }     
  }     
  一般来说,在Visual   C++中使用内联汇编是为了提高速度,因此这些函数调用尽可能用C/C++写。  

热点排行