低级printf

时间:2014-01-25 15:49:17

标签: c pointers assembly

我正在尝试用简单的设施编写自己的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

2 个答案:

答案 0 :(得分:1)

查找switch语句的语法 - 特别是BREAK

答案 1 :(得分:0)

pos_xpos_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));

那,加上其他贡献者在这里指出的问题。