用嵌入汇编调用MessageBox,结果一运行就崩溃

hongzhaj 2011-01-10 12:45:45

#include "stdafx.h"
char c[]="caption";
char t[]="text";

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
__asm{
push MB_OK
lea si,c
push si
lea si,t
push si
push NULL
call dword ptr MessageBoxA
}
return 0;
}


参数入栈的时候我是从右往左啊。
问题出在哪里呢?

谢谢!
...全文
314 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
o_yale_o 2011-01-10
  • 打赏
  • 举报
回复
DWORD *pdwParamCall = new DWORD[ iParamCountCall ];
memset( pdwParamCall, 0x00, sizeof( DWORD ) * iParamCountCall );
pdwParamCall[ 0 ] = (DWORD)( _T( "" ) ); // Dll File Path
pdwParamCall[ 1 ] = (DWORD)( ( LPCTSTR )funcname ); // FunctionName
pdwParamCall[ 2 ] = (DWORD)(-1); // Return value

RunFunction( pdwParamCall, iParamCountCall );

=================================================================
BOOL CWin32Dll::RunFunction(DWORD* dwFuncs,UINT nSize)
{
if( !dwFuncs || !nSize)
{
return FALSE;
}

if ( !m_hMod )
{
return FALSE;
}

DWORD dwFunction =
(DWORD)::GetProcAddress( m_hMod /*GetModuleHandleA( (const char*)dwFuncs[0] )*/,
(const char*)dwFuncs[1] );
if( !dwFunction )
{
return FALSE;
}

DWORD dwTemp(0);
_asm
{
pushad;
mov ebx, nSize;
mov edx, dword ptr dwFuncs;

cmp ebx,3
jb LEXIT;
L1: dec ebx
cmp ebx,2
je LCALL
mov eax, [edx + 4*ebx]
push eax
loop L1;
LCALL:
mov dword ptr[dwTemp],edx
call dword ptr [dwFunction]
mov edx, dword ptr[dwTemp]
mov dword ptr[edx + 2*4],eax
LEXIT:
popad;
}
return TRUE;
}

汪宁宇 2011-01-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 hongzhaj 的回复:]
C/C++ code

#include "stdafx.h"
char c[]="caption";
char t[]="text";

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLin……
[/Quote]

LS已经给出代码了,我只想补充一下~~

全局变量用OFFSET,局部变量用LEA!


#include <afx.h>

char c[]="caption";
char t[]="text";

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
__asm{
push MB_OK
push OFFSET c
push OFFSET t
push NULL
call dword ptr [MessageBoxA]
}
return 0;
}


#include <windows.h> 

char szAppName[] = "Test";

int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd )
{
char szHello[] = "Hello, world!";
__asm
{
push MB_OK
push OFFSET szAppName // 全局变量用OFFSET
lea EAX, szHello // 局部变量用LEA
push EAX
push 0
call DWORD PTR [MessageBoxA]
}
return 0;
}
o_yale_o 2011-01-10
  • 打赏
  • 举报
回复
人应该在对的方向上做对
而不是也不能把错的事情做对
那样是自己跟自己过不去
o_yale_o 2011-01-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hongzhaj 的回复:]

引用 1 楼 o_yale_o 的回复:
DWORD *pdwParamCall = new DWORD[ iParamCountCall ];
memset( pdwParamCall, 0x00, sizeof( DWORD ) * iParamCountCall );
pdwParamCall[ 0 ] = (DWORD)( _T( "" ) ); // Dll File Path
……
[/Quote]

我只能给你通用dll调用方式。
真相重于对错 2011-01-10
  • 打赏
  • 举报
回复
__asm{
mov esi,esp
push MB_OK

push offset c
push offset t
push NULL
call dword ptr MessageBoxA
}
JeanLove 2011-01-10
  • 打赏
  • 举报
回复
http://baike.baidu.com/view/69207.htm
http://www.douban.com/note/31135531/
hongzhaj 2011-01-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 o_yale_o 的回复:]
DWORD *pdwParamCall = new DWORD[ iParamCountCall ];
memset( pdwParamCall, 0x00, sizeof( DWORD ) * iParamCountCall );
pdwParamCall[ 0 ] = (DWORD)( _T( "" ) ); // Dll File Path
pdwParamCall[ 1 ……
[/Quote]

这个太复杂了吧,能告诉我,我的程序错在哪里么?
谢谢!

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧