如何打印(或转储)任何类型的十六进制指针?

时间:2019-01-05 00:46:26

标签: c x86 kernel bare-metal

我在这里问您一个有关内核开发(特定于x86处理器)的问题,我的问题是:我想显示任何指针的十六进制地址。

我尝试了很多事情,自己弄清楚了,但是我撞墙了。

我自己实现的所有打印功能都可以使用。请记住:我是在独立的环境(GCC东西)中编码。

这是到目前为止我正在做的事情

void testPrintHex(void* someptr) {
const char* hexDigits = "0123456789ABCDEF";

uint32_t* ptr = (uint32_t*) someptr;

print("0x");

for(size_t i = 0; i < 32; i+=8) {
    char c = ptr[i];

    char low = c & 0x0F;
    char high = (c >> 4) & 0x0F;

    for(int j = 0; j <= 16; j++) {
        char h = (hexDigits[j] >> 4) & 0x0F;

        if(high == h) {
            printChar(h);
        }
    }

    for(int j = 0; j <= 16; j++) {
        char l = hexDigits[j] & 0x0F;

        if(low == l) {
            printChar(l);
        }
    }
}

print("\n");
}

我希望这能打印该指针的内存地址。我得到什么?这个:0x

哦,有12个(2个黑桃,2个笑脸,6个正方形和2个心)奇怪的符号没有显示Stack Overflow。

1 个答案:

答案 0 :(得分:2)

假设您要打印指针指向的接下来的4个字节,则要简单得多:

void testPrintHex(void* someptr) {
    const char* hexDigits = "0123456789ABCDEF";

    uint8_t* ptr = (uint8_t*) someptr;

    print("0x");

    for(size_t i = 0; i < 4; i++) {
        char c = ptr[i];

        char low = c & 0x0F;
        char high = (c >> 4) & 0x0F;

        printChar(hexDigits[high]);
        printChar(hexDigits[low]);
    }

    print("\n");
}