首页 > 其他 > 详细

汇编 书上实验

时间:2020-05-09 21:20:52      阅读:57      评论:0      收藏:0      [点我收藏+]

 

实验五   看看大佬的地方: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字节,以此类推! 

---

组合后的实际地址=段寄存器内容×16+偏移量寄存器内容,从这个公式可以看到,每一个段的地址都对齐在16的倍数上。

/  这个符号是取整 

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!