实验五 看看大佬的地方:https://www.cnblogs.com/kwcymino/p/10006595.html
利用doxbox
1.利用debug加载、跟踪程序
(1)先利用r命令来查看各个寄存器的值
(2)从cx中可知道程序的长度,用cx中的值减去20h(数据段和栈段已分配的空间)得到代码段的长度,用u命令精确反汇编
(3)先执行到000D之前,看看ds是否已成功指向数据段 -g:直接执行程序
(4)从上图可以看到ds已指向数据段,然后我们接着执行到程序返回前,即到001D之前,再查看一次数据段的内容
(5)从上图可以看到,数据段没有发生变化
2.书上的问题解答:
(1)程序返回前,data段中的数据为 23 01 56 04 89 07 BC 0A-EF 0D ED 0F BA 0C 87 09
(2)程序返回前,CS=076C,SS=076B,DS=076A
(3)设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1
-----也可以一直利用-t指令执行完程序。再利用-r查看状态
-----如果直接-g的话 出来的是 再利用-r查看状态反倒回到最开始的状态了
第二题:
1.利用debug加载、跟踪程序
(1)先利用r命令查看各个寄存器的值
(2)从上图的cx我们可以看到,cx的值与任务一的一样。虽然任务二只定义了两个字数据的数据段和两个字型数据当栈空间,但实际上在内存分配上还是给它们16个字节的空间,于是我用u命令精确反汇编一下
(3)再用g命令执行到000D以前,看看ds是否指向数据段data
(4)从上图看出ds已指向数据段data,再执行到程序返回前,看看数据段data的变化
(5)从上图看出,数据段没有变化
2.书上问题的解答:
(1)程序返回前,data段中的数据为 23 01 56 04
(2)程序返回前,CS=076C,SS=076B,DS=076A
(3)设程序加载后,code段的段地址为X,则code段的段地址为X-2,stack段的段地址为X-1
(4)对于如下定义的段,若段中的数据占N个字节,则程序加载后,该段实际占有的空间为((N+15)/16)*16(即数据的分配是以16个字节为单位的)
name segment : name ends
对于第四问的讲解:
因为每个段都是以16字节来对齐的,但是最大不能超过64KB 。这也就是说,如果你的段数据在16字节内,一样会被当做一个字节段来算,就是16字节。 要是大于16字节呢,那么如果多出就算是1个字节,因为已经超过一个16字节,多出来的1个字节 也得有一个字节段的容量来存储它,所以这时得占两个字节段,就是32字节,以此类推!
---
/ 这个符号是取整
N分为被16整除和不被16整除。
当N被16整除时: 占有的空间为(N/16)*16
当N不被16整除时: 占有的空间为(N/16+1)*16,N/16得出的是可以整除的部分,还有一个余数,余数肯定小于16,加上一个16。
两种情况总结成一个通用的公式:((N+15)/16)*16
解释了为啥:任务二cx的值与任务一的一样,明明定义少了。
原文:https://www.cnblogs.com/yundong333/p/12859635.html