您的位置:首页 > 编程语言 > C语言/C++

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

2008-04-03 09:28 330 查看

#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 是函数指针。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐