+ -
当前位置:首页 → 问答吧 → 【虎彡】offset与lea的区别

【虎彡】offset与lea的区别

时间:2010-12-20

来源:互联网


  问1:OFFSET只能取得标号的偏移 LEA呢?

  问2:我看到别人说offset用于全局变量,lea用于局部变量。 什么是全局变量,什么事局部的呢?

  问3:我还听说 mov bx,offset xx 和lea bx,xx 的指令周期是不一样的, lea要长 我记得有个指令周期 还有个什么周期我忘 了 貌似是指指令长度、大小的 那个叫什么周期来着? 

  问4:指令周期是不是指令的执行时间?

作者: znxllyuan   发布时间: 2010-12-20

1.都可以的,LEA还可以做一些四则运算
2.局部变量就是一个临时开辟的内存空间,比如在函数中,函数执行完毕,会将局部变量所占的内存归还,不再占用.全局变量是和局部变量存放的位置不同,不是在栈上了,当整个程序执行完毕后,全局变量被释放.两者的生命期不同
3.不了解,指令字节数?
4.好象是的

作者: va_zaixuexi   发布时间: 2010-12-20

offset是伪指令;lea是硬指令;offset在编译阶段得出偏移地址;lea在程序执行的时候才去的偏移地址;
offset经过编译后,得到的是操作数是一个数值。从速度上来说,要比lea来得快! 但是,从复杂度和灵活性来说,lea则远远超过offset。

以上个人理解。

作者: masmaster   发布时间: 2010-12-20

1、offset只能取静态地址(静态变量、函数、标号),lea可以取各种储存期寻址方式的地址(例如基址+变址+偏移量)。
2、不是全局和局部变量(根据作用域区分),是静态和动态变量(根据分配方式区分)。
3、现在的CPU这两条指令的周期都是一样的。
4、可以说是。

作者: cnzdgs   发布时间: 2010-12-20


 LEA 用于取全局变量的偏移也没报错啊~ 

 

作者: znxllyuan   发布时间: 2010-12-20

问1:OFFSET只能取得标号的偏移 LEA呢?
答:offset是运算符,“offset 变量或标号”得到的是一个立即数,这个数在编译时就被算出,然后用这个数代替源程序中的offset,而lea是一条指令,执行时把那个地址的偏移值送目标操作数。所以offset是立即数寻址,lea是存储器的某种寻址。

问2:我看到别人说offset用于全局变量,lea用于局部变量。 什么是全局变量,什么事局部的呢?
答:我倒是没见过这种说法。
在汇编中,全局变量是指被“public”(应该是它)说明的变量,一个模块中定义了,其它模块只要用“外部符号(extra?)”说明就可使用,大家用的都是同一个地址。而局部变量就是各模块自己定义的变量,编译完变成各自的地址,即使源程序中2模块用了同一个变量名,编译完以后也使用各自的单元。

问3:我还听说 mov bx,offset xx 和lea bx,xx 的指令周期是不一样的, lea要长 我记得有个指令周期 还有个什么周期我忘 了 貌似是指指令长度、大小的 那个叫什么周期来着?  
答:指令长度是指编译后的机器代码占得字节数,比如mov ax,0001编译成B80001(好像是这几个数),它占3个字节,所以这条指令的长度是3。指令周期数是执行这条指令用多少个指令周期,每个指令周期所用时间是CPU主频的倒数。比如80386的某个CPU的主频是133MHz,表示一个指令周期用1/(133*10^6)秒,如果这条指令是5个指令周期,那执行它需要5/(133*10^6)秒。

问4:指令周期是不是指令的执行时间?
答:见问3.

作者: shzhfu   发布时间: 2010-12-20