dec cx ; декрементируем счетчик
jz done ; если введено нужное количество значений
; завершаем цикл
cmp cx,12 ; осталось ввести не более 12 значений
jg input
mov dl,7 ; после ввода каждого значения
mov ah,02 ; выдаем звуковой сигнал
int 21h ; делаем так, чтобы не проскочить конец
; ввода буфера
jmp input ; переходим ко вводу следующего значенияю
done:
call OutBuf ; выводим буфер полностью для визуального
; контроля
; записываем введенные значения на дискету
mov ah,09h
lea dx,Message8
int 21h ; выводим приглашение на ввод адреса сектора
call GetAddr ; вводим адрес записываемого сектора
mov ah,03h ; записываем сектор
int 13h
; считываем указанный сектор и выводим его содержимое
mov ah,09h
lea dx,Message9
int 21h ; выводим приглашение на ввод адреса сектора
call GetAddr ; вводим адрес считываемого сектора
mov ah,02h ; читаем сектор
int 13h
call OutBuf ; выводим содержимое буфера после чтения
; завершаем работу программы
mov ax,4c00h
int 21h ; завершаем работу программы
;---------------------------------------------------------------------------
OutBuf proc near ; процедура вывода содержимого буфера
; чтения/записи
;---------------------------------------------------------------------------
mov bl,10h ; выводим по 16 значений на строку
mov cx,512 ; буфер имеет размер 512 байт
lea si,buf ; смещение буфера для цепочечной команды загрузки
cld ; сбрасываем флаг, направление слева-направо
output: ; цикл вывода значений элементов буфера
dec cx ; декрементируем счетчик элементов
js done1 ; если элементы кончились - завершаем цикл
lodsb ; загружаем очередной элемент буфера
call OutHex ; и выводим его
dec bl ; декрементируем счетчик строки
jnz sps ; строка не кончилась
mov bl,10h ; восстанавливаем счетчик строки
mov dl,0ah ; перевод строки
jmp nln
sps: mov dl,' ' ; пробел
nln: mov ah,02
int 21h ; выводим пробел или перевод строки
jmp output ; продолжаем вывод
done1:
ret
OutBuf endp
;---------------------------------------------------------------------------
GetAddr proc near ; процедура ввода адреса физического сектора
;---------------------------------------------------------------------------
incyl: mov ah,09h
lea dx,Message3
int 21h ; выводим приглашение на ввод номера цилиндра
mov al,cyl ; с указанием ограничения
call OutHex
mov al,cyl+1
call OutHex
mov ah,09h
lea dx,Message4
int 21h ; выводим закрывающую скобку и двоеточие
call InHex ; вводим номер цилиндра
mov bh,cyl ; сравниваем введенное значение с ограничением
mov bl,cyl+1
cmp ax,bx
jg incyl
push ax ; сохраняем введенное значение в стеке
inhead: mov ah,09h
lea dx,Message5
int 21h ; выводим приглашение на ввод номера головки
mov al,head ; с указанием ограничения
call OutHex
mov ah,09h
lea dx,Message4
int 21h ; выводим закрывающую скобку и двоеточие
call InHex ; вводим номер головки
mov bh,0
mov bl,head ; сравниваем введенное значение с ограничением
cmp ax,bx
jg inhead
push ax
insec: mov ah,09h
lea dx,Message6
int 21h ; выводим приглашение на ввод номера сектора
mov al,sec ; с указанием ограничения
call OutHex
mov ah,09h
lea dx,Message4
int 21h ; выводим закрывающую скобку и двоеточие
call InHex ; вводим номер головки
mov bh,0
mov bl,sec ; сравниваем введенное значение с ограничением
cmp ax,bx
jg insec
cmp ax,1 ; сравниваем введенное значение с ограничением
jl insec
mov cl,al ; номер сектора
pop bx
mov dh,bl ; номер головки
mov dl,00h ; дисковод А:
pop bx
mov ch,bl ; номер цилиндра
shl bh,6
or cl,bh
mov bx,OFFSET buf ; готовим адрес буфера в ES:BX
mov al,1 ; читаем один сектор
ret
GetAddr endp
;-------------------------------------------------------------------------
OutHex proc near ; процедура вывода шестнадцатеричного числа
; параметр - значение в регистре al
;-------------------------------------------------------------------------
push cx ; сохраняем регистры
push dx
mov cx,2 ; выводим байт - две цифры
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.