Массивы в сборке

У меня есть некоторые проблемы с моим выводом... Я думаю, что у меня есть некоторые проблемы с моим массивом. Еще новичок в сборке. Задача состоит в том, чтобы разработать программу сборки, которая использует диалоговое окно для запроса числа у пользователя. Эти числа будут храниться в массиве. Появится выходное сообщение, которое показывает следующее: сумма введенных чисел, сколько чисел было введено (не считая -9999 для завершения программы), среднее число и количество элементов массива, которые больше или равно среднему значению. Любая помощь приветствуется! Вот что у меня есть:

.DATA
numArray    DWORD   ?
numElts     DWORD   100
num         DWORD   ?
exitNum     DWORD   -9999
prompt      BYTE    "Enter a number", 0
string      BYTE    40 DUP (?)
resultLbl   BYTE    "Results", 0
sum         BYTE    11 DUP(?), " is the sum.", 0dh, 0ah
;numEntered BYTE    11 DUP(?), " numbers were entered."
avg         BYTE    11 DUP(?), " is the average."
count       BYTE    11 DUP(?), " is the number of entries that are >= the     average."

.CODE
_MainProc PROC
            mov     eax, 0                      ; sum := 0
            lea     ebx, numArray               ; get address of     nbrArray

LOOP1:      input   prompt, string, 40          ; read ASCII   characters
            atod    string                      ; convert   to integer
            mov     num, eax                    ; store in memory
        mov     ecx, numElts                ; count := nbrElts
        cmp     exitNum, eax
        je      QUIT                        ; quit if -9999
        add     eax, [ebx]                  ; add number to sum
        add     ebx, 4                      ; get address of next array elt
        add     ecx, 1                      ; add one for count
        loop    LOOP1                       ; repeat nbrElts times

        cdq                                 ; extend sum to quadword
        idiv    numElts                     ; calculate average
        dtoa    avg, ebx                    ; convert to ASCII characters
        dtoa    count, ecx
        dtoa    sum, eax

QUIT:             
        output resultLbl, sum, avg, count
        ret

_MainProc ENDP
END                                             ; end of source code

person txhornsfan    schedule 28.03.2012    source источник
comment
является ли atod пользовательской функцией? потому что обычно atod преобразуется в double, а не в целые числа, поэтому вам нужно atol. Кроме того, описание вашей проблемы очень помогло бы.   -  person Necrolis    schedule 28.03.2012


Ответы (1)


вы также используете EAX для хранения своей суммы, но она будет испорчена любым вызовом (в частности, atod), вы также не испортите значение в массиве. делая ваш код немного более гладким (разбит на несколько разделов, чтобы сделать его проще):

        mov     ecx, 100                   ; loop count (size of array)
        lea     ebx, numElts               ; get address of the array

LOOP1:  
        input   prompt, string, 40          ; read ASCII   characters
        push    ecx                         ; save the loop count incase
        atod    string                      ; convert   to integer
        pop     ecx                         ; restore the loop count
        mov     [ebx], eax                  ; store in the array            
        cmp     exitNum, eax
        je      NEXT                        ; quit if -9999
        add     ebx, 4                      ; get address of next array elt
        loop    LOOP1                       ; repeat nbrElts times

Отсюда мы можем сделать среднее, сумму и т. д. (я сделал только сумму и среднее, остальное на ваше усмотрение).

NEXT:
mov ecx,100            ;loop count
lea ebx,numElts        ;array address
mov edx,0              ;sum

LOOP2:
mov eax,[ebx]                  ;get the num
cmp eax,exitNum                ;check for the sentinel
je DONE
add edx,eax                    ;increase the sum
add ebx,4                      ;next array element
loop LOOP2

DONE:
mov eax,100
sub eax,ecx                    ;get the number of entries processed
mov ecx,eax
mov eax,edx                    ;get ready to divide
push edx                       ;save the sum
mov edx,0
idiv ecx                       ;sum / count
pop edx                        ;restore the sum
;from here edx has your sum, eax has your average
person Necrolis    schedule 28.03.2012