相关疑难解决方法(0)

LEA指令的目的是什么?

对我来说,它看起来像一个时髦的MOV.它的目的是什么,我什么时候应该使用它?

x86 assembly x86-64 x86-16

632
推荐指数
15
解决办法
54万
查看次数

麻烦理解汇编命令"加载有效地址"

可能重复:
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个字节吗?

感谢您的帮助.

x86 assembly

10
推荐指数
1
解决办法
3万
查看次数

为什么使用数组索引循环数组比指针访问慢?

我正在阅读Kochan的书"C编程".在p.中的Pointer和Arrays部分中.264他说:

通常,索引数组的过程比访问指针内容的过程花费更多的时间来执行.实际上,这是使用指针访问数组元素的主要原因之一 - 生成的代码通常更有效.当然,如果对数组的访问通常不是顺序的,那么只要涉及这个问题,指针就什么都不做,因为表达式*(指针+ j)和表达式数组[j]的执行时间一样长.

有人可以解释什么比什么更快?具体来说,如果array [j]的速度=*(指针+ j)的速度那么索引数组的过程是什么,以及访问指针内容的过程是什么?此外,有关SO的问题和答案提到在编译期间将数组[j]转换为*(数组+ j),因此不应有任何区别.

总结:请给我一个Kochan所说的非常简单的例子.2个代码并指向更快的代码,不必解释为什么它是真的.

c arrays pointers

7
推荐指数
1
解决办法
1719
查看次数

在不是地址/指针的值上使用LEA?

我试图了解地址计算指令的工作原理,尤其是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的内存地址?

c x86 assembly memory-address

4
推荐指数
2
解决办法
4927
查看次数

标签 统计

assembly ×3

x86 ×3

c ×2

arrays ×1

memory-address ×1

pointers ×1

x86-16 ×1

x86-64 ×1