аh
xor bh,bh ; в bh - номер сторінки відеопам’яті
int 10h
mov cs:buffer[di],al ; заносимо в буфер символ
inc di ; інкрементуємо індекс буфера
inc ch ;готуємо наступну координату
cmp ch, cs:kinc_x_m
jz cycle1
cmp cl, cs:kinc_y_m
jz zapus
jmp cycle2
;відкриття файлу, запис даних до нього і закриття
zapus:
push ds ;зберігаємо ds (його зміст буде змінено)
mov ax,cs ;заносимо в ах номер сегменту нашої програми
mov ds,ax ; заносимо це значення в ds(це необхідно для виконання переривання, що
;працює з файлом)
mov ah,3dh ;відкриття файлу
lea dx, cs:file_name ; в dx – адрес строки з назвою файлу
mov al,01h ;в al – режим відкриття (для запису)
int 21h
mov cs:des,ax ;зберігаємо дескриптор файлу в des
mov ah,40h ;запис даних до файлу
mov bx, cs:des ; в bx – дескриптор файлу
lea dx, cs:buffer ; в dx – адрес буферу, що містить інформацію для запису
mov cx, cs:kilk ; в cx – кількість байт, що мають бути записані
int 21h
mov ah,3eh ; закриття файлу
mov bx, cs:des ; в bx – дескриптор
int 21h
mov cs:byte_info,0000h ; обнулюємо байт характеристик
endi:
pop ds ; відновлюємо ds
popa ; відновлюємо регістри оперативного призначення
iret ; передаємо управління перерваній програмі
; функція різниці координат Х по модулю та перестановки їх в змінних
mod_x:
mov cs:poch_x_m,al
mov cs:kinc_x_m,ah
sub ah,al
jmp mod_x_ret
; функція різниці координат У по модулю та перестановки їх в змінних
mod_y:
mov cs:poch_y_m,cl
mov cs:kinc_y_m,ch
sub ch,cl
jmp mod_y_ret
real_start:
mov bx,082h ; заносимо в bx адрес комірки пам’яті, де збережені параметри запуску програми
xor di,di ; обнулюєм індекс di
next_symvol:
mov al,[bx] ;копіюємо символ в al
mov file_name[di],al ; копіюємо символ з al в змінну file_name
inc bx ;готуєм адресу нової комірки пам’яті
inc di ;готуєм нову адресу комірки змінної з іменем файла
test al,0ffh ; al=0?
jz end_name_copy ;якщо так, то перехід на кінець копіювання імені файлу
jmp next_symvol ;копіювання наступного символу
end_name_copy:
push es ;зберігаємо значення регістра es
mov ax,3508h ;в AH – 35h (номер функції отримання вектора)
;в AL - 08 h (номер необхідного перервання)
int 21h
mov old_int8_cs,es ;зберігаємо сегмент в змінній old_int8_cs
mov old_int8_ip,bx ;зберігаємо зміщення в змінній old_int8_ ip
lea dx,interrupt ; DS:DX – нова підпрограма обробки переривання
mov ax,2508h ; AH - 25h номер функції установки вектора
; AL – 08h номер необхідного переривання
int 21h
pop es ;відновлюєм es
lea dx,real_start ;зміщення команди, починаючи з якої пам'ять буде звільнено
int 27h ;передаємо управління DOS
end start
Використана література
Зубков С. В. Assembler для DOS? Windows, UNIX 3-е изд., стер.-М.:ДМК Пресс; СПб.:Питер, 2004.
Системное программное обеспечение. Учебник для вузов/А. Ю. Молчанов.- СПб:Питер, 2003.
Велихов А. В. Макроассемблер: Создание и отладка программ.-м.: Майор, 2001.