loop @@q2
; Отобразить символ-разделитель колонок
mov [TextColorAndBackground],WHITE
Mov AL,0B3h
Call ShowASCIIChar
inc [ScreenColumn]
; Вернуться назад на 16 символов
Sub EBX,16
; Отобразить очередную группу байт в кодах ASCII
Mov CX,16
mov [TextColorAndBackground],LIGHTCYAN
@@q3: mov AL,[GS:EBX]
Call ShowASCIIChar
Inc EBX
loop @@q3
inc [ScreenString]
Dec DX
jnz @@q1
; Ожидать нажатия любой клавиши
Call GetAddressOrCommand
cmp [CommandByte],F10
jne @@q0
@@End:; Установить текстовый режим
Mov ax,3
Int 10h
; Выход в DOS
Mov AH,4Ch
Int 21h
ENDP MemoryDump
;******************************************************
;* ВЫВОД БАЙТА НА ЭКРАН В КОДЕ ASCII *
;* Подпрограмма выводит содержимое регистра AL в коде *
;* ASCII в указанную позицию экрана. *
;* Координаты позиции передаются через глобальные *
;* переменные ScreenString и ScreenColumn. После *
;* выполнения операции вывода происходит автомати- *
;* ческое приращение значений этих переменных. *
;******************************************************
PROC ShowASCIIChar near
Pusha
Push DS
Push ES
Mov DI,DGROUP
Mov DS,DI
Cld
; Настроить пару ES:DI для прямого вывода в видеопамять
|
|
Push AX
; Загрузить адрес сегмента видеоданных в ES
Mov AX,0B800h
Mov ES,AX
; Умножить номер строки на длину строки в байтах
mov AX,[ScreenString]
Mov DX,160
Mul DX
; Прибавить номер колонки (дважды)
add AX,[ScreenColumn]
add AX,[ScreenColumn]
; Переписать результат в индексный регистр
Mov DI,AX
Pop AX
mov AH,[TextColorAndBackground]
Stosw
; Подготовка для вывода следующих байтов
; Перевести текущую позицию на 2 символа влево
inc [ScreenColumn]
; Проверить пересечение правой границы экрана
cmp [ScreenColumn],80
jb @@End
; Если достигнута правая граница экрана -
; перейти на следующую строку
sub [ScreenColumn],80
inc [ScreenString]
@@End: pop ES
Pop DS
Popa
Ret
ENDP ShowASCIIChar
;*******************************************************
;* ПЕРЕВОД ЧИСЛА ИЗ ШЕСТНАДЦАТЕРИЧНОГО КОДА В ДВОИЧНЫЙ *
;* DS:SI - число в коде ASCII. *
;* Результат возвращается в EAX. *
;*******************************************************
PROC HexToBin32 near
Push EBX
Push CX
Push SI
Cld
Xor EBX,EBX;обнуляем накопитель
Xor CX,CX;обнуляем счетчик цифр
@@h0: lodsb
; Проверка на ноль (признак конца строки)
And AL,AL
jz @@h4
; Проверка на диапазон '0'-'9'
cmp AL,'0'
jb @@Error
cmp AL,'9'
ja @@h1
sub AL,'0'
jmp short @@h3
@@h1:; Проверка на диапазон 'A'-'F'
cmp AL,'A'
jb @@Error
cmp AL,'F'
ja @@h2
Sub AL,'A'-10
jmp short @@h3
@@h2:; Проверка на диапазон 'a'-'f'
cmp AL,'a'
jb @@Error
cmp AL,'f'
ja @@Error
Sub AL,'a'-10
@@h3:; Дописать к результату
; очередные 4 разряда справа
Shl EBX,4
Or BL,AL
Inc CX
Cmp CX,8
jbe @@h0
; Если в числе больше 8 цифр - ошибка
jmp short @@Error
@@h4:; Успешное завершение - результат в EAX
Mov EAX,EBX
jmp short @@End
@@Error:; Ошибка - обнулить результат
Xor EAX,EAX
@@End: pop SI
Pop CX
Pop EBX
Ret
ENDP HexToBin32
|
|
;************************************************
;* ПРИНЯТЬ С КЛАВИАТУРЫ НОВЫЙ АДРЕС ИЛИ КОМАНДУ *
;************************************************
PROC GetAddressOrCommand near
Pushad
; Использовать при выводе белый цвет, черный фон
mov [TextColorAndBackground],WHITE
; Установить номер строки поля ввода
mov [ScreenString],21
@@GetAddressOrCommand:
; Инициализировать переменные
; Обнулить счетчик цифр
mov [CharacterCounter],0
; Очистить строку