2009-06-24 6 views
2

Ich gehe durch "Programmierung von Grund auf". Jetzt habe ich den folgenden Code, der 2 als minimale Antwort geben sollte, aber ich bekomme 0 als Antwort, wenn ich $ widerspreche.Assembly Code - bekomme keine richtige Antwort


    .section .data 
    data_items: 
    .long 3,67,34,222,56,87,9,2,88,22,11,66,900,0 
    .section .text 
    .globl _start 
    _start: 
    movl $0,%edi 
    movl data_items(,%edi,4),%eax 
    movl %eax,%ebx 
    start_loop: 
    cmpl $0,%eax 
    je loop_exit 
incl %edi 
movl data_items(,%edi,4),%eax 
cmpl %ebx,%eax 
jg start_loop 
movl %eax,%ebx 
jmp start_loop 
loop_exit: 
     movl $1,%eax 
     int $0x80
+1

Als Faustregel in Assembler-Programm, müssen Sie TONNEN Kommentare . Manche Leute empfehlen 1 pro Zeile, was vielleicht ein bisschen viel ist, aber immer noch nicht zu weit weg ist. – samoz

+2

Als ich 1986 für IBM arbeitete, wurde mir gesagt, dass ich mindestens eine Kommentarzeile pro Codezeile von Assembly haben sollte. Dies war eine Voraussetzung, damit weniger technisch versierte Personen den Quellcode lesen konnten. –

Antwort

1

gut, 0 weniger als 2

Da Sie JG'ing Sich auf die Schleife zurück, wenn der Wert in EAX größer als die aktuellen EBX ist, sieht auch wie die Null als Exit-Code verwendet wird, in diesen Zeilen

cmpl $0,%eax 
je loop_exit 

Also in diesem Fall, wenn Sie die Null in der Liste getroffen, es ist tatsächlich die niedrigste Zahl und die Ausgangsbedingung

+0

sehr wahr, ich habe gerade beim Debuggen festgestellt – kost

+0

Die Schleife wird beendet, ohne $ 0 in ebx zu verschieben. ebx wird immer noch den niedrigsten Wert in der Liste enthalten – Kieveli

+0

@ Kieveli: es wird, an diesem Punkt wird JG nicht zum Anfang der Schleife zurückkehren und die nächste Zeile ist movl% eax,% ebx, dann wird es nach oben gehen, siehe Null und Ausfahrt – curtisk

0

Sie drucken das Ergebnis nicht. Sie müssen debuggen. ebx wird die Antwort enthalten, nachdem die Schleife ausgeführt wurde.

Ich weiß, das Int 0x80 bedeutet, eine externe Funktion aufzurufen, aber ich bin mir nicht sicher, was die Details sind. Ok .. nach einem schönen page on interrupt 0x80 und system call numbers ist der $ 1 ein Exit-Code.

Es scheint nicht, als ob Sie das Ergebnis drucken. Ok, das grundlegende Format einer print-Anweisung ist dies:

mov eax, <MEMORY POINTER TO STRING> 
int 21h 

Sie benötigen würden Ihr Ergebnis in Zeichen konvertieren, so dass sie in Erinnerung gebracht und dann in dem Speicherplatz auf dem ‚int 21h‘ passieren nennen die Drucke sie auf den Bildschirm.

Probieren Sie einige der these examples und sehen, ob sie für Sie arbeiten.

Können Sie den Code debuggen, um zu überprüfen, was vor sich geht?

+0

OP erwähnt 'echo $?', Was bedeutet, dass er Linux, nicht DOS 'API will. Außerdem druckt er den Wert nicht, sondern gibt ihn als Exit-Status zurück. –

+0

Du hast Recht ... Dann sollte es gut in ebx bleiben. Als zweites Argument für den Ausgang. – Kieveli

+0

... oder das erste Argument sozusagen =) – Kieveli