如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为(N/16+1)*16

David_Yang 2013-09-08 08:49:18
那么一个段中的数据占16个字节呢,是不是要占2个字节???
...全文
1819 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
壮壮先生 2013-11-05
  • 打赏
  • 举报
回复 3
引用 6 楼 wangdahu888 的回复:
N分为被16整除和不被16整除。 当N被16整除时: 占有的空间为(N/16)*16 当N不被16整除时: 占有的空间为(N/16+1)*16,N/16得出的是可以整除的部分,还有一个余数,余数肯定小于16,加上一个16。 两种情况总结成一个通用的公式:((N+15)/16)*16
有用
  • 打赏
  • 举报
回复
N分为被16整除和不被16整除。 当N被16整除时: 占有的空间为(N/16)*16 当N不被16整除时: 占有的空间为(N/16+1)*16,N/16得出的是可以整除的部分,还有一个余数,余数肯定小于16,加上一个16。 两种情况总结成一个通用的公式:((N+15)/16)*16
  • 打赏
  • 举报
回复 3
因为每个段都是以16字节来对齐的,但是最大不能超过64KB 。这也就是说,如果你的段数据在16字节内,一样会被当做一个字节段来算,就是16字节。 要是大于16字节呢,那么如果多出就算是1个字节,因为已经超过一个16字节,多出来的1个字节 也得有一个字节段的容量来存储它,所以这时得占两个字节段,就是32字节,以此类推! (n/16 + 1 )*16 详细解释下:n/16 : / 这个符号是取整,就是看有几个段。小于或等于16的 除以16后,小于16取整后等于0,等于16取整后无余数还是等于0,都是等于 0,(0+1)*16 = 16字节,一个段的大小。大于16,除以后取整有余数,取整部分为多少个字节段,剩余的部分再需要一个16字节段来存储它。所以最终得到此公式:(n/16+1)*16
zara 2013-09-09
  • 打赏
  • 举报
回复
那个计算公式不对吧,至少对常见的几个汇编器来说;应该是 [(N+15)/16]*16 ,即向上到最近的 16 倍大小。
世纪殇 2013-09-09
  • 打赏
  • 举报
回复
我一直以为是这样的对齐方式 getAlign(dword size,dword align) { if(size<=align) return align; if(size%align) { return (size/align+1)*align; } else { return (size/align)*align; } }
IT保安 2013-09-09
  • 打赏
  • 举报
回复 1
段必须小于64KB, 在此以内,超过16的整数倍,也就是余数不为0,多出来的部分肯定也要有空间保存,那么就是整数倍N+1个小段来保存数据 不超过整数倍,也就是余数为0,那么刚好整数倍N个小段就够来保存数据
David_Yang 2013-09-09
  • 打赏
  • 举报
回复
引用 2 楼 wangdahu888 的回复:
因为每个段都是以16字节来对齐的,但是最大不能超过64KB 。这也就是说,如果你的段数据在16字节内,一样会被当做一个字节段来算,就是16字节。 要是大于16字节呢,那么如果多出就算是1个字节,因为已经超过一个16字节,多出来的1个字节 也得有一个字节段的容量来存储它,所以这时得占两个字节段,就是32字节,以此类推! (n/16 + 1 )*16 详细解释下:n/16 : / 这个符号是取整,就是看有几个段。小于或等于16的 除以16后,小于16取整后等于0,等于16取整后无余数还是等于0,都是等于 0,(0+1)*16 = 16字节,一个段的大小。大于16,除以后取整有余数,取整部分为多少个字节段,剩余的部分再需要一个16字节段来存储它。所以最终得到此公式:(n/16+1)*16
as far as I think,16对16取整不是1吗?16对16取模才是0吧

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧