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