首页
社区
课程
招聘
[求助]同一段内联汇编,VC6可以,VS2005则不行
发表于: 2009-5-3 18:35 7208

[求助]同一段内联汇编,VC6可以,VS2005则不行

2009-5-3 18:35
7208
同一段内联汇编,VC6可以编译并且可以运行,而VS2005编译通过,运行就崩溃,why?非常简单的一段代码,初学内联汇编
#include <stdio.h>

char szFormat[] = "%s %s\n";
char szHello[] = "Hello";
char szWorld[] = "world";
int main()
{
	_asm
	{
		mov eax, offset szWorld
		push eax
		mov eax, offset szHello
		push eax
		mov eax, offset szFormat
		push eax
		call printf
		pop ebx
		pop ebx
		pop ebx
	}

	return 0;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
2
printf的问题吧~~
2009-5-3 18:36
0
雪    币: 53
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
是不是宽字符的问题
2009-5-3 18:40
0
雪    币: 156
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
是啊,去掉printf就不崩了
2009-5-3 18:56
0
雪    币: 156
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我没用宽字符啊,况且我都把项目属性改成用多字节字符集了
2009-5-3 18:57
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
看下生成的汇编代码,调下不就知道了
2009-5-3 19:09
0
雪    币: 615
活跃值: (1267)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
call DWORD PTR printf
2009-5-3 19:38
0
雪    币: 156
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
[QUOTE=xzchina;616323]call DWORD PTR printf[/QUOTE]

这样可以了。可否详解一下。另外为什么VC6可以正确运行呢
2009-5-3 19:48
0
雪    币: 8342
活跃值: (4033)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
vc 6 可能编译成 call jmp [printf]

vc 2005  编译成 call [printf]
2009-5-3 19:55
0
雪    币: 359
活跃值: (440)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
13
VS2008,直接在命令行下编译(没有建工程什么的),默认的参数,编译通过,运行也正常!

E:\Programming>cl test.cpp /EHsc
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.

test.cpp
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation. All rights reserved.

/out:test.exe
test.obj

E:\Programming>test
Hello world

E:\Programming>
2009-5-3 23:27
0
雪    币: 221
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
编译器的问题
2009-5-4 10:16
0
雪    币: 129
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
你也可以这样的

mov ebx,[printf]
call ebx

这样就行了

主要看你的printf是怎么定义的了
2009-5-5 00:24
0
游客
登录 | 注册 方可回帖
返回
//