2017-05-09 5 views
1

私はこれらの日に& ATのアセンブリを学んでいます。私は "*"を使わずに2つの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)、%eaxx 'にどのように影響するのかを考えるべきです。 –

+0

デバッガがセグメンテーションフォールトを示し、ある命令を指しているときは、使用されているメモリアドレス(この場合は 'ebx 'の値)を確認できます。次に、割り当てられたメモリ(通常は '.data' /' .rodata'セクションのラベル)を調べて、それがあなたが望む場所を指しているかどうかを調べることができます。次に、(おそらくコード1の命令を時間通りに踏んで)検索を開始することができます。なぜ、あなたは有効/予想されたメモリを使い切ったのですか? Btw、あなたはまだいくつかのレジスタを無料で利用しています。実際にレジスタだけを使用せず、結果をメモリに格納するのはなぜですか?通常、より簡単で高速です。 – Ped7g

答えて

2

アドレスと値を混合しています。

周り%ebx

addl %ebx, %eax 
ブラケットを取り外します(あなたのコードは実際には、レジスタではなく値に abのアドレスを動かす!)

movl a, %ebx 
movl b, %ecx 

を$兆しを削除します

ebxの値にebxが指す値ではないことが必要です。

関連する問題