Как напечатать (или сбросить) любой тип указателя на шестнадцатеричный?

Я здесь, чтобы задать вам вопрос о разработке ядра (конкретно для процессоров 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 не показывал.


person The Mint Br    schedule 05.01.2019    source источник
comment
Вам не нужен линейный поиск нужной цифры! Вы можете просто посмотреть его. На самом деле, линейный поиск лишает цели, потому что тогда вам нужно будет обрабатывать разрыв от 9 до A с помощью if. Используйте что-то вроде printChar(hexDigits[high]) и printChar(hexDigit[low]);   -  person Peter Cordes    schedule 05.01.2019
comment
Вы пытаетесь напечатать адрес или содержимое?   -  person Phil M    schedule 05.01.2019
comment
Кроме того, вы должны предоставить минимально воспроизводимый пример.   -  person Phil M    schedule 05.01.2019
comment
Вам нужна помощь, чтобы понять, почему ваша функция полностью сломана, или вам нужна простая работающая функция? Если последнее, это дубликат другого вопроса о дампе памяти. Обратите внимание, что вы сбрасываете указанную память, а не печатаете сам указатель. Ошибки в вашей версии включают печать только младших 4 битов байта ASCII и то, что младшие 4 бита A совпадают с младшими 4 битами 1, поэтому ваш поиск не работает.   -  person Peter Cordes    schedule 05.01.2019


Ответы (1)


Предполагая, что вы хотите напечатать следующие 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");
}
person dbush    schedule 05.01.2019