昨日阅读“一个都不能有”,发现一个以前没有注意过的现象,就是编译器对四则运算(至少是四则运算)的一个编译约定,就是无论元操作数、目的操作数是什么,计算过程中都要转换为机器字长的操作数进行运算。
看完之后发现平时写程序时都未曾注意到这个特性,心中十分焦急,今日得回实验室,略编小程序一试,果然,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的加法了。
阅读(1658) | 评论(0) | 转发(0) |