我正在尝试用简单的设施编写自己的printf。
这是printf.c的代码:
#include "printf.h"
uint8 pos_x=0, pos_y=0;
void printf(char str[]){
int i=0;
while(str[i]!='\0'){
switch(str[i]){
case '\t':{
uint8 k=0;
while(k<TAB_WIDTH){
putCh(' ');
++k;
}
}
case '\n':newLn();
default:putCh(str[i]);
}
++i;
}
}
void putCh(char ch){
char *p=(char*)(VIDEO_MEM+2*(RES_X*pos_y + pos_x));
asm(" xchg %bx, %bx");
*p++=ch;
*p++=ATTRIBUTE;
++pos_x;
}
void newLn(){
pos_x=0;
++pos_y;
}
所以,如果我使用上面的代码没有任何作用,但如果我使用这个*((int*)0xb8000)=0x07690748;
它可以正常工作。
那么,我的指针有什么问题?谢谢!
P.S。所有定义都在printf.h
;函数叫做form main就像这样:
char str[]="Hello!\n";
printf(str);
Edit1:环境:
gcc 4.8.2 built for i586
Bochs 2.6.2
No OS
Edit2:printf.h
#ifndef _PRINF_F_
#define _PRINT_F_
#include "types.h"
#define VIDEO_MEM 0xb8000
#define RES_X 80
#define RES_Y 25
#define ATTRIBUTE 0x7
#define TAB_WIDTH 4
void printf(char[]);
void putCh(char);
void newLn();
#endif
答案 0 :(得分:1)
查找switch语句的语法 - 特别是BREAK
答案 1 :(得分:0)
pos_x
和pos_y
被声明为uint8
;因此,VIDEO_MEM+2*(RES_X*pos_y + pos_x)
也被投射到uint8
。这种情况发生在之前将结果强制转换为char *
。第8位及更高位被清除; VIDEO_MEM完全清除。
这可能有所帮助:
char *p = (char*)(VIDEO_MEM + 2 * (RES_X * (uint32)pos_y + pos_x));
那,加上其他贡献者在这里指出的问题。