1
我現在在學習AT & T x86程序集。我正在寫代碼,它將兩個32位整數相乘而不使用「*」。問題是調試器不斷告訴我我有分段錯誤。這是我的代碼。剛剛開始使用程序集(GAS),並且在此代碼段中存在段錯誤
.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'。 –
當調試器表示分段錯誤並指向一些指令時,可以檢查使用的內存地址(在這種情況下,值爲'ebx'中的值)。然後你可以檢查你分配的內存(通常是'.data' /'.rodata'節標籤),如果它指向你想要的地方。然後你可以開始搜索(可能通過逐步完成代碼1的指令),爲什麼你離開了有效/預期的內存。順便說一句,你還有一些免費的寄存器,爲什麼不使用'count'呢?其實爲什麼不使用寄存器而只是將結果存入內存?它通常更容易+更快。 – Ped7g