mov ax,offset buf和lea ax,buf有什么区别?

mbctb 2010-05-04 05:09:36
我不理解lea这条指令存在的必要性,lea ax,buf就是把变量的有效地址(也就是偏移地址)装入ax,而mov ax,offset buf不也是把buf的偏移地址装入ax吗?

...全文
1970 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Beyond_cn 2010-05-06
  • 打赏
  • 举报
回复
动态分配的变量。。。
wibnmo 2010-05-05
  • 打赏
  • 举报
回复
1.mov 比 lea更快。
2.offset 只能与简单的符号地址相连,而不能和value[si]、[si]等复杂操作数相连。
raiky 2010-05-05
  • 打赏
  • 举报
回复
lea和offset,以及另外类似的一个addr,三者的主要区别在于,offset和addr是伪操作符,而lea是属于指令的,offset是取变量地址的伪操作符,它仅仅将变量的地址代替到指令中,这个操作是在编译时完成而不是运行时。
对于局部变量,它是用EBP来做指针操作的,因此在编译时,其地址值不确定的,所以不能用offset来获取,因此要用到lea指令。lea指令是在运行时按照ebp的值计算出地址的。
当在invoke伪指令的参数中用到局部变量的值,则用addr来表示。当addr后跟全局变量名时,编译器按照offset使用,如果是局部变量名,则编译器会用lea指令取地址。
pj2010 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hns888 的回复:]
lea ax,buf 执行时才会将buffer的地址放入ax;offset 是伪指令
mov ax,offset buf在编译时就已经计算buf的地址
假设 buf地址为0x1111,则mov ax,offset buf 编译后为 mov ax,0x1111 执行效率可见一斑.
[/Quote]
如果对于局部变量来说他们就是不同了,局部变量是在执行的时候才分配的地址,如果用offset就会错了,它是在执行之前计算地址的,而lea是在执行之后计算的,这才是正确的地址。
mbctb 2010-05-04
  • 打赏
  • 举报
回复
"倒是1楼指出的lea edi, buf[esi + ecx * 4]很能说明问题,可是我还是觉得这条指令等同于mov ax,offset buf + esi + ecx*4"

这句话有点问题,好象这条指令不成立?mov ax,offset buf + esi + ecx*4

如此说来,只有在这种情况下,lea才有其存在的必要性。



大熊猫侯佩 2010-05-04
  • 打赏
  • 举报
回复
有些变量的地址是编译时无法得到的,比如stack变量的地址。

这时无法用offset取得这样变量的地址,只能用lea。

编译时和运行时是非常不同的,还得继续体会一下。
mbctb 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mydo 的回复:]
offset是编译时计算,lea是运行时计算,差别大了。
[/Quote]
我还是不太懂。比如buf的偏移地址是1234h,那么mov ax,offset buf这条指令在编译后就变成mov ax,1234h。这个没有问题,我懂。

但是,lea ax,buf不是一样吗?要知道,在编译成指令以后,变量名就不存在了,存在指令中的只能是变量的地址,这个地址代表变量。

好的,lea ax,buf这条指令,就是“把地址为1234h的那个变量的地址传送到ax寄存器”,我看不出与mov ax,offset buf的区别。

倒是1楼指出的lea edi, buf[esi + ecx * 4]很能说明问题,可是我还是觉得这条指令等同于mov ax,offset buf + esi + ecx*4
大熊猫侯佩 2010-05-04
  • 打赏
  • 举报
回复
offset是编译时计算,lea是运行时计算,差别大了。
Treeyan 2010-05-04
  • 打赏
  • 举报
回复
对哦,lea 变址运算滴时候相当快
hns888 2010-05-04
  • 打赏
  • 举报
回复
lea ax,buf 执行时才会将buffer的地址放入ax;offset 是伪指令
mov ax,offset buf在编译时就已经计算buf的地址
假设 buf地址为0x1111,则mov ax,offset buf 编译后为 mov ax,0x1111 执行效率可见一斑.
2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 mbctb 的回复:]
我不理解lea这条指令存在的必要性,
[/Quote]
试试
lea edi, buf[esi + ecx * 4]
汇编语言程序设计练习。好东西大家共享.1、简述标志寄存器各个位的含义。(2.1) 2、简述8086机器代码格式。 (2.2) 3、分别指出下列指令中源操作数和目的操作数的寻址方式。(2.2)  (1)MOV SI,100  (2)MOV CX,DATA[SI]  (3)MOV [SI],AX  (4)PUSHF 4、假定DS=2000H,SS=1500H,SI=00A0H,BX=0100H,BP=0010H,数据变量VAL的偏移地址为0050H,请指出下列指令中源操作数字段是什么寻址方式?它的物理地址是多少?(2.2)  (1)MOV AX,100H  (2)MOV AX,[100H]  (3)MOV AX,[BP]  (4)MOV AX,VAL[BX][SI] 5、试分别说明下列各指令中源操作数和目的操作数使用的寻址方式。(2.2)  (1)AND AX,0FFH  (2)AND BL,[0FFH]  (3)MOV DS,AX  (4)CMP [SI],CX  (5)MOV DS:[0FFH],CL  (6)SUB [BP][SI],AH  (7)ADC AX,0ABH  (8)OR DX,-35[BX][DI]  (9)PUSH DS 6、给定(BX)=637DH (SI)=2A9BH 位移量D=7237H,试确定下列各种寻址方式下的有效地址是什么?(2.2)  (1)直接寻址   (2)使用BX的寄存器寻址   (3)使用BX的间接寻址  (4)使用BX的寄存器相对寻址   (5)基址变址寻址   (6)相对基址变址寻址 7、指出下列指令中的错误。(2.3)  (1)MOV AH,BX  (2)MOV [BX],[SI]  (3)MOV AX,[SI][DI]  (4)MOV BYTE PTR[BX],1000  (5)MOV CS,AX 8、计算下列4条指令中操作数的地址并指出执行结果。(2.3)  (1) MOV 1[BX+SI],AX  (2) MOV 2[BP+SI],BX  (3) MOV 3[BX+DI],CX  (4) MOV 4[BP+DI],DX 假定执行前: (DS)=1000H, (SS)=2000H, (BX)=300H, (BP)=400H, (SI)=50H, (DI)=60H, (AX)=12H, (CX)=13H, (DX)=15H. 9、指出下列指令的功能。(2.3) MOV BX,OFFSET TAB MOV AL,4 XLAT TAB 10、分别指出下列各条指令的功能。(2.3) MOV SI,OFFSET NUM LEA SI,NUM MOV AX,[SI] LEA AX,[SI] LEA DI,4[SI]

21,496

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧