马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
下面是王爽的汇编语言的实验5的第二题,如果对于这道题目有疑惑的亲们可以参考参考。 实验5 编写、调试具有多个段的程序 (2)将下面的程序编译连接,用Debug加载、跟踪,然后回答问题。 assume cs:code,ds:data,ss:stack data segment dw 0123h,0456h data ends stack segment dw 0,0 stack ends code segment start: mov ax,stack mov ss,ax mov sp,16 mov ax,data mov ds,ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start ①CPU执行程序,程序返回前,data段中的数据 不变 。 ②CPU执行程序,程序返回前,CS= 0C88H ,SS= 0C87H ,DS= 0C86H 。 ③设程序加载后,CODE段的段地址为X,则DATA段的段地址为 X-2 ,STACK段的段地址为 X-1 。 ④对于如下定义的段: name segment …… name ends 如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为 ((N+15)/16)*16 。 ④解析: N分为被16整除和不被16整除。 当N被16整除时: 占有的空间为(N/16)*16 当N不被16整除时: 占有的空间为(N/16+1)*16,N/16得出的是可以整除的部分,还有一个余数,余数肯定小于16,加上一个16。 程序加载后分配空间是以16个字节为单位的,也就是说如果不足16个字节的也分配16个字节。 两种情况总结成一个通用的公式:((N+15)/16)*16 (引用) 以下是我个人的一丢丢小心得(供参考) 对于这道题目前面3题不是重点,重点在第四道,上面也有相应的解析。但是呢本人觉得上面的解析一眼看去还是很难理解的,所以,如果看了上面的解析还有疑惑的亲们可以继续往下看。 首先:假设数据用了N字节,那么在加载入内存后,实际占用的空间是多少呢?我们知道,在分配能存的时候是以16字节来分配的,也就是说,N小于等于16字节在加载如内存的时候将分配到16字节的空间,当N大于16字节小于等于32字节在加载入内存将分配到32字节的空间,以此类推。那么现在N有两种情况: 1、N是16的倍数也就是可以被16整除,则实际分配的空间就是N字节(N/16*16) 2、N不能被16整除,则根据上面首先将N/16(取商),因为不能整除所以有余数,又因为余梳肯定小于16,所以呢余数同样分配到16字节的空间,所以(N/16(取商)+1)*16就得到实际的空间了。 得到通式(N+15)/16(取商)*16.对于为什么要+15亲们可以自己带入数字理解吧!!!
|