Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как вывести поле памяти функцией printf?


Автор: Xf1sh 27.4.2006, 05:27
У меня есть такой код:
Код

typedef unsigned long DWORD;

struct _R0
{
_RH rh0;
BYTE nunits;
DWORD end_addr;
}

Компилятор Borland C++ 3.0

Мне нужно вывести содержимое поля памяти end_addr в шестнадцатеричном виде с помощью printf. Как это можно сделать? А то выдает какую-то ерунду. Я смотрю в Turbo Debugger'e должно выводиться такое значение: 0x75F200A5, а выдает только 0x000000A5.
Вот мой вариант printf'а, каторый неправильно работает:
Код

sprintf(buf, "end_addr = 0x%.8X", r0.end_addr);
сputs(buf);

Подскажите, пожалуйста, что нужно писать около знака процента, чтобы все правильно работало?

Автор: VectorMan 27.4.2006, 07:26
юзай %p
хоть и не официальный спецификатор, но поддерживается почти всеми стандартными библиотеками 

ну или так

Код

sprintf(buf, "end_addr = 0x%X%X", r0.end_addr >> 16, r0.end_addr);
сputs(buf);
 

Автор: likehood 27.4.2006, 08:52
Может подойдет это
Код

sprintf(buf, "end_addr = 0x%lX", r0.end_addr);
 

Автор: Знак 27.4.2006, 17:28
long не DWORDD

 

Автор: Xf1sh 28.4.2006, 18:41
Я кажется все понял! Я написал на встроенном ассемблере небольшой фрагмент, который по идее должен выполнять теже самые действия и в итоге он выдал одинаковый результат, если использовать спецификацию преобразования %.8lX.
Код

// Эти три строки я написал уже потом, когда попробывал на асме.

    strcpy(buf, "");
    sprintf(buf, "end_addr = 0x%.8lX", r0.end_addr);
    cputs(buf);

// Вот начало эксперимента.

    void near *p = &r0.end_addr;
    int sz;
    sz = sizeof(DWORD);

Код


// Преобразование поля памяти и вывод на экран.

    asm    {
        mov    si,sz
        mov    bx,p
        xor    ax,ax
    }
m1:
    asm {
        mov    al,[bx + si - 1]

        shl    ax,4    // Сохранить старшую тетраду в ah.
        shr    al,4    // Восстановить младшую в al.

// Преобразовать в ASCII al.

        cmp    al,10
        sbb    al,69h
        das

        mov    dl,al

        shr    ax,8

        cmp    al,10
        sbb    al,69h
        das

        mov    dh,al

        push ax
        push bx

// Вывести символ с текущим атрибутом на экран.

        mov    ah,0Ah
        mov    bh,0
        mov    al,dh
        mov    cx,1
        int    10h

        mov    di,dx    // Сохранить dx.

// Считать положение и размер курсора.

        mov    ah,03h
        mov    bh,0
        int    10h    // Выход: dh = строка, dl = столбец.

        inc    dl
// Установить положение курсора.

        mov    ah,02h
        int    10h

        mov    dx,di    // Восстановить dx.

// Вывести dl.

        mov    ah,0Ah
        mov al,dl
        mov    cx,1
        int    10h

        mov    ah,03h
        mov    bh,0
        int    10h
        inc    dl
        mov    ah,02h
        int    10h

        pop    bx
        pop    ax

        dec    si
        jnz    m1
    }
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)