Движение точки вверх - вниз - Assembler

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

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

.code         
start:
 
mov ax, 0013h  ; 
int 10h ;
 
;--------------тело проги
 
tochka:
MOV  AH,0ch
mov dx, 100
MOV  CX, 160     ; ставим точку в центр
MOV  AL,14
 
dvigaem: ;метка движения 
mov ah,1 
int 21h 
 
cmp al, 'u'        
je vverh ; при нажатии у -переход на метку вверх
 
cmp al, 'd'     
je vniz ; соответственно вниз
 
loop dvigaem
 
vverh:
MOV  AH,0ch
dec dx
MOV  CX, 160
MOV  AL,14
je dvigaem
 
vniz:
MOV  AH,0ch
inc dx
MOV  CX, 160
MOV  AL,14
je dvigaem

;---------------тело проги
 
mov ah, 0        ; vihod po najatiu
int 16h
 
mov ax, 0003h    ; vozvrat v videorezim
int 10h
 
metka_vihoda :
mov ax, 4c00h ;        2 stroki - vihod iz programmi
int 21h
 
end start
Программа *должна* в 320х200 выводить точку в центр экрана, кнопки U и D - двигать ее вверх и вниз, по нажатию другой кнопки - выходить, однако вместо этого она 1 раз выводит у и 1 раз - Д (если loop перенести после меток движения - начинает выводить все символы и не закрывается вообще), после чего закрывается. Помогите пожалуйста найти ошибку.

Решение задачи: «Движение точки вверх - вниз»

textual
Листинг программы
    .model  tiny
    .386
    .code
    org 100h
begin:
    xor ax, ax
    mov es, ax
    mov AX,13h
    int 10h
 
    MOV     AH,0ch
    mov     dx, 100
    MOV     CX, 160     ; ставим точку в центр
    MOV      AL,14
    int 10h
 
key_loop:
 
    xor ax,ax           ;ждем символ с клавиатуры
    int 16h
    cmp ah,1            ; Нажали Esc?
    je  quit            ; Да, выход
    cmp ah, 16h     ; 'U'
    jz  scrl_up
    cmp ah, 20h     ; 'D'
    jz  scrl_dn
    jmp key_loop
 
scrl_up:
    sub dx, es:[485h]
    pusha
    mov ax, 0601h
scrl:   xor bx, bx
    xor cx, cx
    mov dh,es:[484h]    ; rows
    mov dl,es:[44Ah]    ; columns
    int 10h
    popa
    jmp key_loop
scrl_dn:
    add dx, es:[485h]
    pusha
    mov ax, 0701h
    jmp     scrl
quit:
    mov ax,3
    int 10h
    ret
    end begin

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

Выше представлен код на языке Assembler, который, предположительно, выполняет движение точки вверх и вниз. Список переменных и их значений:

  1. AX — 13h; Начальное значение для точки (13 соответствует символу 'E' в кодировке MSDOS)
  2. DX — 100; Координаты точки (100 соответствует X 100 соответствует Y)
  3. CX — 160; Координаты точки (160 соответствует X 100 соответствует Y)
  4. AL — 14; Код цвета точки (14 соответствует светло-синему цвету)
  5. AH — 0ch; Код функции вывода символа
  6. ES — ax; Сегментный регистр для вывода на экран
  7. BX, CX — 0; Служат для хранения координат курсора (указатель на экран)
  8. DH — 0; Служит для хранения количества строк (0 соответствует одной строке)
  9. DL — 0; Служит для хранения количества столбцов (0 соответствует одному столбцу)
  10. AX — 0601h; Код функции перемещения точки вверх
  11. AX — 0701h; Код функции перемещения точки вниз
  12. AX — 03; Код функции выхода из программы
  13. AX — 0; Служит для хранения количества строк (0 соответствует одной строке)
  14. AX — 0; Служит для хранения количества столбцов (0 соответствует одному столбцу)
  15. AX — 485h; 485h = 1000011110101111
  16. AX — 44Ah; 44Ah = 1000011110101111
  17. AX — 0601h; 0601h = 601
  18. AX — 0701h; 0701h = 701
  19. AX — 03; 03 = 3
  20. AX — 0; 0 = 0

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


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

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

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