首页
社区
课程
招聘
[旧帖] 看看这段代码哪里有问题 0.00雪花
发表于: 2010-11-1 10:43 6039

[旧帖] 看看这段代码哪里有问题 0.00雪花

2010-11-1 10:43
6039
#include <stdio.h>
void print()
{   
        #pragma comment(linker, "/entry:print")
        #pragma comment(linker, "/SECTION:.text,REW" )

        printf("hello world ");       
}

void main()
{
}

以上程序运行起来为什么没有打印出 hello world???????

求高手指教。

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

收藏
免费 0
支持
分享
最新回复 (20)
雪    币: 429
活跃值: (532)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你没有在主函数中执行
2010-11-1 10:51
0
雪    币: 358
活跃值: (662)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
3
io,堆这些好像也还没有初始化吧.
你先调用mainCRTStartup
在mainCRTStartup函数里面会调用main函数的,所以你在mainCRTStartup前面把main那里的代码给改了,跳到你的printf那里去.
因为要改代码,才要加  #pragma comment(linker, "/SECTION:.text,REW" )的
2010-11-1 11:18
0
雪    币: 245
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
前辈写的

//hello.c by MentalDease
#include "stdafx.h"
#include "stdio.h"

void print()
{   
  #pragma comment(linker, "/entry:print")
  #pragma comment(linker, "/SECTION:.text,REW" )
  int mainCRTStartup();
  void main();

  __asm
  {
    MOV   EAX,  OFFSET main
    MOV   BYTE PTR[EAX], 0xB8  //MOV  EAX, 0x
    MOV   DWORD PTR[EAX+1], OFFSET SHOWSTRING
    MOV   WORD PTR[EAX+5], 0xE0FF // JMP  EAX
  }

  mainCRTStartup();

SHOWSTRING:
  printf ("i am MentalDease\n");
  getchar();
  
}

void main()
{
}
2010-11-1 11:23
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
#include <stdio.h>
void print()
{   
  #pragma comment(linker, "/entry:print")
  #pragma comment(linker, "/SECTION:.text,REW" )

  printf("hello world ");  
}

void main()
{
        printf();
}

你虽然封装了printf()函数,但是你没有调用,应该在主函数中调用,才能执行printf()函数中的代码!
2010-11-1 21:16
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
main函数中没有调用print()
2010-11-2 10:06
0
雪    币: 109
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼主你不说清楚,看,楼上二位理解错了不是
不过你把
#pragma comment(linker, "/SECTION:.text,REW" )
改成
#pragma comment(lib, "msvcrt.lib" )
貌似应该可以
2010-11-2 10:14
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
8
新手测试 2008编译器效果,这么写就可以:
#include <stdio.h>
void print()
{
        #pragma comment(linker, "/entry:print")
        printf("hello world ");  
}

void main()
{
}
2010-11-2 11:02
0
雪    币: 1116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
后患无穷吧
2010-11-2 11:06
0
雪    币: 255
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
顶一下····支持下楼主!···········
2010-11-2 11:18
0
雪    币: 358
活跃值: (662)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
11

//hello.c by MentalDease
#include "stdafx.h"
#include "stdio.h"

void print()
{
// 更改入点函数,改成print
#pragma comment(linker, "/entry:print")
// 因为后面有修改main函数,代码是在.text节中,没有写的属性,所以修改一下.text节的属性
#pragma comment(linker, "/SECTION:.text,REW" )

// 向前申明这二个函数
int mainCRTStartup();
void main();

// 这段的作用是将main偏移处的代码改成jmp到SHOWSTRING处
// 因为mainCRTStartup里面会调用main函数,除了调用main函数,还会有一些别的操作
// 比如获取命令行参数,初始化io之类的,而main函数是在倒数第二个调用的
// 关于这部份,大家可以看下,crt0.c代码内容解释和编译器构造
// http://www.cnblogs.com/shanzy/articles/513436.html
__asm
{
MOV EAX, OFFSET main
MOV BYTE PTR[EAX], 0xB8 //MOV EAX, 0x
MOV DWORD PTR[EAX+1], OFFSET SHOWSTRING
MOV WORD PTR[EAX+5], 0xE0FF // JMP EAX
}

mainCRTStartup();

SHOWSTRING:
printf ("i am MentalDease\n");
getchar();

}

void main()
{
}

.................
2010-11-2 12:15
0
雪    币: 17
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cpe
12
这段代码本来就可以打印出Hello World来呀,另外
void main()
{
}
用着多余也可以删了
2010-11-2 18:01
0
雪    币: 67
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
毛主席说过 没有调查就没有发言权 没有真实的调查同样没有发言权
2010-11-2 19:26
0
雪    币: 249
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
VC6下通过,编译选项/MD(release版)或/MDd(debug版)

#include <stdio.h>

#pragma comment(linker, "/ENTRY:func")

void func()
{
        printf("Hello!\n");
}
2010-11-2 19:53
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
小菜的我不知道C语言里有#pragma comment(linker, "/ENTRY:func")
不过看着好像是linker连接func这个东东!唉!加强学习!
2010-11-2 19:57
0
雪    币: 67
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
你可以装个msdn,上面有很祥细的帮助的

还不结贴呀!
2010-11-3 11:04
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
这位老兄的是正解,你根本没在主程序中调用print(),当然没显示了
2010-11-3 21:41
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
顶一下····支持下楼主!···········
2010-11-4 04:22
0
雪    币: 983
活跃值: (967)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
已经把程序的入口函数改了啊 应该可以成功的
2010-11-5 21:24
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
Me TOO!!!!!!!!!!!
2010-11-9 09:26
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
是要加入#pragma comment(lib, "msvcrt.lib"),msvcrt定义了Printf、puts等基本函数,才能正确输出。
2010-11-9 10:08
0
游客
登录 | 注册 方可回帖
返回
//