汇编的一个代码 lea ecx, dword ptr [ecx+ecx*4]中的[ecx+ecx*4]为什么不写成[ecx*5]????

作者&投稿:阎雷 (若有异议请与网页底部的电邮联系)
请问这句汇编代码什么意思: LEA EAX,DWORD PTR SS:[ESP+4C],另外mov和lea有什么区别?~

将SS(stack segment堆栈段)中ESP+4C这个“地址”(注意是地址,而非地址中的值)以双字(即4个字节)放入到EAX这个寄存器中(此寄存器可存储4个字节,正好匹配你放进来的4个字节长度的地址)。“DWORD PTR ”就是将内存单元指定为双字(同理,WORD-PTR就是指定为字,BYTE-PTR就是指定为字节)。
另外mov与lea的区别:mov ax,BUFF ;是把BUFF这个内存单元中的数据放入到ax寄存器中
而 lea ax,BUFF ;是把BUFF这个内存单元的地址放入到ax寄存器中
两者区别就是一个传递的是内容,一个传递的是地址。

mov ecx,[eax+0x30]表示先运算eax+0x30得到一个结果,以这个结果为地址找一个ecx长度的内存数赋给ecx
lea ecx,[eax+0x30]表示先运算eax+0x30得到一个结果,把这个结果(mov时地址)赋给ecx
效果为ecx=eax+0x30 (这里eax参与了运算却没有改变值)
如果不用这个那要用
mov ecx,0x30
add ecx,eax
从指令长度和执行速度来看.lea ecx,[eax+0x30]要好.

lea ecx, dword ptr [ecx+ecx*4]
写成
lea ecx, dword ptr [ecx*5] 的确没有任何差别(可能是为了便于理解才那样写的,比如数组寻址)

但是你说的把
lea ecx, dword ptr [ecx+ecx*4](这里没用mov指令是因为lea指令执行效率比mov高)
lea ecx, dword ptr [eax+ecx*2]
写成
lea ecx, dword ptr [eax+ecx*10] 也没问题啊
等价的
至于为什么要分两步写,很可能是为了便于理解吧,字符数组的寻址过程,一步步写出来而已
还有问题么?

ecx+ecx*4 计算应该是这样的ecx+ecx左移2 ,貌似cpu执行比ecx*5效率高吧。。个人见解。。

因为Intel规定乘数只能是1,2,4,8中的一个
至于*5,*10根本不存在的
也根本不是什么方便理解,就是因为根本没有,就这么简单。


黑水县19594372012: 汇编的一个代码 lea ecx, dword ptr [ecx+ecx*4]中的[ecx+ecx*4]为什么不写成[ecx*5]???? -
叶殃澳特: lea ecx, dword ptr [ecx+ecx*4] 写成 lea ecx, dword ptr [ecx*5] 的确没有任何差别(可能是为了便于理解才那样写的,比如数组寻址)但是你说的把 lea ecx, dword ptr [ecx+ecx*4](这里没用mov指令是因为lea指令执行效率比mov高) lea ecx, dword ptr [eax+ecx*2] 写成 lea ecx, dword ptr [eax+ecx*10] 也没问题啊 等价的 至于为什么要分两步写,很可能是为了便于理解吧,字符数组的寻址过程,一步步写出来而已 还有问题么?

黑水县19594372012: 关于汇编LEA指令的问题 -
叶殃澳特: mov ecx,[eax+0x30]表示先运算eax+0x30得到一个结果,以这个结果为地址找一个ecx长度的内存数赋给ecx lea ecx,[eax+0x30]表示先运算eax+0x30得到一个结果,把这个结果(mov时地址)赋给ecx 效果为ecx=eax+0x30 (这里eax参与了运算却没有改变值) 如果不用这个那要用 mov ecx,0x30 add ecx,eax 从指令长度和执行速度来看.lea ecx,[eax+0x30]要好.

黑水县19594372012: at&t汇编lea的源操作数可以是寄存器? -
叶殃澳特: 应该是以%ecx中的数为地址,计算有效地址,结果以66H前缀存在%eax里面 lea, load effective address 读有效地址.手册上写“源操作数”只能是内存数据,这么读“寄存器”会导致invalid code/#UD异常 正确的写法应该是lea (%ecx), %eax 或者用 movl %ecx, %eax 替代

黑水县19594372012: 软件汇编,请高手帮忙LEA ECX,DWORD PTR SS:[EBP - 68]用PUSH方式显示出来. -
叶殃澳特: 在数据段找一个不用的地方一个DWORD,在当前段的后面空白地方加一段代码 ,实现放置004630A5这里得到的ECX,到数据段那个数据,从004630A5后面条到那段代码,然后再跳回来(记得补齐前面JMP的时候覆盖了的代码) 在 00463302 这里,PUSH 数据段那个DWORD地址的值即可

黑水县19594372012: 帮忙写个简单汇编基址+偏移代码
叶殃澳特: lea ecx,[6a9ec0H+768H] 这个是取地址. mov ecx,[6a9ec0H+768H]这个是取内存地址的值.

黑水县19594372012: 汇编语句的 lea ,求 高手 解说一下,
叶殃澳特: 观察下以下指令执行时堆栈和寄存器变化就知道了 MOV EAX,0X0012FF74 MOV DWORD PTR[EAX],0X12345678 LEA ECX,[EAX] 认真看你就会发现 LEA 仅仅是取EAX寄存器的数值 而不是取有效地址里面的数值

黑水县19594372012: 汇编语言中LEA,AX,AL,BX等等什么意思 -
叶殃澳特: LEA AX,AL即把AL的偏移地址送入AX寄存器,BX,BL,DI都是寄存器,汇编里面必会的,在MASM5.0环境下运行

黑水县19594372012: 汇编 LEA 指令,请高手帮我详细讲下.
叶殃澳特: 地址传递.比如:lea bx,[bx+si+10H];意思是:计算bx+si+10H的值后把计算结果存到bx里.可以理解为:mov bx,[bx+si+10H];这只是理解.在汇编语法里因为有些这类运算用mov是不允许的,但用lea却允许.这就是它们的区别.我也从没编译过汇编程序,我顶多用汇编镶入c所以具体你还是自己去实践体会.

黑水县19594372012: 一段汇编代码不知道什么意思~大家帮忙看看 -
叶殃澳特: PUSH ECX LEA EDX,DWORD PTR SS:[EBP-164] PUSH EDX CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarTstEq>] ; MSVBVM60.__vbaVarTstEq 这句,不是变量测试相等吗?

黑水县19594372012: 32位汇编语言中lea指令! -
叶殃澳特: 由编译器计算出data变量的地址,然后替换掉指令中出现data变量标识. lea指令的源操作数就是一个变量标号,所以就是将变量的地址取出来,放到目的操作数中 ===============================================================...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网