Просто начните использовать сборку (GAS), и в этом коротком коде есть ошибка сегментации.

Сейчас я изучаю ассемблер AT&T x86. Я пишу код, который умножает два 32-битных целых числа без использования «*». Проблема в том, что отладчик постоянно говорит мне, что у меня ошибка сегментации. Вот мой код.

.global _start


.data

a:
    .long 0

b:
    .long 0

count:
    .long 0

.text

_start:

    movl $0, %eax
    movl $a, %ebx
    movl $b, %ecx
    movl $0, %edx

    for_mult:
        cmpl $32, count
        je end_for_mult

        carry_bit:
            shr $1, %ecx
            jnc is_zero

            addl (%ebx), %eax

            is_zero:
                shl $1, %ebx

        incl count
        jmp for_mult
    end_for_mult:

done:
    movl %eax, %eax

Отладчик показывает, что ошибка сегментации появляется в "addl (%ebx), %eax", и я не могу понять, почему. Спасибо за помощь!


person Fangzhou Li    schedule 09.05.2017    source источник
comment
Вы должны учитывать, что shl $1, %ebx делает с ebx и как это влияет на addl (%ebx), %eax в следующем раунде цикла.   -  person Bo Persson    schedule 09.05.2017
comment
Когда отладчик сообщает об ошибке сегментации и указывает на какую-то инструкцию, вы можете проверить используемый адрес памяти (в данном случае значение в ebx). Затем вы можете проверить выделенную вам память (обычно метки разделов .data/.rodata), если это указывает на место, где вы хотите. Затем вы можете начать поиск (возможно, выполняя инструкцию кода 1 за раз), почему вы вышли из допустимой/ожидаемой памяти. Кстати, у вас еще есть несколько свободных регистров, почему бы не использовать их также для count? Собственно, почему бы не использовать только регистры и хранить в памяти только результат? Обычно это проще+быстрее.   -  person Ped7g    schedule 09.05.2017


Ответы (1)


Вы смешиваете адреса и значения.

Удалите знаки $, чтобы

movl a, %ebx
movl b, %ecx

(Ваш код фактически перемещает адреса a и b в регистры, а не в значения!)

Снимите кронштейн вокруг %ebx

addl %ebx, %eax

Вам нужно значение ebx, а не значение, на которое указывает ebx.

person Andreas H.    schedule 09.05.2017