私は以下のアセンブリコードを持っています:
indirect1.s
.section .data
t1:
.long 5
.section .text
.globl _start
_start:
movl $t1, %ecx #we are passing the address to %ecx
movl $5, %eax #we are passing value 5 to %eax
movl (%ecx), %ebx #Using indirect addressing mode we are getting the value from t1 and passing it to ebx
addl %eax, %ebx # add the values in %eax, %ebx and store it in %ebx
movl $1, %eax # call exit program
int $0x80 # Call Master Bruce Wayne
上記のプログラムを実行すると、期待どおりに値 10 が得られます
[ashok@localhost asm-32]$ as indirect1.s -gstabs+ -o indirect1.o
[ashok@localhost asm-32]$ ld indirect1.o -o indirect1
[ashok@localhost asm-32]$ ./indirect1
[ashok@localhost asm-32]$ echo $?
10
%ecx レジスタを削除するために上記のプログラムを変更しました。
indirect2.s
.section .data
t1:
.long 5
.section .text
.globl _start
_start:
movl $t1, %ebx # we are passing the address to %ebx
movl $5, %eax # we are passing value 5 to %eax
addl %eax, (%ebx) # add the values in %eax, %ebx and store it in %ebx
movl $1, %eax # call exit program
int $0x80 # Call Master Bruce Wayne
上記のプログラムを実行すると、期待される出力、つまり 10 が得られず、%ebx に保存されているアドレスを取得しているようです
[ashok@localhost asm-32]$ as indirect2.s -gstabs+ -o indirect2.o
[ashok@localhost asm-32]$ ld indirect2.o -o indirect2
[ashok@localhost asm-32]$ ./indirect2
[ashok@localhost asm-32]$ echo $?
136
indirect2.s プログラムで私が間違っていること。