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