私が言おうとしている文は、StackOverflow で非常に急速に不人気になるためのおそらく最良の方法であることを知っています。とにかく言います:なぜこれは(完全に)うまくいかないのですか?
lea/leal 命令が何をするのかを理解しようとしていました。私が理解している方法では、lea/leal は最初のオペランドのメモリ アドレスを見つけ、このアドレスを 2 番目のオペランド (レジスタなどである可能性があります) に書き込みます。
この部分は機能しているようです。以下のプログラムを実行すると、次のように表示されます。
The memory address of var is 134518204.
ただ、この直後に「メモリアクセスエラー」みたいなのが出てきます。pushl (%eax)は明らかに機能しません。なぜだめですか?
.data
var: .long 42
str1: .string "The memory address of var is %d.\n"
str2: .string "At this memory address we find var's value: %d.\n"
.text
.global main
main:
leal var, %eax # Copy the address of var into %eax
pushl %eax
pushl $str1
call printf # Print str1
pushl (%eax)
pushl $str2
call printf # Print str2
# Some stack cleaning should be here :)
movl $1, %eax
int $0x80
lea/leal の機能が正しかったかどうかさえわかりません。助けていただければ幸いです。;)