鱼C论坛

 找回密码
 立即注册
查看: 1732|回复: 1

[技术交流] 实验5(2)分析

[复制链接]
发表于 2014-9-20 18:24:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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亲们可以自己带入数字理解吧!!!

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-20 21:18:36 | 显示全部楼层
嗯哼,分析的不错哦,第四题的重点就是DOS下内存分配规则。是以16字节为单位分配的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 12:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表