Ошибка в коде, посмотрите пожалуйста - 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
Объяснение кода листинга программы
l2
- это метка цикла.action
- это переменная, которая сравнивается со значениями в инструкцияхcmp
.-1
,1
и2
- это константы, с которыми сравнивается переменнаяaction
.ex
,left
иright
- это метки, на которые происходит переход в зависимости от результата сравнения.jz
иjmp
- это команды перехода, которые используются для управления потоком выполнения программы.- Цикл выполняется до тех пор, пока не будет достигнута конечная метка
l2
. Список действий в коде: - Сравнить
action
с-1
. - Если
action
равно-1
, перейти на меткуex
. - Сравнить
action
с1
. - Если
action
равно1
, перейти на меткуleft
. - Сравнить
action
с2
. - Если
action
равно2
, перейти на меткуright
. - Перейти на метку
l2
, чтобы начать цикл заново.