一条简单的指令!
本人菜鸟!
ebx ---> val
edx ---> nval
eax ---> t
int t = val + nval; ------> leal (%edx,%dbx) , %eax
leal (%edx,%dbx) , %eax ??????????? 为什么会一句就完成了两个操作(add , mov)???给我解释详细点呗!这是我从书上看到的,大家见笑了!
问题点数:40、回复次数:7Top
1 楼rainvoid()回复于 2005-07-25 15:10:21 得分 0
我的理解是(%edx,%dbx)是一个寻址操作,但怎么会是val + nval的地址呢?Top
2 楼rainvoid()回复于 2005-07-26 10:41:47 得分 0
再加问一个,有的代码是这样的:
一条mov指令就能完成的任务,却用先push,后pop来实现,为什么?我知道用左移位可以实现乘法,类似的常识性的技巧还有哪些,请推选给我一篇这样的文章,愿以100分相赠!!!
Top
3 楼mydo(侯佩|hopy|ks)回复于 2005-07-26 12:52:07 得分 3
这个...是看过不少技巧文章,但一下子要找出来,还真不太容易,这是慢慢积累的。Top
4 楼hackingtruth(尘封)回复于 2005-07-27 17:23:47 得分 3
呵呵 高手把心得贴出来让大家看看喽Top
5 楼rainvoid()回复于 2005-07-27 22:29:19 得分 0
写错了,是ebx,谁来告诉我第一个问题吧!!!Top
6 楼zara(Kyrie eleison)回复于 2005-07-28 09:52:58 得分 34
leal (%edx,%dbx), %eax 首先要了解 lea 指令的作用吧, 它是把经过计算的源操作数表示的内存地址赋给目的操作数寄存器. 这里的源操作数是 (%edx, %ebx), 所表示的内存地址就是 edx+ebx 了, 所以, 整个指令的实际的结果就是 edx+ebx -> eax. 随着 386p 模式下寻址方式的增强, lea 指令的另外的一个作用, 即数值计算功能, 也越来越多地得到了应用. 还是举个例子吧, 下面的这部分代码是 Windows 2000 的 shell32.dll 中由颜色计算亮度, 以选择合适的桌面文字色的计算过程:
(shell32 版本为 5.00.2920.0000, 下面代码的起始地址为 775B3AD6)
push 001
call GetSysColor ;USER32.DLL
mov [esi],eax
mov eax,[esi]
push 001
movzx ecx,byte ptr [esi] ; Red
shr eax,010
movzx eax,al ; Blue
lea ecx,[eax][ecx]*2 ; R*2 + B -> ecx
xor eax,eax
mov al,[esi][00001] ; Green
movzx eax,al
lea eax,[eax][eax]*4 ; G*5 -> eax
add ecx,eax ; G*5 + R*2 + B -> ecx
xor eax,eax
cmp ecx,000000400
上面代码中的两次简单的相乘和累加, 都是通过 lea 指令来完成的, 而不是一般会使用到的 mul/add 指令Top
7 楼rainvoid()回复于 2005-08-01 10:24:23 得分 0
多谢支持!!!Top




