double arrow

Inc EBX

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

; Очистить строку


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: