Другие языки программирования и технологии

Нужна программа на Ассемблере [Assembler, SOS =D]

1. Определить имеются ли в массиве три подряд стоящих числа, упорядоченных по убыванию. Отпечатать их значения и порядковые номера.

2. Для каждой строки прямоугольной целочисленной матрицы определить сумму ее положительных элементов. После чего строку с минимальной суммой таких элементов обнулить. [С обнулением не вопрос, остальное не помню точно, конспектов нет. К тому же нет MPLAB IDE =D]
AR
Abdulloh Roziev
511
1ая. SASM IDE (NASM + макросы для вывода), на базе Linux, но с миним. переделками заработает в винде
----
%include "io.inc"

section .data
arr dd 1,2,7,3,2,1,8 ; массив чисел
arrEnd:

section .text

global CMAIN
CMAIN:
mov ecx, (arrEnd - arr) / 4 ; cx = кол-ву элементов массива (4 - размер dd)
cmp ecx, 3 ; их меньше 3?
jb @@exit ; сразу на выход

cld ; Флаг для lodsd, двигаемся "вперед"
mov esi, arr ; esi указывает на начало массива
jmp @@firstRun ; прыгаем на метку "первый заход"

@@nextNumber: ; цикл по числам
mov ebx, eax ; запоминаем в ebx предыдущее число
lodsd ; загружаем в eax очередное число
cmp eax, ebx ; сравниваем с предыдущим
jb @@skipZero ; меньше - пропускаем обнуление счетчика
@@firstRun:
xor edx, edx ; обнуляем счетчик чисел
@@skipZero:
inc edx ; увеличиваем счетчик чисел
cmp edx, 3 ; дошел до 3?
je @@foundSeq ; если да - выходим из цикла и запускаем вывод
loop @@nextNumber ; крутим цикл
jmp @@exit ; если не нашли такую последов. - на выход

@@foundSeq:
mov ecx, 3 ; иначе ecx = 3 = колву чисел
sub esi, 3*4 ; сдвигаемся на 3 числа левее (4 = размер dd)
mov ebx, esi ; ebx = смещению
sub ebx, arr ; вычитаем из ebx смещение начала массива
shr ebx, 2 ; получаем из результата индекс в массиве (деля на 4)

@@nextSeqNumber: ; цикл для вывода этих трех чисел
lodsd ; загружаем в eax число
call printDigit ; вызываем процедуру вывода числа
mov eax, ebx ; eax = индексу
call printDigit ; вызываем процедуру вывода числа
inc ebx ; увеличиваем индекс
loop @@nextSeqNumber ; крутим цикл

@@exit:
xor eax, eax ; обнуляем
ret ; выходим из программы

printDigit: ; вспомогательная процедура вывода числа на экран
PRINT_DEC 4, eax ; выводим само число
NEWLINE ; выводим перевод строки
ret ; конец процедуры
---
Вывод - число на след. строке индекс (начинается с 0)
VG
Vova Gordiy
84 764
Лучший ответ
Vova Gordiy Блин не успел подправить =)
%include "io.inc"

section .data
arr dd 7,2,1,3,2,1,8 ; массив чисел
arrEnd:

section .text

Лучше так - фрагмент в начале после jb @@exit до @@nextNumber меняем на
cld ; Флаг для lodsd, двигаемся "вперед"
mov esi, arr ; esi указывает на начало массива
lodsd ; получаем первое число
xor edx, edx ; обнуляем счетчик
inc edx ; увеличиваем на 1
---
убираем метку @@firstRun
Vova Gordiy имхо xor edx, edx; inc edx лучше чем mov edx, 1
"С обнулением не вопрос", а с остальным какие сложности? Уж извини, быстрее всё же пару часов потратить, дабы восстановить и решить самому для своего другана
Коледин Антон
Коледин Антон
57 089
вы меня прямо пугаете своим подходом к асму.
Никто не указывает целевую систему.
при чём тут MPLAB IDE? Прога нужна под конкретную микросхему?
Павел *
Павел *
36 571
Abdulloh Roziev Да мы его разбирали всего пол года, и то.... препод сказал, что ему до лампочки мы. Потом курсач сдали, и забыли эту тему вообще.
А тут друг с универа кинул задание. С методичек. Я если честно подобные не разбирал. Мы настраивали порты вводов/выводов, считали однобайтные/двухбайтные/трехбайтные числа, и настройку АЦП производили. Все, массивы проскочили, как и ещё 4 темы. С массивами только в Delphi работали, и то давно.

А прога, я просто привык с ней работать. Там я хотя бы могу проверить все. А не просто начеркать в блокноте. Прогу найти не проблема, проблема в том, что я и половину уже не помню)
мплаб тут вообще при чем?
Abdulloh Roziev В этой среде программировали