Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Возведение матрицы в квадрат Pascal + ASM


Автор: rafic 14.4.2012, 23:26
Задача описана в названии темы. 
Я вот накидал тут что смог: 
Код

program kursach;
 
uses crt;
 
const
     max=4;
var
   Elements: array[1..max,1..max] of shortint;
 
   row,
   column,
   k,
   countRows,
   countColumns: integer;
 
begin
 
     clrscr;
 
     write('Count rows: ');
     readln(countRows);
 
     write('Count columns: ');
     readln(countColumns);
 
     writeln('Enter elements:');
 
     for row:=1 to countRows do
     begin
          for column:=1 to countColumns do
          begin
               write('Element[',row,',',column,']= ');
               readln(Elements[row,column]);
          end;
     end;
 
asm
 
   mov row, 0
   mov column, 0
   mov si, countRows
   mov bp, countColumns
 
   @@row:
 
         @@column:
            { Elements[countColumns*row+column]*4 }
 
             cmp column, bp
             inc column
         jl @@column
 
       cmp row, si
       inc row
   jl @@row
end;
 
 
     writeln;
     writeln('Square matrix:');
 
     for row:=1 to countRows do
     begin
        for column:=1 to countColumns do
            write(Elements[row,column],' ');
 
        writeln;
    end;
 
    readln;
end.

но столкнулся с ошибкой в которой сказано что в строке { Elements[countColumns*row+column]*4 } выделенное жирным место является неверным синтаксисом.

Ну и вообще я никогда не писал на связке паскаль и АСМ, и прошу подсказать как записывать результаты в конечный массив?
Адрес памяти высчитывать планирую по формуле
Код

baseName[countColunms*row+column]*4

Словесно: имя_массива(количество элементов в строке * текущая строка + номер элемента в данной строке) * на 4 (размер памяти под один элемент)

в общем... как-то так. 

1) Как обратится к элементу массива в таком коде?
2) Как записывать конечный результат в конечный массив элемент через mov? mov baseName[countColunms*row+column]*4, currentValue
3) Как умножать и складывать элементы массива? через imul?

Автор: iff 15.4.2012, 17:34
1) shortint - 1 байт.
2) т.к. row и column - не константы, не регистры, а переменные, то обращение типа baseName[countColunms*row+column] невозможно.
3) инструкцией mov можно записать результат в массив, но из регистра или непосредственно константу.
4) для разных типов данных можно использовать разные инструкции умножения. Для целых знаковых - действительно imul.

Автор: 500mhz 17.4.2012, 12:35
Цитата

 mov row, 0
 mov column, 0


не знаю как там в паскале но мне кажется нужно так
Цитата

 mov [row], 0
 mov [column], 0

Автор: iff 17.4.2012, 20:40
Код

mov di, Offset Elements
mov cx, Max * Max
@rep1:
mov al, [di]
imul al
mov [di], al
inc di
loop @rep1

вместо imul можно просто mul, результат одинаковый, т.к. получаться вегда (если нет переполнения) будут тольуо положительные числа.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)