32
|
Tony The Lion · 技术社区 · 14 年前 |
1
71
leal,或者lea全名是“Load effective address”,它确实做到了这一点:它进行地址计算。 在您的示例中,地址计算非常简单,因为它只是将偏移量添加到ebx并将结果存储到eax中: eax=ebx+0x10 莉亚能做的更多。它可以添加寄存器,用常数2、4和8乘寄存器,用于字、整数和双精度数的地址计算。它还可以添加偏移量。
|
2
4
所以,简而言之,是的,这是一种加法指令。它还可以同时处理2,4或8的乘法运算。 另见 this related question (如果他们使用Intel语法讨论同一条指令): |
3
2
GNU as 2.18文件 https://sourceware.org/binutils/docs-2.18/as/i386_002dMemory.html 英特尔的语法是不言而喻的。 更重要的是,这些文件还解释了一般情况:
当我们省略了地址的某些部分时,AT&T的情况确实有点混乱。
为了真正了解发生了什么,我建议您看看指令是如何编码的。这是一个很好的教程: http://www.c-jump.com/CIS77/CPU/x86/lecture.html 当你看到这一点时,就会明白为什么地址的某些部分会被省略,以及每个表单将被编译成什么。 |
4
0
作为刷新程序,IA32汇编程序中的addresing模式通常为: IO(Rb,Ri,s),其中: IO=立即偏移量 Rb=基址寄存器 Ri=索引寄存器 s=比例因子{1,2,4,8} 所以有效地址计算为 s公司 皮革 看起来和其他指令类似,比如movl,但是有点特别。 它不是从源读取到目标,而是复制有效的 源到目标的地址。 所以它可以用来为以后的内存引用生成指针,而且 例如: 让寄存器%edx包含x值 1%(%edx、%edx、8),%eax 将1+x+8*x=1+9x的有效地址加载到寄存器%eax。
皮革 来源 目的地 => = 地址 如果您熟悉C,它相当于: 字符*b=&a; 其中char a的地址被分配给char指针b
让寄存器%eax保持值x,寄存器%ecx保持值y 皮革 (%eax、%ecx、4),%edx将值x+4y分配给寄存器%edx 0xB(,%ecx,5),%edx将把值0xB+5y=11+5y赋给%edx 皮革 (%eax、%eax、2),%eax将值3x分配给寄存器%eax 希望这有帮助 |
Zaratustra · 难以理解机器指令的执行 10 年前 |