能力值:
( LV12,RANK:210 )
|
-
-
2 楼
请这样修改:
汇编代码第2行改为:
.model flat, stdcall
第18行改为:
MsgBox PROC C
在VC6.0下测试成功
|
能力值:
( LV4,RANK:50 )
|
-
-
3 楼
倒~~~~~~
真的成功了~~~
太谢谢了~~~~
终于没有让我失望~~~
注册ID等一天才能发帖子,看来没白等~~~
对了,阁下知道,为什么在开始声明stdcall,c会导致VC的编译错误吗?
|
能力值:
( LV12,RANK:210 )
|
-
-
4 楼
声明为stdcall, c的话实际上是声明了c函数调用类型, stdcall会被忽略, 这样编译器在处理API函数MessageBoxA函数的时候会把它当作C调用类型,而实际上MessageBoxA是Stdcall类型的
|
能力值:
( LV4,RANK:50 )
|
-
-
5 楼
反过来呢?
如果我要在汇编中调用VC写的函数
我尝试了一下
#include <windows.h>
extern "C" void fuckme()
{
MessageBox(NULL,"","",0);
}
汇编
.386
.....
fuckme proto C
这样调用fuckme函数会出错的~~
fatal error LNK1104: cannot open file "LIBC.lib"
如果不加后面的C,就会找不到fuckme这个函数
main.obj : error LNK2001: unresolved external symbol _fuckme@0
|
能力值:
( LV4,RANK:50 )
|
-
-
6 楼
定义为:extern "C" void __stdcall func()
就能找到"_func@0"了.
|
能力值:
( LV4,RANK:50 )
|
-
-
7 楼
还是不行啊~
MASM:
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
includelib fuckme.lib
fuckme proto C
.code
start:
invoke fuckme
invoke ExitProcess,0
end start
VC:
#include <windows.h>
extern "C" void WINAPI fuckme()
{
MessageBox(NULL,"","",0);
}
|
能力值:
( LV4,RANK:50 )
|
-
-
8 楼
像MASM类的中级汇编语言会隐藏函数命名方法,虽然对初学者有入门方便,但链接起来(尤其是跨语言)可能会出现不易处理的问题.
这一点我比较喜欢使用NASM,完全使用自定义的函数名,可惜不支持宏.
其实MASM也应该支持自定义函数名(即不会自动修改函数名).不过我不太了解.
|
能力值:
( LV12,RANK:210 )
|
-
-
9 楼
MASM支持自定义函数名的, SYSCALL就是
我我测试了下面两个程序, 没有问题
;-----------------------------------------------------
;a.asm
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
fuckme proto C
.code
start:
invoke fuckme
ret
end start
//////////////////////////////////////////////////
//b.cpp
#include <windows.h>
extern "C" void fuckme()
{
MessageBox(NULL,"","",0);
}
编译连接命令如下:
ml /c /Cp /coff a.asm
cl /c b.cpp
link /subsystem:windows a.obj b.obj
|
能力值:
( LV6,RANK:90 )
|
-
-
10 楼
最近我也在学32位汇编语言,在这里看到不少好东西,非常感激大家。真的非常高兴。
|
|
|