Вывод побочной диагонали, ассемблер - Assembler
Формулировка задачи:
Здравствуйте. Столкнулась с такой проблемой: при выполнение кода на ассемблере, выбивает ошибку: this interrupt is not defined yet, it is available for custom functions. you can define this interrupt by modifying interrupt vector table reffer to the list of supported interrupts and global memory table.
Вроде бы все понятно, но исправить ошибку не могу. Вообще не понимаю как определить прерывание в векторной таблице и на какое именно прерывание оно ругается. Код прикреплю ниже.
Объясните, пожалуйста, кому не сложно, на какое прерывание ругается и как это исправить
Код:
.model tiny .code ORG 100h begin: JMP start start: MOV AH,9 ; запрос на ввод.. MOV DX, offset mess0 INT 21h MOV DI, offset buff ; в DI будем писать STOSB'ом MOV BX,4 ; счётчик строк MOV DX,4 ; счётчик чисел в строке create: ;<=====; начинаем ввод и сохранение ================// MOV CX,2 ; ограничим число 2-мя знаками DEC DX ; уменьшаем счётчик чисел @1: MOV AH,1 ; ввод с эхо.. INT 21h STOSB ; сохраняем первый символ в DI LOOP @1 ; ..следом второй. MOV AL,' ' ; пробел/разделитель INT 29h STOSB ; его тоже в DI.. OR DX,DX ; последнее число в строке? JNZ create ; нет - заполняем строку дальше MOV AH,9 ; строка закончилась.. MOV DX,offset crlf ; новая строка! INT 21h DEC BX ; уменьшаем счётчик строк OR BX,BX ; последняя строка? JZ next ; да - выходим из цикла ввода MOV DX,4 ; восстанавливаем кол-во чисел в строке JMP create ; заполняем следующую строку массива next: ;<=====; выводим результат на экран ================// MOV AH,9 ; мессага.. MOV DX, offset mess1 INT 21h MOV CX,4 ; сколько пар цифр выводить MOV SI, offset buff ; источник - буфер print: LODSB ; читаем первый символ INT 29h ; выводим его на экран LODSB ; второй символ.. INT 29h LODSB ; прихватим с собой пробел INT 29h ADD SI,12 ; передвинем указатель на 4 триады символов LOOP print ; мотаем цикл пока СХ > 0 exit: ; выход! XOR AX,AX INT 16h INT 20h ret mess0 DB 'CREATE ARRAY...',13,10 DB '====================',13,10,'$' mess1 DB '====================',13,10 DB 'RESULT: $' crlf DB 13,10,'$' buff DB 80 DUP(0) ; буфер для выхлопа end begin
Решение задачи: «Вывод побочной диагонали, ассемблер»
textual
Листинг программы
model tiny .code org 100h n equ 4 m equ 3 begin: mov ah,9;выводим сообщение lea dx,dbInp int 21h lea di,dbArray;адрес массива lea si,dbArray+1;адрес массива mov bx,10;система счисления mov cx,n;количество строк @@01: push cx; mov cx,n;количество столбцов @@02: call inpNum;вводим число stosb;записываем mov al,' ';выводим пробел int 29h;как исправить Вы знаете loop @@02; mov al,10;переводим строку int 29h mov al,13 int 29h pop cx;востанавливаем внешний цикл loop @@01 mov ah,9;выводим сообщение lea dx,dbOut int 21h mov cx,n;количество чисел @@03: add si,n-2;следеющий адрес побочной диагонали xor ah,ah lodsb;читаем call OutNum;выводим loop @@03 xor ax,ax int 16h ret ; dbInp db 10,13,'Create array',10,13,'$' dbOut db 10,13,'Result:$' ; inpNum proc push cx push si xor cx,cx;число цифр xor si,si;тут будет число i01: xor ax,ax;вводим без эхо int 16h cmp al,13;конец ввода jz i02 cmp al,' ';конец ввода jz i02 cmp al,'0';проверяем цифру jb i01 cmp al,'9';проверяем цифру ja i01 cmp cx,m-1;проверяем количество цифр jz i01 int 29h;выводим введенную цифру inc cx;увеличиваем количество цифр and ax,0fh;переводим в число символ xchg ax,si;меняем уже введенное и сейчас xor dx,dx mul bx;освобождаем место для введенной add si,ax;суммируем jmp i01 i02: mov ax,si;число в АХ pop si pop cx ret inpNum endp ; outNum proc push cx xor cx,cx;количество цифр в стеке o01: xor dx,dx div bx;получаем младшую цифру or dl,'0';переводим в символ inc cx;считаем стек push dx;запоминаем в стеке цифру or ax,ax;пока не ноль jnz o01 mov al,' ';выравнивающий пробел o02: inc cx;считаем пока не выровняли push ax;запомием в стеке cmp cx,m;пока не выровняли jnz o02 o03: pop ax;извлекаем из стека int 29h;выводим loop o03 pop cx ret outNum endp dbArray db n*n dup(?) end begin
Объяснение кода листинга программы
- Код написан на ассемблере и предназначен для вывода побочной диагонали.
- Переменные
n
иm
задают размеры массива (4 и 3 соответственно). - В блоке
begin:
происходит вывод сообщения с просьбой ввести данные. - Далее идет ввод n строк по m чисел с помощью процедуры
inpNum
. - После ввода чисел происходит вывод побочной диагонали с помощью процедуры
outNum
. - Переменная
cx
используется как счетчик для внешнего цикла, аsi
- для внутреннего. - Процедура
inpNum
обрабатывает ввод одного числа, проверяет корректность ввода и сохраняет число в переменнойsi
. - Процедура
outNum
выводит числа из стека, формируя строку. - Массив
dbArray
инициализируется символами?
. - В конце кода происходит вывод сообщения с помощью команды
int 21h
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д