当前位置: 代码迷 >> 汇编语言 >> 求问leal指令的一个有关问题
  详细解决方案

求问leal指令的一个有关问题

热度:203   发布时间:2016-05-02 04:28:32.0
求问leal指令的一个问题
我看到gcc产生了下面这种代码,leal -4(%ebp), %eax
这个是不是把ebp里面存储的地址减去4了之后放在eax里,因为它是要调用scanf,所以需要传递地址?
但是如果确实是取地址的话有时候又说不通,比如:
1. leal 0x0(,%ebx,4), %edx (假设ebx里面存的是x)
那么根据代码,它的效果是edx里的值是4*x,这和取地址好像很不一样啊。
2. leal -1(%ebx), %eax     (ebx放的是n,根据它的注释,这句话是计算n-1,并放在eax中)
请问大神,这个leal到底是个什么意思呢?
------解决思路----------------------
leal 0x0(,%ebx,4), %edx (假设ebx里面存的是x)
这条指令是 0+4*R[%ebx]    ebx里面是一个偏移量  比如数组int  A[10];  我要访问 A[5] 的地址 就要 leal  (%edx,%ebx,4) ,%eax
这里 %edx是数组的首地址 %ebx是索引。结果就是 %edx就是A吧 ,%ebx就是5吧   ,至于后面4这是由于int是四个字节。现在你应该明白为什么第三个数只能是1,2,4,8这四个数了吧。
leal 指令就是加载有效地址。
------解决思路----------------------
你对leal -1(%ebx), %eax的理解稍显生硬。难道不可以理解为在一条指令中将ebx-1然后放入eax中吗?

当然lea的所谓一般用法是取偏移地址,但要有一点,哪怕一点黑客思维呀!

你要看到它实际的效果而不是书上死板的用法。
------解决思路----------------------
引用:
Quote: 引用:

《The Intel 64 and IA-32 Architectures Software Developer's Manual》

额,我下载了,可是搜"leal"了3429页却告诉我没搜到这个指令。。。
另外这是leal,是AT&T格式的汇编,intel的指令集应该查不到吧


intel指令集有两种格式一种为intel格式另一种即为你说的at&t格式,他们都对应intel指令。leal自然也对应intel指令集中的lea指令,不过使用了at&t特有的格式语法后面加l表示操作数的特性为long型。
------解决思路----------------------
leal命令我也不是很清楚,但是它有两个用法。1,将有效地址写入到目的操作数。2,可以简洁地描述普通的算术操作。如果不是很理解可以看一下《深入理解计算机系统》这本书的第118页倒数的几行。我个人觉得可以这样理解。如果你的%ebx存的是存储器里的一个数的地址,那么使用leal指令的用法就是加载有效地址到目的操作数,属于用法1。如果你的%ebx存的是一个数字而已,不代表其他的意思,那么这个就是普通的算术运算,这样可以实现一些加减乘法,属于用法2。leal的用法还是比较灵活的。
  相关解决方案