Работа с дисплеем и прерыванием - Assembler
Формулировка задачи:
Необходимо задать три колонки символов в правой части экрана и задать их перемещение в левую часть экрана.
Получилось создать только три строки с стремя символами, и по центру, помогите создать колонки, и задать перемещение, буду очень благодарен.
.model small ; модель памяти .stack 100h ; стек памяти .386 .data ; сегмент данных saveMode db ? ; переменная видеорежим x db 70 ; строка y db 70 ; столбец stp db 0 ; кол-во строк текста .code main: mov x,10 ; 10 строка mov y,34 ; столбец mov stp,3 ; 3 строк текста mov ah,0Fh int 10h ; прерывание bios mov saveMode,al mov ah,00 ; установка видео режима mov al,02 ; номер режима 80 х 25 чёрно-белый текстовый int 10h ; прерывание bios cucl: mov ah,2 ; Запрос на установку курсора mov bh,0 ; экран 0 mov dh,x ; строка x mov dl,y ; столбец y int 10h ; прерывание bios ;---------вывод на экран------------------------------------------ mov ah,09 mov al,24 ; выводимый символ mov bl,0F0H ; атрибут мерцание mov cx,3 ; повтор в строке int 10h ; прерывание bios ;---------------------------------------------------------------------- inc x ; переход на следующую строку dec stp ; уменьшаем кол-во шагов цикла на 1 cmp stp,0 ja cucl ; пока a>0 переход на cucl ;------------------------------------------------------------------------------------ end main
Получилось создать колонки, но необходимо теперь назначить перемещение, с правой части на левую, но у меня изначально она стоит слева, помогите пожалуйста разобраться с размещением на экране.
.model small
.stack 100h
.data
str1 db "1111111 2222222 3333333", 0Dh, 0Ah, "$"
str2 db "1111111 2222222 3333333", 0Dh, 0Ah, "$"
str3 db "1111111 2222222 3333333", 0Dh, 0Ah, "$"
x equ 80
y equ 25
.code
print:
push dx
mov ah, 09h
lea dx, str1
int 21h
lea dx, str2
int 21h
lea dx, str3
int 21h
pop dx
ret
clrscr:
push ax
push cx
push dx
mov ax, 0600h
mov bh, 07
xor cx, cx
mov dh, y - 80
mov dl, x - 80
int 10h
pop dx
pop cx
pop ax
ret
setcursor:
push ax
push bx
mov ah, 02h *
mov bh, 0
int 10h
pop bx
pop ax
ret
main:
mov ax, @data
mov ds, ax
mov es, ax
xor dx, dx
cycle:
call setcursor
call clrscr
call print
inc dh
cmp dh, y - 2
jb cycle
call sleep
exit:
mov ax, 4c00h
int 21h
end mainРешение задачи: «Работа с дисплеем и прерыванием»
textual
Листинг программы
.model small ; модель памяти .stack 100h ; стек памяти .386 .data ; сегмент данных saveMode db ? ; переменная видеорежим x db 0 ; строка y db 0 ; столбец stp db 0 ; кол-во строк текста ;--------СЕГМЕНТ КОДА---------------------------------------------------------- .code main: ;---------получитьвидео-режим------------------------------ mov ah,0Fh int 10h ; прерывание bios mov saveMode,al mov ah,00 ; установка видео режима mov al,02 ; номер режима 80 х 25 чёрно-белый текстовый int 10h ; прерывание bios ;--------ЦИКЛ--------------------------------------------------------------------- mov x,0 ; 10 строка mov y,60 ; 34 столбец mov stp,5 ; 5 строк текста cucl: ;---------установка курсора------------------------------------- mov ah,2 ; Запрос на установку курсора mov bh,0 ; экран 0 mov dh,x ; строка x mov dl,y ; столбец y int 10h ; прерывание bios ;---------вывод на экран------------------------------------------ mov ah,09 mov al,03H ; выводимый символ mov bl,0F0H ; атрибут мерцание mov cx,2 ; повтор в строке int 10h ; прерывание bios ;---------------------------------------------------------------------- inc x ; переход на следующую строку dec stp ; уменьшаем кол-во шагов цикла на 1 cmp stp,0 ja cucl ; пока a>0 переход на cucl ;------------------------------------------------------------------------------------ mov x,0 ; 10 строка mov y,62 ; 34 столбец mov stp,5 ; 5 строк текста cocl: ;---------установка курсора------------------------------------- mov ah,2 ; Запрос на установку курсора mov bh,0 ; экран 0 mov dh,x ; строка x mov dl,y ; столбец y int 10h ; прерывание bios ;---------вывод на экран------------------------------------------ mov ah,09 mov al,32 ; выводимый символ mov bl,2 ; атрибут мерцание mov cx,2 ; повтор в строке int 10h ; прерывание bios inc x ; переход на следующую строку dec stp ; уменьшаем кол-во шагов цикла на 1 cmp stp,0 ja cocl ; пока a>0 переход на cucl mov x,0 ; 10 строка mov y,64 ; 34 столбец mov stp,5 ; 5 строк текста cacl: ;---------установка курсора------------------------------------- mov ah,2 ; Запрос на установку курсора mov bh,0 ; экран 0 mov dh,x ; строка x mov dl,y ; столбец y int 10h ; прерывание bios ;---------вывод на экран------------------------------------------ mov ah,09 mov al,03H ; выводимый символ mov bl,0F0H ; атрибут мерцание mov cx,2 ; повтор в строке int 10h ; прерывание bios ;---------------------------------------------------------------------- inc x ; переход на следующую строку dec stp ; уменьшаем кол-во шагов цикла на 1 cmp stp,0 ja cacl ; пока a>0 переход на cucl mov x,0 ; 10 строка mov y,66 ; 34 столбец mov stp,5 ; 5 строк текста cycl: ;---------установка курсора------------------------------------- mov ah,2 ; Запрос на установку курсора mov bh,0 ; экран 0 mov dh,x ; строка x mov dl,y ; столбец y int 10h ; прерывание bios ;---------вывод на экран------------------------------------------ mov ah,09 mov al,32 ; выводимый символ mov bl,2 ; атрибут мерцание mov cx,2 ; повтор в строке int 10h ; прерывание bios inc x ; переход на следующую строку dec stp ; уменьшаем кол-во шагов цикла на 1 cmp stp,0 ja cycl ; пока a>0 переход на cucl mov x,0 ; 10 строка mov y,68 ; 34 столбец mov stp,5 ; 5 строк текста cecl: ;---------установка курсора------------------------------------- mov ah,2 ; Запрос на установку курсора mov bh,0 ; экран 0 mov dh,x ; строка x mov dl,y ; столбец y int 10h ; прерывание bios ;---------вывод на экран------------------------------------------ mov ah,09 mov al,03H ; выводимый символ mov bl,0F0H ; атрибут мерцание mov cx,2 ; повтор в строке int 10h ; прерывание bios ;---------------------------------------------------------------------- inc x ; переход на следующую строку dec stp ; уменьшаем кол-во шагов цикла на 1 cmp stp,0 ja cecl ; пока a>0 переход на cucl end main
Объяснение кода листинга программы
- Переменная
saveModeиспользуется для хранения видеорежима. - Переменные
xиyиспользуются для определения позиции курсора на экране. - Переменная
stpиспользуется для определения количества строк текста, которые нужно вывести. - Цикл начинается с метки
cuclи повторяется до тех пор, пока значение переменнойstpбольше нуля. - Внутри цикла устанавливается курсор в позицию, определенную переменными
xиy, и выводится текст символомalс атрибутомbl. - После каждой итерации цикла значение переменной
xувеличивается на 1, чтобы перейти на следующую строку. - Значение переменной
stpуменьшается на 1 после каждой итерации цикла. - Если значение переменной
stpравно нулю, цикл завершается. - После завершения цикла начинается новый цикл с метки
cocl, который повторяется аналогично первому циклу. - Затем начинается цикл с метки
cacl, который повторяется аналогично предыдущим циклам. - Последний цикл начинается с метки
ceclи повторяется до тех пор, пока значение переменнойstpбольше нуля. - Код завершается меткой
end main.