|
===================
dump PROC NEAR
push ax ; сохранение регистров,
push dx ; используемых
push bx ; @DisChr и @DisStr
push cx
@DisStr dmsg1 ; начало отображения сообщений
mov ch,2 ; 2 шестнадцатиричные цифры на байт
h_dump: mov ah,es:[bx] ; получение байта
jnc bx ; следующий байт
call bin2hex
@DisChr ' '
dec cl ; счетчик цикла - 1
jnz h_dump ; повторение, пока счетчик не станет 0
@DisStr dmsg2 ; следующий раздел
pop cx ; восстановление значений
pop bx ; BX (индекс)
push bx ; и
push cx ; CX (счетчик)
t_dump: mov al,es:[bx] ; получение байта
jnc bx ; следующий байт
cmp al,' ' ; проверка возможного диапазона печати
jb no_prnt ; ? < памяти
cmp al,7Eh ; DEL невозможно напечатать, либо
ja no_print
@DisChr al ; возможно - выполнить так ...
jmp nxt_txt
no_prnt:
@DisChr '.' ; используйте "." для невозможн.печати
nxt_txt:
dec cl ; счетчик цикла - 1
jnz t_dump ; повторение, пока счетчик не станет 0
; Выполнение всех восстановлений и выход
@DisChr CR
@DisChr LF
pop cx ; восстановление регистров
pop bx
pop dx
pop ax
ret
dmsg1 db 'HEX: $'
dmsg2 db ' ASCII: $'
- 3-71 -
dump ENDP
;
; ===== GET_HEX осуществляет грамматический разбор буфера, =====
; ===== указанного в BX, возвращаемое количество в AX. =========
; ===== # цифр для грамматического разбора содержится в CH, ====
; ===== и BX увеличивается на # обработанных цифр. =============
;
get_hex PROC NEAR
push dx ; сохранение регистра DX
push cx ; сохранение регистра CX
mov ax,0 ; очистка аккумулируемого #
mov dh,0 ; очистка верхней рабочей памяти
mov cl,4 ; установка сдвига счетчика
nxt_digit:
mov dl,[bx] ; получение символа
sub dl,'0'
jb bad_digit ; ? < '0' - неправильно
cmp dl,0Ah
jb ok_digit ; от '0' до '9' - хорошо
sub dl,'A'-'0'
jb bad_digit ; '9' < ? < 'A' - неправильно
add dl,0Ah
cmp dl,10h
jb ok_digit ; от 'A' до 'F' - хорошо
sub dl,'a'-'A'-0Ah
jb bad_digit ; 'F' < ? < 'a' - неправильно
add dl,0Ah
cmp al,10h
jae bad_digit ; 'f' < ? - неправильно
ok_digit:
add ax,dx ; аккумулирование цифр в AX
inc bx ; следующая цифра
dec ch
jnz more_digit ; еще цифры для аккумулирования?
clc ; ошибки нет - очистка CY
pop cx
pop dx
ret
more_digit:
shl ax,cl ; открытие места для следующей цифры
jmp nxt_digit ; цикл для следующей цифры
bad_digit:
@DisStr digit_error ; информирование об ошибке элемента
stc ; ошибка - установка переноса
pop cx
pop dx
ret
; ожидался двухцифровой шестнадцатиричный номер
digit_error db 'A two-digit hex number was expected',CR,LF,'$'
get_hex ENDP
;
; ===== BIN2HEX отображает значение, содержащееся в AX как =====
; ===== шестнадцатиричный #. Регистры не портятся. CH содержит =
; ===== # цифры для отображения, выбираемой слева направо в AX.=
; ===== (AH отображается, если CH равен 2). ====================
;
bin2hex PROC NEAR
- 3-72 -
push ax ; сохранение всех регистров
push bx
push cx
push dx
mov cl,4 ; установка счетчика чередования
mov bx,ax ; копирование AX для работы
; Начало цикла DIGIT (цифра) для обработки цифр
moredig:
rol bx,cl ; преобразование двоичн.-шестнадцат.
mov al,bl
and al,0Fh
add al,90h
daa
adc al,40h
daa
; Отображение цифры и проверка на последующие цифры - восста-
; новление, если нет
@DisChr al
dec ch
jnz moredig
pop dx
pop cx
pop bx
pop ax
ret
bin2hex ENDP
;
remove ENDS
END start
----------------------------------------------------------------
Эта секция, отображающая содержимое адресуемого размещения с
помощью вектора, может быть выбрана и превращена в программу.
Эта программа может быть использована для отображения содержимо-
го любого вектора прерывания и его возможных подпрограмм обслу-
живания.
Программа REMOVE служит примером для многих тем, обсужденных
в этой главе, и помогает при демонстрации рекомендуемого инстру-
ментария установки и удаления.
Заключение
Материал, представленный в этой главе, касается многих от-
дельных тем. Дополнительно к обещанному материалу по управлению
программами и памятью в эту главу был также включен материал по
организации программ, а также по структуре и содержимому прог-
рамм MS-DOS. Было дано множество примеров способов функциониро-
вания макроассемблера (MASM) MS-DOS.
Несмотря на то, что показанный здесь материал, не всегда мо-
жет оказаться для Вас полезным, мы надеемся, что Вы найдете при-
ложение многому из того, что изложено в этой главе. Для систем-
ных и прикладных программистов особенно важным является материал
по PSP и организации программ в памяти.
Глава 4. ПРОГРАММЫ TSR (ЗАВЕРШИТЬ И ОСТАВИТЬ РЕЗИДЕНТНОЙ)
Обзор
Работа с аппаратурой PC
Работа в среде DOS
Загрузка и инициализация TSR
Реактивация, архитектура DOS и сервис
Фоновая обработка с использованием Int 28h
Удаление из памяти программ TSR
Заключение
Создание и установка резидентных программ (TSR) является ши-
роко используемым средством, но его функционирование остается
скрытым от большинства пользователей.
|