У меня возникла проблема в поиске среднего, минимального и максимального массива на ассемблере. Я создал простой массив с C++ и создал файл test.asm, чтобы передать его. я вычислил среднее значение, но теперь его минимальные и максимальные значения, похоже, не выясняются.нахождение среднего, мин и макс в сборе
#include <iostream>
using namespace std;
extern "C"
int test(int*, int);
int main()
{
const int SIZE = 7;
int arr[SIZE] = { 1,2,3,4,5,6,7 };
int val = test(arr, SIZE);
cout << "The function test returned: " << val << endl;
return 0;
}
Это мой test.asm, который добавляет все значения и возвращает 4.
.686
.model flat
.code
_test PROC ;named _test because C automatically prepends an underscode, it is needed to interoperate
push ebp
mov ebp,esp ;stack pointer to ebp
mov ebx,[ebp+8] ; address of first array element
mov ecx,[ebp+12]
mov ebp,0
mov edx,0
mov eax,0
loopMe:
cmp ebp,ecx
je allDone
add eax,[ebx+edx]
add edx,4
add ebp,1
jmp loopMe
allDone:
mov edx,0
div ecx
pop ebp
ret
_test ENDP
END
Я все еще пытаюсь выяснить, как найти мин, так как максимум будет сделано в подобном путь. Я предполагаю, что вы используете cmp для сравнения значений, но все, что я пробовал до сих пор, не было успешным. Я довольно новичок в ассемблере, и мне трудно понять. Любая помощь приветствуется.
Предлагайте записать его на C вместо этого и посмотреть на вывод компилятора, чтобы увидеть, что он делает. Затем решите, действительно ли хотите писать в сборке. –
Выберите регистр, чтобы сохранить min/max и инициализировать его с помощью первого элемента массива. Затем используйте команду 'cmp', чтобы определить, следует ли заменить это значение на текущий элемент или нет. Просто. –
Вы хотите вернуть минимальный, максимальный и средний к вызывающему процессу? Это можно сделать, если значения меньше 255 в одном 32-битном регистре, но для значений, превышающих это, потребуется дополнительная логика. –