2016-05-03 9 views
1

Ich schrieb diese grundlegende Linux x86 Assembly App. Ich erwarte, dass es zurückgibt, wenn ich echo $? mache, aber der Status ist immer . Was mache ich falsch?Basic Linux x86 Montage Mindestzahl falsch zurück

.section .data 
    data_items: 
     .long 3,67,34,222,45,2,54,34,44,33,22,11,66,0 

.section .text 
    .global _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 
     jge start_loop 
     movl %eax, %ebx 
     jmp start_loop 

    loop_exit: 
     movl $1, %eax 
     int $0x80 

Hinweis: %ebx enthält immer den Statuscode, und es sollte den minimalen Wert von Ausgangszeit enthalten.

Korrigiert:

_start: 
     movl $0, %edi 
     movl data_items(,%edi,4), %ebx 

    start_loop: 
     incl %edi 
     movl data_items(, %edi, 4), %eax 
     cmpl $0, %eax 
     je loop_exit 

     cmpl %ebx, %eax 
     jge start_loop 

     movl %eax, %ebx 

Antwort

2

Das Problem ist, dass die abschließende Null auch in der minimalen Berechnung beteiligt ist. Sie überprüfen diese Null nur, nachdem Sie die Überprüfung für das Minimum bereits durchgeführt haben. Erfahren Sie, wie Sie einen Debugger verwenden, um Ihren Code zu durchsuchen.

Überlegen Sie, was passiert, wenn Sie beim letzten Artikel ankommen, dem 66. Befolgen Sie den Code von start_loop. Offensichtlich 66 ist nicht 0, so dass es fortfährt, erhöht den Index und holt die nächste Zahl, die die Null ist. Dies ist natürlich weniger als das Minimum, daher wird es in ebx gespeichert und wir enden wieder bei start_loop, was die Abbruchbedingung korrekt erkennt. ebx ist jedoch bereits genullt.

+0

Sie haben natürlich Recht! Ich hoffe, dass das Buch, das ich lese, bald debuggt. – sprocket12

Verwandte Themen