Ошибка в коде, посмотрите пожалуйста - Assembler

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

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

задание : Заполнить экран произвольной информацией. Перехватить прерывание 1Ch, по нажатию клавиши ‘1’ осуществить горизонтальный скроллинг всего экрана влево на один столбец, при нажатии клавиши ‘2’ скроллинг вправо на один столбец. очень долго заполняет страницу, как ускорить процесс?
.model small,c
.data
action      db 0
msg1        db 13,10,'Press Esc to exit',13,10,'$'
 
.stack 256
.code
 
start:
    mov ax,@data        
    mov ds,ax
    mov ah,9        
    lea dx,msg1     
    int 21h         
    mov ax,351ch        
    int 21h
    mov word  ptr  cs:Old1c,BX  
    mov word  ptr  cs:Old1c+2,ES
    mov ax,251ch        
    push ds         
    push cs
    pop ds          
    mov dx,offset  New1cObrab   
    int 21h             
    pop ds          
    mov ax,3
    int 10h         
    mov ax,0b800h
    mov es,ax       
    mov ah,15       
    xor di,di       
    mov al,0        
    mov cx,2000     
l1: stosw           
    inc al          
    loop l1                 
l2: cmp action,-1       
    jz ex           
    cmp action,1        
    jz left         
    cmp action,2        
    jz right        
    jmp l2          
left:   mov bx,0        
l4: mov dx,es:[bx]      
    mov cx,79       
l3: mov ax,es:[bx+2]    
    mov es:[bx],ax      
    add bx,2        
    loop l3         
    mov es:[bx],dx      
    add bx,2        
    cmp bx,4000     
    jb l4           
    mov action,0        
    jmp l2          
right:  mov bx,0        
l14:    add bx,79*2     
    mov dx,es:[bx]      
    mov cx,79       
l13:    mov ax,es:[bx-2]    
    mov es:[bx],ax      
    sub bx,2        
    loop l13        
    mov es:[bx],dx      
    add bx,160      
    cmp bx,4000     
    jb l14      
    mov action,0        
    jmp l2          

ex: mov ax,251ch        
    lds dx,cs:old1c     
    int 21h         
    mov ax,4c00h    
    int 21h
Old1c   dd  ?      
New1cObrab  proc        
    pushf           
    call    dword   ptr CS:[Old1c]  
    cli 
    push ds         
    push ax
    mov ax,@data
    mov ds,ax       
    mov ah,1        
    int 16h         
    jz ex1c         
    mov ah,0        
    int 16h         
    cmp al,27       
    jnz nesc
    mov action,-1       
    jmp ex1c        
nesc:   cmp al,'1'      
    jb ex1c         
    cmp al,'2'                
    ja ex1c                  
    sub al,'0'      
    mov action,al       
ex1c:   pop ax      
    pop ds
    sti 
    iret            
New1cObrab endp
end start
и после того как экран заполнится, не реагирует на нажатие клавиш 1 и 2

Решение задачи: «Ошибка в коде, посмотрите пожалуйста»

textual
Листинг программы
l2: cmp action,-1       
    jz ex           
    cmp action,1        
    jz left         
    cmp action,2        
    jz right        
    jmp l2

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

  1. l2 - это метка цикла.
  2. action - это переменная, которая сравнивается со значениями в инструкциях cmp.
  3. -1, 1 и 2 - это константы, с которыми сравнивается переменная action.
  4. ex, left и right - это метки, на которые происходит переход в зависимости от результата сравнения.
  5. jz и jmp - это команды перехода, которые используются для управления потоком выполнения программы.
  6. Цикл выполняется до тех пор, пока не будет достигнута конечная метка l2. Список действий в коде:
  7. Сравнить action с -1.
  8. Если action равно -1, перейти на метку ex.
  9. Сравнить action с 1.
  10. Если action равно 1, перейти на метку left.
  11. Сравнить action с 2.
  12. Если action равно 2, перейти на метку right.
  13. Перейти на метку l2, чтобы начать цикл заново.

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

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