刚开始使用汇编 (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"处,我不知道为什么。感谢您的帮助!

您正在混合地址和值。

删除 $ 符号

movl a, %ebx
movl b, %ecx

(您的代码实际上将ab的地址移动到寄存器而不是值!

取下%ebx周围的支架

addl %ebx, %eax

你想要的是 ebx 的值,而不是 ebx 指向的值。

最新更新