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

Задача ассемблер

Помогите решить задачу Найти в массиве из 5-ти переменных сумму чисел, принадлежащих диапазону [-5;12]. Массив: -16, 8, -4, -2, 25
Gor Mirzoyan
Gor Mirzoyan
268
Содержательная часть - функция вычисления суммы элементов массива, принадлежащих диапазону [-5;12]:
int sum(int *array, int size);
Первый аргумент указатель на начало массива array, второй размер массива size.
Соглашения относительно функции соответствуют языку C (обратный порядок аргументов, значение возвращется через регистр eax).

Принцип работы: копируем указатель на массив и его размер в регистры ebx, ecx; делаем цикл по элементам массива в обратном порядке (size-1, size-2, ..1, 0), используя команду loop; в теле цикла копируем в регистр элемент массива, сравниваем его с границами [-5;12], если удовлетворяет добавляем значение к аккумулятору eax.

Ввод массива, вызов функции, вывод результата, я полагаю, Вы сможете написать сами.

синтаксис AT&T:

.globl sum
.typesum, @function
sum:
pushl % ebx
pushl % ecx
pushl % edx
movl16(% esp), % ebx // адрес начала массива
movl20(% esp), % ecx // размер массива
movl $0, % eax
clc
WHILE:
movl -4(% ebx, % ecx, 4), нx
cmpl $-5, % edx
jl NEXT
cmpl $12, % edx
jg NEXT
addl % edx, % eax
NEXT:
loop WHILE

popl % edx
popl % ecx
popl % ebx
ret

синтаксис Intel:

sum:
push ebx
push ecx
push edx
movebx, [esp + 16] // адрес начала массива
movecx, [esp + 20] // размер массива
mov eax, $0
clc
WHILE:
mov edx, [ebx+ecx*4-4]
cmp edx, $-5
jl NEXT
cmp edx, $12
jg NEXT
add eax, edx
NEXT:
loop WHILE

pop edx
pop ecx
pop ebx
ret

PS: мейл портит код ((((
СЕ
Сашка Егоров
2 433
Лучший ответ
слушать надо на уроках
ba
bahram_1985
5 598