Работа с матрицей! - 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
Объяснение кода листинга программы
Список действий в коде:
- Код начинает работу с сегмента
start
- Переменная
AX
получает значениеdata
, а переменнаяDS
получает значениеAX
- Переменная
CX
получает значениеn
- Происходит цикл
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
- Переменная
- Выполняется команда
exit to operating system
с кодовым значением 4c00h - Происходит ввод/вывод с помощью функции
int 21h
Значения переменных:data
- сегмент данныхn
- количество элементов в массивеstr
- адрес строки, которую необходимо обработатьlast
- значениеCX
перед началом циклаfor
BX
- используется в качестве временной переменной для хранения значения 0 или 1A[SI]
- используется для хранения значений из массиваA
OK
- метка выхода из циклаfor
ZERO
- метка выхода из блокаzero
BOLSZE
- метка выхода из блокаbolshe
M1
- метка цикла, выполняющего запись значений в массивA
AX
- используется в качестве временной переменной для хранения значенияstr
DS
- сегмент данныхCS
- сегмент кодаSS
- сегмент стекаES
- сегмент дополнительного стекаINT 21H
- функция ввода/вывода, используемая для выхода из программы