2012-03-28 10 views
1

Ich habe einige Probleme mit meiner Ausgabe ... Ich glaube, ich habe einige Probleme mit meinem Array. Immer noch neu in der Montage. Die Aufgabe besteht darin, ein Assembly-Programm zu entwerfen, das ein Dialogfeld verwendet, um den Benutzer nach einer Nummer zu fragen. Diese Nummern werden in einem Array gespeichert. Es wird eine Ausgabenachricht geben, die folgendes anzeigt: Summe der eingegebenen Zahlen, wieviele Zahlen eingegeben wurden (nicht -9999, um das Programm zu beenden), der Durchschnitt der Zahlen und die Anzahl der Array-Einträge, die größer sind als oder gleich dem Durchschnittswert. Alle Hilfe wird geschätzt! Hier ist, was ich habe:Arrays in Assembly

.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 
+0

ist 'atod' eine benutzerdefinierte Funktion? weil "atod" generell zu "double" konvertiert, nicht zu ganzen Zahlen, also zu "atol". Auch die Beschreibung Ihres Problems würde Ihnen sehr helfen. – Necrolis

Antwort

1

Sie auch EAX verwenden Ihre Summe zu speichern, aber es wird von jedem Anruf verdorben werden (insbesondere atod), können Sie auch nicht wund den Wert im Array. Ihren Code ein bisschen mehr glatt machen (gebrochen in einigen Abschnitten es einfacher zu machen):

 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 

Von hier aus wir die durchschnittliche tun können, Summe etc. (Ich habe nur die Summe und die durchschnittliche getan, Rest ist wie du willst).

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