Движение слова по нажатию клавиши - Assembler

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

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

Имеется код, нужно дописать его так, чтобы слово Внимание двигалось по нажатию клавиш W,A,S,D. Например, нажимая на клавишу W слово двигается вверх, а когда доходит до верхней части экрана останавливается, аналогично и для других клавиш, движение влево, вниз и вправо
stdin=0
stdout=1
stderr=2
 
data segment
 text1 db 'Внимание!'
 textlen=$-text1
 time dw 10
 vs db 0
 tab1 db '0123456789ABCDEF'
 b1 db 30h
 b2 db 14h
 
data ends
 
code segment
 assume cs:code,ds:data
 
start:
 mov ax,data
 mov ds,ax
vid0:
 mov ah,05h
 mov al,vs
 int 10h
 call video
 mov ah,0h
 int 16h
 cmp al,'1'
 je vid1
 cmp al,'2'
 je vid3
 cmp al,'3'
 je vid4
 cmp al,'4'
 je vid5
 cmp al,'5'
 je vid6
 cmp al,'6'
 jne outg
 jmp vid7
 
outg:
 cmp al,'7'
 jne q1
 jmp vid8
 
q1:
 mov ah,05h
 mov al,0
 int 10h
 mov ah,4ch
 int 21h
 
vid1:
 cmp vs,0
 je vid2
 mov vs,0
 mov b1,30h
 mov b2,14h
 jmp vid0
vid2:
 mov vs,1
 mov b1,0a0h
 mov b2,0e1h
 jmp vid0
vid3:
 mov vs,2
 mov b1,0c0h
 mov b2,0d7h
 jmp vid0
vid4:
 mov vs,3
 mov b1,0b4h
 mov b2,0d2h
 jmp vid0
vid5:
 mov vs,4
 mov b1,0e1h
 mov b2,0f1h
 jmp vid0
vid6:
 mov vs,5
 mov b1,0f7h
 mov b2,0a0h
 jmp vid0
vid7:
 mov vs,6
 mov b1,0f4h
 mov b2,0c0h
 jmp vid0
vid8:
 mov vs,7
 mov b1,0a5h
 mov b2,0f6h
 jmp vid0
 
;изменим цвет экрана
 
video:
 mov ah,06h ;ф-ция инициализации окна
 mov al,0 ;не прокручивать
 mov bh,b1 ;бирюзовый фон
 mov ch,0 ;у-левый верхний
 mov cl,0 ;х-левый верхний
 mov dh,24 ;у-правый нижний
 mov dl,79 ;х-правый нижний
 int 10h
 
;нарисуем пустое окно
 
 mov ah,06h
 mov al,0
 mov bh,b2 ;синий фон красные символы
 mov ch,10
 mov cl,30
 mov dh,14
 mov dl,49
 int 10h
 
;выведем в окно2 текст
 
 mov ax,seg text1 ;подготовим сегментный регистр es
 mov es,ax
 mov ah,13h ;ф-ция вывода строки
 mov al,0 ;режим
 mov bh,vs ;страница
 mov bl,b2 ;атрибуты символов строки
 mov cx,textlen ;длина строки
 mov dh,12 ;y
 mov dl,36 ;x
 mov bp,offset text1 ;адрес строки
 int 10h
 
;выведем в окно1 текст
;установка курсора
 
 mov ah,02h
 mov bh,vs
 mov dh,0
 mov dl,79
 int 10h
 
;вывод номера видеостраницы
 
 mov al,vs
 lea bx,tab1
  xlat
 mov bh,vs
 mov cx,1
 mov ah,0ah
 int 10h
 
;прокрутим окно вверх
 
updown:
 mov ah,06h ;ф-ция прокрутки вверх
 mov al,1 ;прокрутить на одну строку
 mov bh,b2 ;теже атрибуты
 mov ch,11 ;у-левый верхний
 mov cl,31 ;х-левый верхний
 mov dh,13 ;у-правый нижний
 mov dl,48 ;х-правый нижний
 int 10h
 call delay
 
;прокрутим окно вниз
 
 mov ah,07h ;ф-ция прокрутки вниз
 mov al,1
 mov bh,b2
 mov ch,11
 mov cl,31
 mov dh,13
 mov dl,48
 int 10h
 call delay
 
;анализ нажатия клавиши
 
 mov ah,01h
 int 16h
 jnz v1
 jmp updown
v1:
 ret
delay:
 
;небольшая задержка
 
 push cx
 mov cx,time
outer:
 push cx
 xor cx,cx
inner:
 loop inner
 pop cx
 loop outer
 pop cx
 ret
code ends
 
stack1 segment
 db 128 (?)
stack1 ends
end start

Решение задачи: «Движение слова по нажатию клавиши»

textual
Листинг программы
stdin=0
stdout=1
stderr=2
          
data segment
 text1 db 'Warning!'
 textlen=$-text1
 time dw 10
 vs db 0
 tab1 db '0123456789ABCDEF'
 b1 db 30h
 b2 db 14h
 PtrS  dw 1000
 Place db "            "
 Attan db "ouuuuuuushit"   
data ends
           
code segment
 assume cs:code,ds:data    
 
start:
     mov ax,0B800h
     mov es,ax
@main:     
     call saveScr
     call PutStr
@Ink:
     xor  ax,ax
     int  16h
     cmp  al,27
     je   @Stop
     cmp  ah,48h
     je   @Up
     cmp  ah,50h
     je   @Down
     cmp  ah,4bh
     je   @Left
     cmp  ah,4dh
     je   @Right
     jmp  @Ink
@Up:
     call RestScr
     mov  ax,PtrS
     sub  ax,160
     jl   @main
     mov  PtrS,ax     
     jmp  @main
@Down:
     call RestScr
     mov  ax,PtrS
     add  ax,160
     cmp  ax,4000
     jg   @main
     mov  PtrS,ax     
     jmp  @main
@Left:
     call RestScr
     mov  ax,PtrS
     sub  ax,2
     mov  PtrS,ax     
     jmp  @main
@Right:
     call RestScr
     mov  ax,PtrS
     add  ax,2
     mov  PtrS,ax     
     jmp  @main
@Stop:
     int  20h          
     
SaveScr:
     push ax
     push cx
     push di
     push si
     mov  cx,18
     lea  si,Place
     mov  di,PtrS
@0:     
     mov  al,es:[di]
     mov  ds:[si],al
     inc  si
     inc  di
     loop @0      
     pop  si
     pop  di
     pop  cx
     pop  ax
     ret
     
RestScr:
     push ax
     push cx
     push di
     push si
     mov  cx,18
     lea  si,Place
     mov  di,PtrS
@1:     
     mov  al,ds:[si]
     mov  es:[di],al
     inc  si
     inc  di
     loop @1      
     pop  si
     pop  di
     pop  cx
     pop  ax
     ret
     
PutStr:  
     push ax
     push cx
     push di
     push si
     mov  cx,9
     lea  si,Attan
     mov  di,PtrS
@2:     
     mov  al,ds:[si]
     mov  es:[di],al
     inc  si
     inc  di
     mov  es:[di],byte ptr 3Eh
     inc  di
     loop @2      
     pop  si
     pop  di
     pop  cx
     pop  ax
     ret     
end start
 
   
code ends
 
stack1 segment
 db 128 (?)
stack1 ends

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

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