Я кажется все понял! Я написал на встроенном ассемблере небольшой фрагмент, который по идее должен выполнять теже самые действия и в итоге он выдал одинаковый результат, если использовать спецификацию преобразования %.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 }
|
|