Работа с дисплеем и прерыванием - 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

Объяснение кода листинга программы

  1. Переменная saveMode используется для хранения видеорежима.
  2. Переменные x и y используются для определения позиции курсора на экране.
  3. Переменная stp используется для определения количества строк текста, которые нужно вывести.
  4. Цикл начинается с метки cucl и повторяется до тех пор, пока значение переменной stp больше нуля.
  5. Внутри цикла устанавливается курсор в позицию, определенную переменными x и y, и выводится текст символом al с атрибутом bl.
  6. После каждой итерации цикла значение переменной x увеличивается на 1, чтобы перейти на следующую строку.
  7. Значение переменной stp уменьшается на 1 после каждой итерации цикла.
  8. Если значение переменной stp равно нулю, цикл завершается.
  9. После завершения цикла начинается новый цикл с метки cocl, который повторяется аналогично первому циклу.
  10. Затем начинается цикл с метки cacl, который повторяется аналогично предыдущим циклам.
  11. Последний цикл начинается с метки cecl и повторяется до тех пор, пока значение переменной stp больше нуля.
  12. Код завершается меткой end main.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.375 из 5