vs2005内嵌汇编的使用:标准的c/c++函数的调用和非标准的c/c++函数的调用以及变量的引用

本文详细介绍了如何使用C++内联汇编来调用标准C/C++函数printf及API函数MessageBox。通过两个示例对比了不同情况下参数传递的方法,并解释了为何调用方式存在差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include   <stdio.h>   

char *szCaption = "Hello,World";

void   main()   
...
{   
    
char *szformat   =   "%s   %s ";
    
char szMsg[]  = "I Love You";
    
try
    ...
{
        _asm...
{
            lea  eax, szMsg  
            push eax  
            mov  eax,  szCaption      ;全部变量为指针的引用
            push eax  
            mov  eax, szformat  
            push eax  
            mov  eax, printf 
            call eax

            
//内联汇编调用c函数必须自己清除堆栈   
            
//用不使用的ebx寄存器清除堆栈,或add   esp,   12   
            pop           ebx   
            pop           ebx   
            pop           ebx   
        }

    }
catch(CException* e)...{
           ;
    }

}
   
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
char szCaption[] = "Hello,World";

void   main()   
...
{   
    
char *szformat   =   "%s   %s ";
    
char szMsg[]  = "I Love You";
    
try
    ...
{
        _asm...
{
            lea  eax, szMsg  
            push eax  
            mov  eax,  offset szCaption    ;全部变量非指针的引用
            push eax  
            mov  eax, szformat  
            push eax  
            mov  eax, printf 
            call eax

            
//内联汇编调用c函数必须自己清除堆栈   
            
//用不使用的ebx寄存器清除堆栈,或add   esp,   12   
            pop           ebx   
            pop           ebx   
            pop           ebx   
        }

    }
catch(CException* e)...{
           ;
    }

}
    

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include   <stdio.h>   

#include   
<windows.h>   
 
 
void   main()   
{   
           
char szMsg[]  = "I Love You";
           
char *szCaption  = "Hello,World";
           
try
           
{
                  _asm
{
                            push MB_OK or MB_ICONINFORMATION
                            mov    eax, szCaption     ;局部变量为指针类型时可直接用mov
                            push eax
                            lea  eax,szMsg    ;局部变量用lea
                            push eax
                            push 
0
                           mov  eax, dword ptr [MessageBox] ; 获得MessageBox的地址;不能直接call dword ptr [MessageBox]  ,因为静态地址不能转换为动态地址,即函数在dll中的地址没有转化为程序运行中的相对地址
                           call eax
                  }

           }
catch(CException* e)
           
{
                   ;
          }

}
   


为什么调用printf的时候不加是call   printf        而调用messagebox的时候就是call   [messagebox]

回答:

printf   是标准的c/c++函数
messagebox不是标准的c/c++函数,   而是api函数。 

由于是系统运行库函数,   messageboxa   指向的不是函数,而是存储函数指针的地址,所以为二次指针。 printf   是函数指针。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值