Циклическое перемещение курсора - Assembler

Узнай цену своей работы

Формулировка задачи:

Задание: Составить программу для циклического перемещения курсора из позиции (14, 04) в заданную с интервалом 2.5 сек. и обратно. Координаты заданной позиции X и Y ввести с клавиатуры в виде двухзначных чисел. Перемещение сопровождать звуковым сигналом ; прерывание программы - "Esc" Язык программирования -- ассемблер в среде Tasm

Прошу хоть какой-то помощи, т.к. сам в ассемблере "ни в зуб ногой"

.

Решение задачи: «Циклическое перемещение курсора»

textual
Листинг программы
.model small
 
.stack 100h
 
.data
;переменные
        counter         dw      0               ; число вызовов прерывания
        Pos             dw      0
        Xfix            db      14
        Yfix            db      4
        X               db      70
        Y               db      21
        Time2_5sec      equ     27
        kbESC           equ     1Bh
.code
 
; Обработчик прерывания 1Ch (пользовательский обработчик IRQ0)
int1Ch_handler  proc    far
        push    ds
        push    ax
        push    bx
        push    dx
        mov     ax,     @data
        mov     ds,     ax
        dec     word ptr counter     ; увеличить счетчик накоплений
        jnz     @@ToOldInt
        mov     counter,Time2_5sec
        xor     [Pos],  1
        mov     bx,     [Pos]
        add     bx,     bx
 
        mov     ah,     02h
        mov     dl,     Xfix[bx];столбец (от 0)
        mov     dh,     Yfix[bx];строка (от 0)
        mov     bh,     0       ;видеостраница
        int     10h
@@ToOldInt:
        pop     dx
        pop     bx
        pop     ax
        pop     ds
        db      0EAh                    ; команда jmp far
old_int1Ch      dd      0               ; адрес старого обработчика
int1Ch_handler  endp
 
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        ;установка обработчика прерывания
        mov     ax,     351Ch           ; AH = 35h, AL = номер прерывания
        int     21h                     ; получить адрес обработчика
        mov     word ptr cs:old_int1Ch, bx ; и записать его в old_int1Chh
        mov     word ptr cs:old_int1Ch+2, es
        push    ds
        mov     ax,     cs
        mov     ds,     ax
        mov     ax,     251Ch           ; AH = 25h, AL = номер прерывания
        mov     dx, offset cs:int1Ch_handler  ; DS:DX - адрес обработчика
        int     21h                     ; установить обработчик
        pop     ds
 
 
        mov     counter,        Time2_5sec
        mov     ah,     02h
        mov     bh,     0       ;видеостраница
        mov     dl,     [Xfix]  ;столбец (от 0)
        mov     dh,     [Yfix]  ;строка (от 0)
        int     10h
        @@CmdLoop:
 
                mov     ah,     00h
                int     16h
                cmp     al,     kbESC
 
        jnz     @@CmdLoop
 
        ;установка обработчика прерывания
        push    ds
        mov     ax,     251Ch           ; AH = 25h, AL = номер прерывания
        lds     dx,     cs:old_int1Ch   ; DS:DX - адрес обработчика
        int     21h                     ; установить обработчик
        pop     ds
 
 
        mov     ax,     4C00h
        int     21h
main    endp
 
end     main

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

  1. Установка начального значения счётчика
  2. Обработчик прерывания 1Ch (пользовательский обработчик IRQ0)
  3. Установка обработчика прерывания
  4. Запуск цикла перемещения курсора
  5. Остановка цикла перемещения курсора
  6. Установка обработчика прерывания
  7. Код, выполняющийся в бесконечном цикле (пока не будет нажата клавиша ESC)
  8. Код, выполняющийся после нажатия клавиши ESC
  9. Код, выполняющийся при завершении программы

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

10   голосов , оценка 3.7 из 5
Похожие ответы