c - 低级 printf

标签 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; 则效果很好。

那么,我的指针有什么问题呢?谢谢!

附注所有定义都在 printf.h 中;函数调用 form main 如下:

char str[]="Hello!\n";
printf(str);

编辑1:环境:

gcc 4.8.2 built for i586
Bochs 2.6.2
No OS

编辑2: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

最佳答案

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

关于c - 低级 printf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21352674/

相关文章:

c - 动态分配数字给C中的数组

c - 我在执行此未分配指针取消引用时遇到典型错误

java - 压入和弹出整数到堆栈,什么结果是不可能的

c - longjmp 是如何工作的?

c - K&R 波兰语计算器中可能存在的错误

c - 合并2个单向链表( headless 节点)

java - 具有多个线程的Java中的对象指针

C++指针练习

java - 链表和指针插入列表的冗余序列化

macos - 这个构造在 ARM64 程序集中的用途是什么,从 macOS 上的 Swift 编译而来 - adrp、ldr、br 指令序列