<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
在语法上, 我们通常认为以下的两条语句是等价的:
mov ecx, offset DATA_LABLE //其中DATA_LABLE是数据定义标签
lea ecx, DATA_LABLE
而更进一步, 我们也会认为以下两句是等价的:
mov ecx, ebp-8
lea ecx, [ebp-8]
第一种, 用的是存储器寻址方式; 而第二种, 用的是寄存器寻址和寄存器间接寻址方式. 让我意想不到的是, 在第二种情况下, vc的处理并没有让寄存器寻址和寄存器间接寻址方式的mov和lea两者之间实现等价. 在使用 _asm{} 的方式将"mov ecx, ebp-8"这条语句括起来编译之后, 很遗憾地, 我在vc的反汇编窗口发现它变成了这样的一条语句: "mov ecx, ebp". 啊哦, 我的"-8"竟然不翼而飞了! 到目前为止, 我尚没有查到造成这种现象的原因所在, 我只能暂时将它归为vc的bug了.
对gcc下会不会存在这个问题呢? 为更进一步证实, 我使用gcc重新写了这句代码: "mov ecx, ebp-8", 但重写后的代码由当初的一句变成了这样的两句:
movl %ebp, %ecx
subl $8, %ecx
之所以改写成这样的两句, 是因为我发现在AT&T的汇编语法中, 对于双寄存器寻址的操作, 不能对寄存器取的值作任何变换, 也就是说不能写成"movl %ebp-8, %ecx"的形式, 而寄存器间接寻址的操作就可以作变换, 比如:
movl -8(%ebp), %ecx 此句相当于intel asm里的: mov ecx, [ebp-8]
movl (%ebp, %eax), %ecx 此句相当于intel asm里的: mov ecx, [ebp+eax]
movl (%ebp, %eax, 4), %ecx 此句相当于intel asm里的: mov ecx, [ebp+eax*4]
movl -8(%ebp, %eax, 4), %ecx 此句相当于intel asm里的: mov ecx, [ebp+eax*4-8]
从以上几条语句来看, 似乎AT&T语法对寄存器间接寻址方式的支持没有intel asm更具人性化, 但我猜想AT&T之所以采用这样的方法, 可能一定程度上也是为了提高微指令级的执行效率.
当然, "mov ecx, ebp-8"这句也可以改写成这样的两句:
subl $8, %ebp
movl %ebp, %ecx
但一般不会这么作, 道理是很显然的, ebp通常会作为函数内的基址寄存器, 用于存放函数入口点的堆栈首地址, 这个值的改变会直接影响其后语句对局部变量以及函数参数的引用发生变化, 所以, 在函数首部之后的执行体中, ebp通常是不允许被改变的, 这也是我们设计自己的汇编代码时所应该遵循的原则.
不知道vc为什么会将ebp之后的立即数作丢弃处理, 这显然是没有道德的行为. 这让我想起了这样的一句话: 不要试图帮助用户去纠正错误, 而是当错误发生时去提醒用户, 因为程序再聪明也不会始终明白设计者的真正意图 ,我们所需要作的就是"为异常捕获提供尽可能详细的日志, 并及时通知用户这种异常, 试图纠正异常的作法从方法上就是错误和愚蠢的".
分享到:
相关推荐
asm-1.3.3.jar, asm-1.3.4.jar, asm-1.3.5.jar, asm-1.4.1.jar, asm-1.4.2.jar, asm-1.4.3.jar, asm-1.4.jar, asm-1.5.1.jar, asm-1.5.2.jar, asm-1.5.3.jar, asm-2.0.jar, asm-2.1.jar, asm-2.2.1-sources.jar, asm...
cglib动态代理模式jar包 cglib-2.2.jar asm-tree.jar asm-commons.jar asm.jar
org.springframework.asm-3.0.5.RELEASE.jar
asm-attrs.jar asm-attrs.jar asm-attrs.jar
rhel-asm包括kmod-oracleasm-2.0.6.rh1-2 kmod-oracleasm-2.0.6.rh1-3.el6.x86_64和 kmod-oracleasm-2.0.6.rh1-3.el6.x86_64
asm-2.2.3.jar辛辛苦苦从官网上下载的 asm-2.2.3.jar辛辛苦苦从官网上下载的 asm-2.2.3.jar辛辛苦苦从官网上下载的
kmod-oracleasm-2.0.6.rh1-3.el6.x86_64.rpm和Oracleasmlib、Oracleasm-support,
严重: Exception sending context initialized event to listener instance ... nested exception is java.lang.NoClassDefFoundError: org/objectweb/asm/Type ssh 框架的java web项目部署到tomcat报上面错误 添加此包
标签:asm-util.jar.zip,asm,util,jar.zip包下载,依赖包
rg.springframework.asm-3.0.1.RELEASE-A.jar
asm-3.2.rarasm-3.2.rarasm-3.2.rarasm-3.2.rarasm-3.2.rarasm-3.2.rarasm-3.2.rar
asm-3.1.jarasm-3.1.jarasm-3.1.jarasm-3.1.jarasm-3.1.jarasm-3.1.jarasm-3.1.jar
asm-util-1.3.4.jar, asm-util-1.3.5.jar, asm-util-1.4.1.jar, asm-util-1.4.3.jar, asm-util-1.5.1.jar, asm-util-1.5.2.jar, asm-util-1.5.3.jar, asm-util-2.0.jar, asm-util-2.1.jar, asm-util-2.2.1-sources....
asm-3.2.jar
这是spring-asm-3.1.0.RELEASE.jar,为了使用方便传上来.
EditPlus是很好用的编辑软件 但网上下的很多EP版本需要自己添加asm.acp,asm.stx,不是很方便 这个里面附带了asm.acp,asm.stx
适用与redhat6.4安装oracleasm,kmod-oracleasm-2.0.6.rh1-2.el6.x86_64.rpm
最新版 asm-3.3.1.jar asm.jar