2016-05-02 5 views
0

Ich muss das leere 5-Integer-Array ersetzen, Xarr mit Zahlen 1-5. Der Code kompiliert und ich glaube, es ist korrekt, außer für diesen letzten Teil. Meine Ausgabe ist jetzt 12345, was ich brauche. Allerdings sollte ich die Druckfunktion nur einmal am Ende verwenden, und der Ausgang 12345 sollte vertikal sein (einzeln), nicht horizontal.Wie fügt man Werte in ein Array in Assembly 80386 ein?

.globl _asm_main 


.section .data, "" 

.section .bss, "" 
xarr: .fill 5, 4, 0 

.section .text, "" 
_asm_main: 
    enter $0, $0  # set up stack frame 
    pusha   # save registers 

    movl $1, %edi 
    movl %edi, xarr(, %edi, 4) 
    movl xarr(, %edi, 4), %eax 
    call print_int 
    incl %edi 
    movl %edi, xarr(, %edi, 4) 
    movl xarr(, %edi, 4), %eax 
    call print_int 
    incl %edi 
    movl %edi, xarr(, %edi, 4) 
    movl xarr(, %edi, 4), %eax 
    call print_int 
    incl %edi 
    movl %edi, xarr(, %edi, 4) 
    movl xarr(, %edi, 4), %eax 
    call print_int 
    incl %edi 
    movl %edi, xarr(, %edi, 4) 
    movl xarr(, %edi, 4), %eax 
    call print_int 

    popa   # restore registers 
    movl $0, %eax # return program status in eax 
    leave   # restore stack frame 
    ret 
+1

Bitte entschuldigen Sie nicht die Formatierung, sondern beheben Sie es. Wählen Sie den gesamten Code aus und klicken Sie auf die Schaltfläche {}. –

+0

Danke für die triviale Hilfe. –

+1

_8088_? Das sieht (mindestens) 80386 aus. Wie auch immer, ich sehe nicht, dass du irgendwo in deinem Code an "xarr" schreibst. – Michael

Antwort

0

Nach der allerletzten mov Anweisung, sollte es sein:

movl from_where, to_where 

Dies ist, weil man nicht von %eax auf Null bewegen kann.

Daher ist die Reihenfolge Ihrer Operanden zu den anderen mov s falsch.

movl xarr(, %edi, 4), %eax  # read from the array 
movl %edi, xarr(, %edi, 4)  # write into the array; note the %edi instead of the %eax 

Und achten Sie darauf, was jedes Register an jedem Punkt enthält. Sie scheinen %eax nicht zu initialisieren, aber schreiben Sie ihren Wert in das Array.

Sie sollten dieses Programm wahrscheinlich zuerst in C schreiben, es sorgfältig testen, den Compiler in Assembler übersetzen lassen und dann den generierten Code betrachten.

Übrigens werden die Kommentare in Assemblersprachen normalerweise so geschrieben, dass sie alle in derselben Spalte beginnen.

+0

Ich bin verwirrt, die Null wird _into_ in das% eax Register verschoben. Das Skelett dieses Codes wurde uns vorher zur Verfügung gestellt, und wir wurden angewiesen, dass wir nur den .text-Abschnitt zwischen Pusha und Popa bearbeiten sollten. Auch wenn ich das Ergebnis vor der finalen mov Anweisung gedruckt habe. –

+0

Die Antwort wurde aktualisiert. –

+0

Das hat mir sehr geholfen. Unser Lehrer hat erwähnt, dass es in C/C++ programmiert wurde, und dann ist das Extrahieren der Objektdatei möglich, aber wir hatten wirklich nur C#. Kannst du bitte meine aktualisierte Beschreibung lesen und mich weiter beraten? Und womit sollte ich eax initialisieren? –

Verwandte Themen