社区
汇编语言
帖子详情
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
打赏
收藏
mov ax,offset buf和lea ax,buf有什么区别?
我不理解lea这条指令存在的必要性,lea ax,buf就是把变量的有效地址(也就是偏移地址)装入ax,而mov ax,offset buf不也是把buf的偏移地址装入ax吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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]
张雪兰等著汇编语言程序设计第3、4章习题答案.docx
张雪兰等著汇编语言程序设计第3、4章习题答案.docx张雪兰等著汇编语言程序设计第3、4章习题答案.docx张雪兰等著汇编语言程序设计第3、4章习题答案.docx张雪兰等著汇编语言程序设计第3、4章习题答案.docx张雪兰等著汇编语言程序设计第3、4章习题答案.docx张雪兰等著汇编语言程序设计第3、4章习题答案.docx张雪兰等著汇编语言程序设计第3、4章习题答案.docx张雪兰等著汇编语言程序设计第3、4章习题答案.docx
汇编语言程序设计练习
汇编语言程序设计练习。好东西大家共享.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]
南邮课件-汇编语言程序设计-第四次作业.doc
南邮课件-汇编语言程序设计-第四次作业
学习汇编语言中断程序设计.pdf
学习汇编语言中断程序设计.pdf
微机原理与接口技术
编写程序,以统计
BUF
数据区中各有符号字节数的平均值。上机调试程序,检查程序正确性。 (2)、按照要求编程, 统计
BUF
字数据区第一个零数据后的各数据中正数及负数的个数,并分别送POSI及NEGA存储单元,试编写程序。
汇编语言
21,496
社区成员
41,618
社区内容
发帖
与我相关
我的任务
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
分享
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章