Код сборки - неправильный ответ - PullRequest
2 голосов
/ 24 июня 2009

Я прохожу через "Программирование с нуля". Теперь у меня есть следующий код, который должен дать 2 как минимальный ответ, но я получаю 0 как ответ, когда я делаю echo $?.


    .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 

Ответы [ 2 ]

1 голос
/ 24 июня 2009

хорошо, 0 меньше, чем 2

Поскольку вы JG возвращаетесь к циклу, если значение в eax больше текущего ebx, также похоже, что ноль используется в качестве кода выхода в этих строках

cmpl $0,%eax
je loop_exit

Таким образом, в этом случае, когда вы достигнете нуля в списке, это фактически самое низкое число И условие выхода

0 голосов
/ 24 июня 2009

Вы не печатаете результат. Вам нужно отладить. ebx будет содержать ответ после выполнения цикла.

Я знаю, что int 0x80 означает вызов внешней функции, но я не уверен, какие детали есть. Хорошо ... согласно хорошей странице для прерываний 0x80 и номеров системных вызовов , $ 1 является кодом выхода.

Не похоже, что вы печатаете результат. Хорошо, основной формат выписки для печати таков:

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

Вам потребуется преобразовать ваш результат в символы, поместить их в память, а затем передать в ячейку памяти вызов «int 21h», который выведет их на экран.

Попробуйте некоторые из этих примеров и посмотрите, работают ли они на вас.

Можете ли вы отладить код, чтобы проверить, что происходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...