1. Определить имеются ли в массиве три подряд стоящих числа, упорядоченных по убыванию. Отпечатать их значения и порядковые номера.
2. Для каждой строки прямоугольной целочисленной матрицы определить сумму ее положительных элементов. После чего строку с минимальной суммой таких элементов обнулить. [С обнулением не вопрос, остальное не помню точно, конспектов нет. К тому же нет MPLAB IDE =D]
Другие языки программирования и технологии
Нужна программа на Ассемблере [Assembler, SOS =D]
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)

----
%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)

"С обнулением не вопрос", а с остальным какие сложности? Уж извини, быстрее всё же пару часов потратить, дабы восстановить и решить самому для своего другана
вы меня прямо пугаете своим подходом к асму.
Никто не указывает целевую систему.
при чём тут MPLAB IDE? Прога нужна под конкретную микросхему?
Никто не указывает целевую систему.
при чём тут MPLAB IDE? Прога нужна под конкретную микросхему?
Abdulloh Roziev
Да мы его разбирали всего пол года, и то.... препод сказал, что ему до лампочки мы. Потом курсач сдали, и забыли эту тему вообще.
А тут друг с универа кинул задание. С методичек. Я если честно подобные не разбирал. Мы настраивали порты вводов/выводов, считали однобайтные/двухбайтные/трехбайтные числа, и настройку АЦП производили. Все, массивы проскочили, как и ещё 4 темы. С массивами только в Delphi работали, и то давно.
А прога, я просто привык с ней работать. Там я хотя бы могу проверить все. А не просто начеркать в блокноте. Прогу найти не проблема, проблема в том, что я и половину уже не помню)
А тут друг с универа кинул задание. С методичек. Я если честно подобные не разбирал. Мы настраивали порты вводов/выводов, считали однобайтные/двухбайтные/трехбайтные числа, и настройку АЦП производили. Все, массивы проскочили, как и ещё 4 темы. С массивами только в Delphi работали, и то давно.
А прога, я просто привык с ней работать. Там я хотя бы могу проверить все. А не просто начеркать в блокноте. Прогу найти не проблема, проблема в том, что я и половину уже не помню)
мплаб тут вообще при чем?
Abdulloh Roziev
В этой среде программировали
Похожие вопросы
- Нужна помощь с программой на ассемблере - комментирование каждой строки
- помогите написать программы в ассемблере
- Приведите пожалуйста пример программы на ассемблере, использующая API функцию GlobalMemoryStatus. Заранее спасибо.
- Помогите написать программу на ассемблере, завтра экзамен а я в нём совсем не шарю.
- Нужно составить программу на ассемблере
- Помогите написать небольшую программу на ассемблере (TASM). Подробности внутри.
- программа на ассемблере, не пойму в чем ошибка и как исправить
- Нужна программа на языке ассемблер, вычисляющую значение переменной R.
- Нужна программа на языке ассемблер, вычисляющую значение переменной R.
- Нужно написать программа на ассемблере для функции СигнумХ . Как правильно это сделать?
%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