我知道我要說的這句話可能是非常快速地在StackOverflow上變得非常不受歡迎的最好方法。無論如何,我會這樣說:爲什麼這不工作(完全)?IA32程序集:lea指令
我試圖弄清楚lea/leal指令的作用是什麼。按照我的理解,lea/leal找出第一個操作數的內存地址,並將此地址寫入第二個操作數(可能是一個寄存器或其他地址)。
這部分似乎工作。當我運行下面的程序時,它說:
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
我甚至不確定我是否正確地使用了哪些文件。幫助表示讚賞。 ;)
'movl src,dest'表示'dest = src'。 ''leal src,dest''表示'dest =&src'(即dest = src的地址) – Sam
爲了更加準確,movl會評估源,將其視爲地址並將其內容移至目的地。 但是,'leal'評估來源並將評估值移到目的地。 – Sam
[LEA指令的目的是什麼?](http://stackoverflow.com/questions/1658294/whats-the-purpose-of-the-lea-instruction) –