我试图掌握MASM32,并对以下内容感到困惑:
我认为括号用于间接,所以如果我有一个预定义的变量
.data
item dd 42
Run Code Online (Sandbox Code Playgroud)
然后
mov ebx, item
Run Code Online (Sandbox Code Playgroud)
将'item'的内容,即数字42,放入ebx和
mov ebx, [item]
Run Code Online (Sandbox Code Playgroud)
将'item'的地址,即存储42的地址放入ebx.
但是控制台应用程序中的以下代码:
mov ebx, item
invoke dwtoa, ebx, ADDR valuestr
invoke StdOut, ADDR valuestr
mov ebx, [item]
invoke dwtoa, ebx, ADDR valuestr
invoke StdOut, ADDR valuestr
Run Code Online (Sandbox Code Playgroud)
两次打印42次.要获得"项目"的地址,我似乎需要
mov ebx, [OFFSET item]
invoke dwtoa, ebx, ADDR valuestr
invoke StdOut, ADDR valuestr
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释MASM中的方括号,或者指出一个很好的参考.
我试图了解地址计算指令的工作原理,尤其是leaq命令.然后当我看到leaq用于进行算术运算的例子时,我感到困惑.例如,以下C代码,
long m12(long x) {
return x*12;
}
Run Code Online (Sandbox Code Playgroud)
在组装中
leaq (%rdi, %rdi, 2), %rax
salq $2, $rax
Run Code Online (Sandbox Code Playgroud)
如果我的理解是正确的,那么leaq应该移动任何(%rdi, %rdi, 2)应该2*%rdi+%rdi评估的地址%rax.我感到困惑的是,因为值x存储%rdi在内,这只是内存地址,为什么%rdi乘以3然后左移这个内存地址 2等于x乘以12?是不是当我们%rdi用3时,我们跳到另一个没有值x的内存地址?