Работа с матрицей! - Assembler

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

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

Здравствуйте! Помогите мне решить следующую задачу, ибо я не имею ни малейшего представления как создать и обработать матрицу в ассемблере. Дана следующая задача: Дана квадратная матрица a11 a12 ... a1n a21 a22 ... a2n A = ...................... an1 an2 ann Если в і-ой строке матрицы элемент на главной диагонали аn<0, то все элементы этой строки заменить числом -1, Если аn=0, то все элементы строки заменить нулями, Если аn>0 то все элементы строки заменить числом +1.
Есть условие, что для циклических действий нужно использовать команды LOOP,LOOPE,LOOPNE

Решение задачи: «Работа с матрицей!»

textual
Листинг программы
code segment
    start:
        assume ds: data, ss: segst, cs: code, es: noting
        mov AX, data;
        mov DS, AX;
                
        mov CX, n        
        for:     
          mov last, CX
          mov AX, str
          imul n
          add AX,str
          
          mov SI, AX
          cmp A[SI], 0
          je zero
          jg bolshe
           mov BX, -1
           jmp ok 
           
          zero:
            mov BX, 0
            jmp ok
          bolshe:   
            mov BX, 1  
          ok:
          
           mov AX, str   ;Ax = 0
           imul n
           mov SI, AX
           mov CX, n   ;count operation
           m1: 
             mov A[SI], BX  ;write string    BX
             add SI, 2
           loop m1 ;if CX!=0 CX-1, if CX==0 exit
                     
          mov AX, str
          add AX, 2
          mov str, AX  
          mov CX, last        
        loop for    ;when cx = 0, sub x for 1
        
        mov AX, 4c00h ; exit to operating system  
        int 21h
code ends

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

Список действий в коде:

  1. Код начинает работу с сегмента start
  2. Переменная AX получает значение data, а переменная DS получает значение AX
  3. Переменная CX получает значение n
  4. Происходит цикл for, который выполняет следующие действия:
    • Переменная last получает значение CX
    • Переменная AX получает значение str
    • Производится операция умножения imul n с переменной AX
    • К переменной AX прибавляется значение str
    • Переменная SI получает значение AX
    • Происходит сравнение A[SI], 0
    • Если A[SI] == 0, то выполняется действие в блоке zero, иначе в блоке bolshe
    • В блоке zero переменной BX присваивается значение 0 и происходит выход из блока ok
    • В блоке bolshe переменной BX присваивается значение 1 и происходит выход из блока ok
    • Переменная AX получает значение str
    • Переменная CX получает значение n
    • Начинается цикл m1, который выполняет следующие действия:
      • Каждое значение BX записывается в массив A[SI]
      • Значение SI увеличивается на 2
      • Цикл продолжается, пока значение CX не станет равным 0
    • Переменная AX получает значение str
    • Значение AX увеличивается на 2
    • Переменная str получает значение AX
    • Переменная CX получает значение last
  5. Выполняется команда exit to operating system с кодовым значением 4c00h
  6. Происходит ввод/вывод с помощью функции int 21h Значения переменных:
    • data - сегмент данных
    • n - количество элементов в массиве
    • str - адрес строки, которую необходимо обработать
    • last - значение CX перед началом цикла for
    • BX - используется в качестве временной переменной для хранения значения 0 или 1
    • A[SI] - используется для хранения значений из массива A
    • OK - метка выхода из цикла for
    • ZERO - метка выхода из блока zero
    • BOLSZE - метка выхода из блока bolshe
    • M1 - метка цикла, выполняющего запись значений в массив A
    • AX - используется в качестве временной переменной для хранения значения str
    • DS - сегмент данных
    • CS - сегмент кода
    • SS - сегмент стека
    • ES - сегмент дополнительного стека
    • INT 21H - функция ввода/вывода, используемая для выхода из программы

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

10   голосов , оценка 4.1 из 5