2017-04-25 10 views
2

So arbeite ich an einer Aufgabe und ich habe einige Probleme, Arrays in dieser Art von Code zu verstehen (bedenken Sie, dass mein Wissen über dieses Zeug begrenzt ist). Mein Code soll den Benutzer bitten, die Anzahl der Werte einzugeben, die in ein Array von SDWORDs eingegeben werden, und dann eine Prozedur erstellen, bei der der Benutzer die Zahlen eingeben muß. Ich habe den Teil unten getan, der den Benutzer nach dem Betrag fragt (gespeichert in "count"), aber ich kämpfe mit dem anderen Prozedurteil Zum Beispiel mit meinem Code unten, wenn sie 5 eingeben, dann würde die Prozedur, die ich machen muss, sie erfordern um 5 Zahlen einzugeben, die in ein Array eingehen würden.Array erstellen und Werte hinzufügen

Das Problem, mit dem ich konfrontiert bin, ist, dass ich nicht sicher bin, wie man das Array tatsächlich aufstellt. Es kann irgendwo zwischen 2 und 12 Zahlen enthalten, weshalb ich den Vergleich im folgenden Code eingerichtet habe. Nehmen wir zum Beispiel sagen, dass die Benutzereingaben, die sie fünf Zahlen eingeben werden, und ich es gesetzt, wie dies oben ...

.data 
array SDWORD 5 

das Problem, das ich habe ist, dass ich nicht sicher bin, ob das zu sagen ist das Array halte 5 Werte oder wenn nur ein Wert im Array 5 ist. Ich brauche die Anzahl der Werte im Array, die gleich "count" sein sollen. "count", wie ich unten eingerichtet habe, ist der Betrag, den der Benutzer eingeben wird.

auch offensichtlich weiß ich, wie das Verfahren wie folgt einzurichten ...

EnterValues PROC 

    return 
EnterValues ENDP  

Ich weiß nur nicht, wie so etwas zu realisieren. All die Forschung, die ich online getan habe, verwirrte mich nur mehr und keines der Beispiele, die ich gefunden habe, frage den Benutzer, wie viele Zahlen das Array sein werden, bevor sie physikalisch irgendwelche Zahlen eingeben. Ich hoffe, dass das, was ich beschrieben habe, Sinn macht. Jeder Beitrag zu dem, was ich tun könnte, wäre großartig!

INCLUDE Irvine32.inc 
.data 
count SDWORD ? 
prompt1 BYTE "Enter the number of values to sort",0 
prompt2 BYTE "Error. The number must be between 2 and 12",0 

.code 

Error PROC 
    mov edx, OFFSET prompt2 
    call WriteString 
    exit   ; exit ends program after error occures 
Error ENDP 

main PROC 
    mov edx, OFFSET prompt1 
    call WriteString ; prints out prompt1 
    call ReadInt 
    mov count, eax  ; save returned value from eax to count 

    cmp count, 12  
    jle Loop1  ; If count is less than or equal to 12 jump to Loop1, otherwise continue with Error procedure 
    call Error  ; performs Error procedure which will end the program 

    Loop1: cmp count, 2 
    jge Loop2 ; If count is greater than or equal to 2 jump to Loop2, otherwise continue with Error procedure 
    call Error ; performs Error procedure which will end the program 

    Loop2: exit 
main ENDP 
END main 

============ EDIT ==============

Ich kam auf diese ...

EnterValues PROC 
    mov ecx, count 
    mov edx, 0 
    Loop3: 
     mov eax, ArrayOfInputs[edx * 4] 
     call WriteInt 
     call CrLf 
     inc edx 
     dec ecx 
     jnz Loop3 
    ret 
EnterValues ENDP 

Antwort

0
.data 
array SDWORD 5 

definiert einSDWORD mit dem Anfangswert 5 im DATA Abschnitt und gibt ihm den Namen „Array“.

Sie könnten die DUP operator

.data 
array SDWORD 12 DUP (5) 

verwenden möchten Diese zwölf definiert SDWORD und initialisiert jeweils mit dem Wert 5. Wenn der Anfangswert keine Rolle spielt, dh Sie wollen eine nicht initialisierte Array die anfängliche ändern Wert '?':

array SDWORD 12 DUP (?) 

MASM jetzt eine _BSS segment erstellen kann. Um die Entscheidung zu erzwingen:

.data? 
array SDWORD 12 DUP (?) 

Das Symbol array wird in einem MASM Programm als eine Konstante zu der Adresse des ersten Eintrags Offset verwendet.Verwenden Sie einen zusätzlichen Index nachfolgende Einträge zu adressieren, zum Beispiel:

mov eax, [array + 4] ; second SDWORD 
mov eax, [array + esi] 

Pointer-Arithmetik:

lea esi, array   ; copy address into register 
add esi, 8    ; move pointer to the third entry 
mov eax, [esi]   ; load eax with the third entry 

lea esi, array + 12  ; copy the address of the fourth entry 
mov eax, [esi]   ; load eax with the fourth entry 

Sie in jedem Fall haben einen Array mit einer festen Größe. Es liegt an dir, nur um es mit count Werten zu füllen.

+0

Vielen Dank! Ich habe mir etwas einfallen lassen und habe es am Ende der Frage hinzugefügt. Würde es dir etwas ausmachen, einen Blick darauf zu werfen und mich wissen zu lassen, ob es Sinn macht? Vielen Dank! –

+0

Auch ich wollte, dass Sie wissen, dass ich den Namen von Array in ArrayOfInputs geändert habe, deshalb ist es anders –

+0

@ V.Valdes: Ja, das macht Sinn und zeigt guten Stil: in eine Prozedur ausgeleitet, eine klare Struktur (keine Spaghetti), aussagekräftige Symbolnamen, gut formatiert, – rkhb

Verwandte Themen