2017-05-09 58 views
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」,我找不到原因。感謝您的幫助!

+0

你應該考慮'shl $ 1,%ebx'對'ebx'做什麼以及它是如何影響下一輪循環中的'addl(%ebx),%eax'。 –

+0

當調試器表示分段錯誤並指向一些指令時,可以檢查使用的內存地址(在這種情況下,值爲'ebx'中的值)。然後你可以檢查你分配的內存(通常是'.data' /'.rodata'節標籤),如果它指向你想要的地方。然後你可以開始搜索(可能通過逐步完成代碼1的指令),爲什麼你離開了有效/預期的內存。順便說一句,你還有一些免費的寄存器,爲什麼不使用'count'呢?其實爲什麼不使用寄存器而只是將結果存入內存?它通常更容易+更快。 – Ped7g

回答

2

您正在混合地址和值。

刪除$跡象

movl a, %ebx 
movl b, %ecx 

(你的代碼實際上移動的ab到寄存器的地址,而不是值!)

各地%ebx

addl %ebx, %eax 
卸下支架

您希望ebx的值不是ebx指向的值。

相關問題