1. Заголовок или название темы должно быть информативным 2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE] 3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора. 5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM! 6. Проверяйте программы перед тем, как выложить их на форум!!
Так вот=)... 1. Дан произвольный двумерный массив A(N*M). Найти строку с максимальной суммой элементов. 2. Так же дан массив. Найти максимальный элемент кратный 2 и не кратный 5. заранее большое спасибо! :thanks:
Решение первой задачи на Паскале в виде ассемблерной вставки:
program Sol1;
const MaxRows = 100; MaxCols = 100;
type TArray = array[0..MaxRows - 1, 0..MaxCols - 1] of Integer;
function FindRow(const a: TArray; n, m: Integer): Integer; assembler; asm xor ax,ax cmp n,ax { проверка на случай массива нулевого размера } je @@Exit cmp m,ax je @@Exit push ds xor di,di { di = N - <номер искомой строки> } mov bx,-MaxInt { bx = <макс. значение суммы> } lds si,a mov cx,n @@NextRow: push cx xor dx,dx { подсчёт суммы элементов строки } mov cx,m @@NextElem: lodsw add dx,ax loop @@NextElem pop cx mov ax,MaxCols { переход к следующей строке массива } sub ax,n shl ax,1 add si,ax cmp dx,bx jle @@SkipRow xchg bx,dx mov di,cx @@SkipRow: loop @@NextRow mov ax,di { <номер искомой строки> = N - di } neg ax add ax,n pop ds @@Exit: end;
var a: TArray; n, m, i, j: Integer;
begin Write('n>'); Readln(n); Write('m>'); Readln(m); Writeln('Данный массив:'); Randomize; for i := 0 to n - 1 do begin for j := 0 to m - 1 do begin a[i, j] := -9 + Random(19); Write(a[i, j]:3); end; Writeln; end; Writeln;
Writeln('Номер искомой строки: ', FindRow(a, n, m)); end.