可能重复:
LEA指令的目的是什么?
LEA指令?
所以我正在为类进行二进制炸弹分配(它有一堆阶段,你必须逐步执行程序的汇编代码并找到密码来解码"炸弹").
我无法完成当前阶段,因为我不理解lea命令.我已经读过它通常用于算术,但我只是不明白它是如何做到的.
我正在看的命令是
lea -0x18(%ebp), %ebx
lea -0x8(%ebp), %esi
Run Code Online (Sandbox Code Playgroud)
接下来是
mov -0x4 (%ebx), %eax
add -0x8(%ebx), %eax
Run Code Online (Sandbox Code Playgroud)
在下一行eax和ebx进行比较,如果它们等于程序继续,否则炸弹爆炸.
我已经足够了解这个阶段知道它想要6个数字,前两个是0和1.之后它做了一些操作来确定序列的其余部分是否正确(我假设lea命令是什么我需要解码才能找到下一个数字).
现在我找不到的是-0x18特别指的是什么.什么是负号呢?它表示减法吗?它在ebp之前看起来是18个字节吗?
感谢您的帮助.
我正在阅读Kochan的书"C编程".在p.中的Pointer和Arrays部分中.264他说:
通常,索引数组的过程比访问指针内容的过程花费更多的时间来执行.实际上,这是使用指针访问数组元素的主要原因之一 - 生成的代码通常更有效.当然,如果对数组的访问通常不是顺序的,那么只要涉及这个问题,指针就什么都不做,因为表达式*(指针+ j)和表达式数组[j]的执行时间一样长.
有人可以解释什么比什么更快?具体来说,如果array [j]的速度=*(指针+ j)的速度那么索引数组的过程是什么,以及访问指针内容的过程是什么?此外,有关SO的问题和答案提到在编译期间将数组[j]转换为*(数组+ j),因此不应有任何区别.
总结:请给我一个Kochan所说的非常简单的例子.2个代码并指向更快的代码,不必解释为什么它是真的.
我试图了解地址计算指令的工作原理,尤其是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的内存地址?