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

SRa*_*som 10 x86 assembly

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

感谢您的帮助.

rob*_*off 19

LEA指令使用与MOV指令相同的算法计算存储器地址.但与MOV指令不同,LEA指令只是将计算出的地址存储在目标寄存器中,而不是加载该地址的内容并存储它.

考虑您的第一个LEA指令:

lea -0x18(%ebp), %ebx
Run Code Online (Sandbox Code Playgroud)

该指令计算-0x18与EBP寄存器中的值之和.它得到一些结果S.它将S存储在EBX寄存器中.

在加数-0x18中," - "是负号,"0x"表示它是十六进制常量.因此加数为负18 16,即-24 10.所以这个LEA指令只是从EBP中的值中减去24并将结果存储在EBX中.

将其与您的MOV指令进行对比:

mov -0x4(%ebx), %eax
Run Code Online (Sandbox Code Playgroud)

该指令计算-0x4与EBX寄存器中的值之和.它获得了一些结果S.然后它在内存中的地址S处获取字的值,得到一些值M.它将M存储在EAX寄存器中.