Массивы в сборке - PullRequest
       15

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

1 голос
/ 28 марта 2012

У меня проблемы с выводом ... Думаю, у меня проблемы с массивом.Все еще новичок в сборке.Назначение заключается в разработке программы сборки, которая использует диалоговое окно, чтобы запросить у пользователя номер.Эти числа будут храниться в массиве.Появится выходное сообщение с указанием следующего: сумма введенных чисел, сколько чисел было введено (не считая -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

1 Ответ

1 голос
/ 28 марта 2012

вы также используете 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
...