老师 发表于 2014-9-20 18:24:28

实验5(2)分析

下面是王爽的汇编语言的实验5的第二题,如果对于这道题目有疑惑的亲们可以参考参考。实验5 编写、调试具有多个段的程序(2)将下面的程序编译连接,用Debug加载、跟踪,然后回答问题。assume cs:code,ds:data,ss:stack data segment       dw 0123h,0456hdata ends stack segment       dw 0,0stack ends code segment start:mov ax,stack       mov ss,ax       mov sp,16       mov ax,data       mov ds,ax       push ds:       push ds:       pop ds:       pop ds:       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亲们可以自己带入数字理解吧!!!

小靚同学Leon 发表于 2014-9-20 21:18:36

嗯哼,分析的不错哦,第四题的重点就是DOS下内存分配规则。是以16字节为单位分配的。
页: [1]
查看完整版本: 实验5(2)分析