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