首页 > 解决方案 > 如何打印(或转储)任何类型的十六进制指针?

问题描述

我在这里问你一个关于内核开发的问题(特定于 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

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

标签: cx86kernelbare-metal

解决方案


假设您要打印指针指向的下 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");
}

推荐阅读