不用printf函数输出

xinzaiyiqi 2010-03-29 01:32:39
各位来看看吧,这个小程序目的是不使用printf函数,向屏幕输出"Hello,world!",为什么编译通过,无法执行呢?我用的是VC++6.0,谢谢各位喽!

//向屏幕输出"Hello,world!"
#define black 0
#define blue 1
#define green 2
#define cyan 3
#define red 4
#define magenta 5
#define brown 6

void write_string(char *pstring,int color)
{
char *pvideo=(char *)0xB8000000;
while(*pstring)
{
*pvideo=*pstring;
pstring++;
pvideo++;
*pvideo=color;
pvideo++;
}
}

void main()
{
write_string("Hello,world!",red);
}

...全文
591 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
icansaymyabc 2010-03-30
  • 打赏
  • 举报
回复
用 tc 或 BC 或 VC1.5 编译成DOS程序,在DOS下运行,你的程序就是对的。
Faitle 2010-03-30
  • 打赏
  • 举报
回复
toooooooold
carol_cheng_snow 2010-03-30
  • 打赏
  • 举报
回复
之前20楼的程式码,我执行以后仍然无法印出hello world.
所以我用另一種方法印出hello world.
我使用Microsoft Visual C++ 2008 Express Edition run此程式碼


#include<stdio.h>
#include <stdarg.h>

void print(const char *fmt)
{
va_list argp;
va_start(argp, fmt);
vfprintf(stderr, fmt, argp);
va_end(argp);
fprintf(stderr, "\n");
}

void main()
{
print("Hello world");
}

carol_cheng_snow 2010-03-30
  • 打赏
  • 举报
回复
使用指标时,你必须动态配置(allocate)记忆体位置
关於指标的记忆体配置,请看以下连结



#include<stdio.h>
#include<stdlib.h>
#define black 0
#define blue 1
#define green 2
#define cyan 3
#define red 4
#define magenta 5
#define brown 6
void write_string(char *pstring,int color)
{
char *pvideo=(char *)0xB8000000;

/*Allocating memory*/
pvideo=(char *) malloc(sizeof(pstring)/sizeof(pstring[0]));

while(*pstring){
*pvideo=*pstring;
printf("%c",*pvideo);
pstring++;
*pvideo=color;
pvideo++;
}
}
void main()
{
write_string("Hello world",red);
}
电信用户 2010-03-30
  • 打赏
  • 举报
回复
。。。。。。。。。。。。
兰州你自己写printf函数咯?直接读写现存啊、。。。
xinzaiyiqi 2010-03-30
  • 打赏
  • 举报
回复
这是我在一本讲linux的书上看到的程序,可能真有点老,而且他用的是DJGPP编译器。他说可以直接向视频缓冲区输出,我试了试,结果不行。上面各位的意见要好好吸收吸收,谢谢喽!
cxxsdn 2010-03-29
  • 打赏
  • 举报
回复
这个程序直接写屏了,要用老的16位编译器编译,而且要在实模式下运行。拿到保护模式下运行,Linux 下面是 segmentation fault, Windows NT 下面是 ACCESS VIOLATION.

用 VC6 编译,那个指针赋值就飞了。Ring3 的进程,地址空间根本不做显存映射。
mymtom 2010-03-29
  • 打赏
  • 举报
回复
DOS下的直接写屏?
pengxn 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dubiousway 的回复:]
直接读写显存的时代过去了。


装个dos,可以。
保护模式下,,,no way
[/Quote]

神奇
cy330206 2010-03-29
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20100327/23/e48e95eb-e067-480e-9acb-cf3bd7f63e10.html?92165

楼主看看这个帖子可能会有帮助
moon6623 2010-03-29
  • 打赏
  • 举报
回复
向屏幕输出........
永远的汇编 2010-03-29
  • 打赏
  • 举报
回复
估计楼主看汇编看到一半突然产生了这种冲动。
永远的汇编 2010-03-29
  • 打赏
  • 举报
回复
他是想直接写进显存
BT六眼飞鱼 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dubiousway 的回复:]

直接读写显存的时代过去了。


装个dos,可以。
保护模式下,,,no way
[/Quote]
高手啊
lyramilk 2010-03-29
  • 打赏
  • 举报
回复
应该是0xb8000吧,运行的环境应该是DOS
fjx1982441 2010-03-29
  • 打赏
  • 举报
回复
这种输出方式没戏,就算是在嵌入式开发下直接读写显存,显示设备也不可能识别你的字符串。
ljm1212 2010-03-29
  • 打赏
  • 举报
回复
6楼亮了~~~~~~~
x-teamer团队 2010-03-29
  • 打赏
  • 举报
回复
这段代码的原理是什么?

char *pvideo=(char *)0xB8000000;找到标准输入输出的缓冲区位置?

然后将字串放入其中,系统就自动帮助输出?

如果标准输入输出的位置是错的, 就会引起栈出错。并且这个出错的几率非常大。
dubiousway 2010-03-29
  • 打赏
  • 举报
回复
直接读写显存的时代过去了。


装个dos,可以。
保护模式下,,,no way
sduxiaoxiang 2010-03-29
  • 打赏
  • 举报
回复

char *pvideo=(char *)0xB8000000;

这个是干嘛啊
加载更多回复(4)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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