2014-12-11 8 views
0

Мне нужно написать процедуру на Masm32, которая должна найти элемент min и max в массиве. Эта процедура должна принять 4 параметра: 1) массив чисел с плавающей точкой, 2) Длина массива, 3) мин - выходной параметр 4) макс - выходной параметрMasm32. Найти min и max в массиве

Я пытался писать, но это Безразлично Не работай. Я не могу получить элементы из массива в процедуру. Правильно только первый элемент, а другие - нет.

Эта процедура:

getMinMax PROC arr:QWORD, len:DWORD, _min:PTR QWORD, _max:PTR QWORD 
    XOR ECX, ECX 
    XOR EBX, EBX   

    MOV ECX, len 
    DEC ECX 

    FLD arr[0] 
    FST _min 
    FSTP _max 

    ADD EBX, type arr 

start: 
    FLD arr[EBX] 
    FLD _min 

    FCOMPP 
    FSTSW AX 
    SAHF 

    JP nomin 
    JZ nomin ; min == arr 
    JC nomin ; min > arr 

    ; min < arr[i] 
    FLD arr[EBX] 
    FSTP _min 
    ADD EBX, type arr 

nomin: 
    LOOP start 

    ret 
getMinMax ENDP 

А вот процедура вызова

invoke getMinMax, result, n, offset minVal, offset maxVal 

где:

result dq 100 dup(?) 
n  dd 4 
minVal dq ? 
maxVal dq ? 

Может кто-нибудь мне помочь?

ответ

1

a. Не используете ли вы OFFSET/PTR по первому параметру?

invoke getMinMax, offset result, n, offset minVal, offset maxVal 

getMinMax PROC arr:PTR QWORD, len:DWORD, _min:PTR QWORD, _max:PTR QWORD 

b. Вы опасно полагаете, что LEN всегда будет не менее 2. Вы должны проверить для случаев с LEN = 0 и LEN = 1

c. Вы должны поменять эти строки! Добавление всегда должно проходить через каждую итерацию.

ADD EBX, type arr 
nomin: 

d. Ваша текущая программа не вычисляет максимум.

e. Очистка ECX является избыточной прямо перед перемещением LEN в нее.