| Глава 2 | стр 13 |
MASM
MODEL small
.data ;сегмент данных *******************************************************
File_name db 'bukva04e.bmp',0
tek_el DB 00h
stroka DB 00h ;номер строки ввывода сообщения
kolonka DB 00h ;номер колонки ввывода сообщения
firstp_val DB 00h ;1-я шестнадцатиричная цифра в коде ASCII
secondp_val DB 00h ;2-я шестнадцатиричная цифра в коде ASCII
;handle DW ?
Handle DW 0FFFFh
temp DB 00h
mas_w label byte
rept 20
db 00h
endm
.stack 256 ;сегмент стека ************************************************
.code ;начало сегмента кода
; === Процедуры (подпрограммы) ===
;****************************************************************************
; процедура открытия файла **************************************************
;входный параметры
;dx - адрес на строку с именем файла
open_file proc
cmp Handle,0FFFFh
jne Quit_open
mov ax,3D00h
int 21h
mov Handle,ax
ret
Quit_open:
stc
ret
;Handle dw 0FFFFh
open_file endp
;****************************************************************************
; процедура закрытия файла **************************************************
close_file proc
mov ah,3Eh
mov bx,Handle
int 21h
ret
close_file endp
;*****************************************************************************
;фильтр вывода на экран, преобразовывает число в шестнадцатиричную форму
*********************
;входные параметры
;tek_el - выводимое число
filter proc
push ax
push dx
;обработка второй тетраэдры ******************************************
mov ah,tek_el ;в ah фильтруемое значение
and ah,00001111b ;выделяем вторую тетраэдру
cmp ah,0Ah ;сравниваем ее с 0Ah
jae symb1 ;переход если AL>=0Ah
add ah,30h ;в al ASCII код цифры соответствующий цифре в al
mov secondp_val,ah ;передача к.с.ц. во внешнюю переменную
jmp tetr2
symb1: ;если цифре соответствует шестнадцатеричная цифра - ABCDEF
add ah,37h ;в al ASCII код цифры соответствующей цифре в al
mov secondp_val,ah ;передача к.с.ц. во внешнюю переменную
jmp tetr2
tetr2: ;обработка второй тетраэдры ***********************************
mov ah,tek_el ;в al фильтруемое значение
shr ah,4 ;сдвиг в вправо на четыре бита для получения первой тетраэдры
cmp ah,0Ah ;сравниваем al с 0Ah
jae symb2 ;переход если AL>=0Ah
add ah,30h ;в al ASCII код цифры соответствующей цифре в al
mov firstp_val,ah ;передача к.с.ц. во внешнюю переменную
jmp exit
symb2:
add ah,37h ;в al ASCII код цифры соответствующей цифре в al
mov firstp_val,ah ;передача к.с.ц. во внешнюю переменную
exit: pop dx
pop ax
ret
filter endp
;*****************************************************************************
;процедура сдвига курсора на одну позицию вправо *****************************
cursor_sdvig proc
push ax
call cursor_position
inc kolonka
call print_position
pop ax
ret
cursor_sdvig endp
;******************************************************************************
;процедура определения текущей позиции курсора ********************************
;выходные данные
;stroka - строка
;kolonka - колонка
cursor_position proc
push ax
push bx
push dx
mov ah,03h
mov bh,00h
int 10h
mov stroka,dh
mov kolonka,dl
pop dx
pop bx
pop ax
ret
cursor_position endp
;******************************************************************************
;процедура позиционирования курсора *******************************************
;входные параметры
;stroka - строка
;kolonka - колонка
print_position proc
push ax
push dx
mov ah,02h
mov dh,stroka
mov dl,kolonka
int 10h
pop dx
pop ax
ret
print_position endp
;*****************************************************************************
;*****************************************************************************
;процедура вывода шестнадцатиричного числа с учетом цвета *********************
;входные параметры
;firstp_val - первый разряд числа
;secondp_val - второй разряд числа
print_h_el proc
push ax
push bx
push cx
push dx
mov al,firstp_val ;заносим в al превую цифру числа
mov ah,09h ;номер процедуры BIOS
mov bl,0Fh ;выбор цвета
mov cx,01h ;количество повторений
int 10h ;вызов процедуры BIOS
;сдвиг на одну позию от текущей
call cursor_sdvig
mov al,secondp_val ;заносим в al вторую цифру числа
mov ah,09h ;номер процедуры BIOS
mov bl,0Fh ;выбор цвета
mov cx,01h ;количество повторений
int 10h ;вызов процедуры BIOS
call cursor_sdvig
pop dx
pop cx
pop bx
pop ax
ret
print_h_el endp
;*****************************************************************************
;процедура перехода на следующую строку **************************************
corretka proc
push ax
push dx
mov ah,02h
mov dl,13
int 21h
mov ah,02h
mov dl,10
int 21h
pop dx
pop ax
ret
corretka endp
;*****************************************************************************
;*****************************************************************************
main proc ;начало процедуры main
;инициализация сегмента данных
mov ax,@data
mov ds,ax
mov es,ax
xor ax,ax
; ------------- Откроем файл ----------------
mov dx,offset File_name
call open_file ;Открываем файл
jc error_file ;Ошибка?
; ------------- Прочитаем файл ----------------
mov bx,ax ;поместим в bx номер файла
mov ah,3Fh ;Функция чтения файла
mov cx,20h ;сколько байт будет считано
lea dx,mas_w ;! Адрес, куда будут читаться данные
int 21h
; ------------- Закроем файл ----------------
call close_file
xor ax,ax ;обнуление ax
xor bx,bx ;обнуление bx
prepare:
mov cx,20h ;значение счетчика цикла в cx
mov si,0 ;индекс в si
compare:
push cx
mov bl,mas_w[si]
mov tek_el,bl ;в tek_el элемент из массива
call filter ;конвертируем
call cursor_sdvig
call print_h_el ;выводим 16-ричное число на экран
inc si ;на следующий элемент
pop cx
dec cx ;условие для выхода из цикла
jcxz exit1 ;cx=0? Если да — на выход
inc temp ;отслеживаем перевод строки
cmp temp,10h
jne pisk
mov temp,00h
call corretka
pisk:
jmp compare
;нет — повторить цикл
exit1:
mov ax,4c00h ;стандартный выход
int 21h
; ---------- Не смогли найти / открыть файл -----------------
error_file:
mov ah,2
mov dl,7
int 21h
ret
main endp ;конец процедуры main
end main ;конец программы с точкой входа main
Назад |
Начало урока |
Вверх |
Вперед
Содержание