Работа с дисплеем и прерыванием - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д