2016-05-03 3 views
1

Я написал это базовое linux x86 сборка приложения. Я ожидаю, что он вернется когда я сделаю echo $? однако статус всегда . Что я делаю не так?basic linux x86 минимальное число сборки неверно

.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 

Примечание: %ebx всегда содержит код состояния, и он должен содержать минимальное значение по времени выхода.

Исправлено:

_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 

ответ

2

Вопрос заключается в том, что Нуль также участвует в минимальном расчете. Вы проверяете этот ноль только после того, как вы уже сделали проверку на минимум. Научитесь использовать отладчик для перехода через свой код.

Рассмотрите, что произойдет, когда вы придете к последнему пункту, 66. Выполните код из start_loop. Очевидно, 66 не 0, поэтому он продолжает, увеличивает индекс и выбирает следующее число, которое равно нулю. Это, конечно, меньше минимального, поэтому он сохраняется в ebx, и мы снова получаем start_loop, который правильно определяет условие завершения. Однако ebx уже обнулен.

+0

Вы, конечно, правы! Я надеюсь, что прочитанная мной книга скоро отлаживает отладки. – sprocket12