Вывод побочной диагонали, ассемблер - 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

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

  1. Код написан на ассемблере и предназначен для вывода побочной диагонали.
  2. Переменные n и m задают размеры массива (4 и 3 соответственно).
  3. В блоке begin: происходит вывод сообщения с просьбой ввести данные.
  4. Далее идет ввод n строк по m чисел с помощью процедуры inpNum.
  5. После ввода чисел происходит вывод побочной диагонали с помощью процедуры outNum.
  6. Переменная cx используется как счетчик для внешнего цикла, а si - для внутреннего.
  7. Процедура inpNum обрабатывает ввод одного числа, проверяет корректность ввода и сохраняет число в переменной si.
  8. Процедура outNum выводит числа из стека, формируя строку.
  9. Массив dbArray инициализируется символами ?.
  10. В конце кода происходит вывод сообщения с помощью команды int 21h.

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


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

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

15   голосов , оценка 4.067 из 5