关于csapp第三章的一个问题

    最近在读csapp第三章的时候,习题3.49中有一段汇编代码让我十分费解。具体汇编代码如下:

关于csapp第三章的一个问题

看了许久我始终不明白为什么第五行中计算数组大小时采用8n + 22。毕竟按照我的理解只需要8n就够了。

然后按照题目中的提示,回忆了一下第二章中计算右移时的操作。通常会在右移时加上对应的偏移量。于是我似乎明白了点什么。原来右移的时候为了避免在负数进行右移的时候因为符号位的关系导致右移结果错误,于是通常会加上对应的数据类型的偏移量。由于后面进行了右移的操作故数组大小从8n变成8n+7。那多出来的15又是怎么来的呢 ?仔细看了看第六行的操作。%rax中的值会跟-16进行与操作。这一步是为了对数组大小进行所占字节进行对齐操作。从汇编代码中可以发现,当前对齐的位数应该为16.故为了在进行与操作时避免负数的符号位造成错误,故也需要给对应的值添加上偏移量15.这样一来数组大小所需要的空间就变成了8n+22。所以当我把动态创建的数组类型分别修改为int,short,char时,所需要的数组大小分别为4n+18,2n+16,n+15。简单的一个创建数组,却包含了第二章中的位运算技巧和第三章中提到的对齐策略。微小的地方总是蕴含着很多细节呢!