Chinaunix首页 | 论坛 | 博客
  • 博客访问: 337198
  • 博文数量: 105
  • 博客积分: 2730
  • 博客等级: 少校
  • 技术积分: 1110
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-20 12:09
文章分类

全部博文(105)

文章存档

2013年(3)

2012年(2)

2011年(36)

2010年(34)

2009年(6)

2008年(20)

2007年(4)

分类: C/C++

2008-07-21 18:59:26

昨日阅读“一个都不能有”,发现一个以前没有注意过的现象,就是编译器对四则运算(至少是四则运算)的一个编译约定,就是无论元操作数、目的操作数是什么,计算过程中都要转换为机器字长的操作数进行运算。
看完之后发现平时写程序时都未曾注意到这个特性,心中十分焦急,今日得回实验室,略编小程序一试,果然,short+short=short的运算,中间过程果然是32位的加法啊,另有发现,加法居然是用lea这等指令做的……想来也觉得有趣,难道lea真的比mov快上一点?
 
1:这是从栈中取两个操作数到寄存器,muvzwl就是movsx指令(mov且符号扩展),相当于从short到int的一个强制类型转换。
movzwl -6(%ebp), %edx
movzwl -8(%ebp), %eax
 
2:这下晕了,没有add的踪影,leal是何玩意?edx是基址,eax是变址,组合好后的地址放到eax里地址,这就是加法,并且更加灵活啊(居然能有3操作数??)。
leal   (%edx,%eax), %eax
 
3:保存结果,把计算的结果截断然后存回。补码的有无符号的加法做起来本来是没有区别,所以short+short在int长度下的计算就用0扩展相加再截断,结果和short+short是一样的。
movw %ax, -10(%ebp)
 
而short+short = int的运算用的就是符号扩展了,在short+short的时候,已经是int的加法了。
阅读(1629) | 评论(0) | 转发(0) |
0

上一篇:my vimrc

下一篇:simple scalar

给主人留下些什么吧!~~