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に" で表示されていることを示しており、私はその理由を把握することはできません。ご協力ありがとうございました!
'shl $ 1、%ebx'が' ebx'に対して何をするのか、それがループの次のラウンドで 'addl(%ebx)、%eaxx 'にどのように影響するのかを考えるべきです。 –
デバッガがセグメンテーションフォールトを示し、ある命令を指しているときは、使用されているメモリアドレス(この場合は 'ebx 'の値)を確認できます。次に、割り当てられたメモリ(通常は '.data' /' .rodata'セクションのラベル)を調べて、それがあなたが望む場所を指しているかどうかを調べることができます。次に、(おそらくコード1の命令を時間通りに踏んで)検索を開始することができます。なぜ、あなたは有効/予想されたメモリを使い切ったのですか? Btw、あなたはまだいくつかのレジスタを無料で利用しています。実際にレジスタだけを使用せず、結果をメモリに格納するのはなぜですか?通常、より簡単で高速です。 – Ped7g