这些天我正在学习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"处,我不知道为什么。感谢您的帮助!
您正在混合地址和值。
删除 $ 符号
movl a, %ebx
movl b, %ecx
(您的代码实际上将a
和b
的地址移动到寄存器而不是值!
取下%ebx
周围的支架
addl %ebx, %eax
你想要的是 ebx 的值,而不是 ebx 指向的值。