实验内容
- 将下面的程序编译、连接,用debug加载、跟踪,然后回答问题
(1)Data段的数据没变
(2)cs=04B0h、ss=04AFh、ds=04AEh
(3)设code段的段地址为x,则data段的段地址为x-2,stack段的段地址为x-1因为一个段的大小为64kb。 - 将下面的程序编译、连接,用debug加载、跟踪,然后回答问题
(1)Data段的数据没变
(2)cs=04B0h、ss=04AFh、ds=04AEh
(3)设code段的段地址为x,则data段的段地址为x-1,stack段的段地址为x-2因为一个段的大小为64kb。
(4)如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为:
因为每个段都是以16字节来对齐的,但是最大不能超过64KB 。这也就是说,如果你的段数据在16字节内,一样会被当做一个字节段来算,就是16字节。 要是大于16字节呢,那么如果多出就算是1个字节,因为已经超过一个16字节,多出来的1个字节 也得有一个字节段的容量来存储它,所以这时得占两个字节段,就是32字节,以此类推!
(n/16 + 1 )*16 详细解释下:n/16 : / 这个符号是取整,就是看有几个段。小于或等于16的 除以16后,小于16取整后等于
0,等于16取整后无余数还是等于0,都是等于 0,(0+1)*16 = 16字节,一个段的大小。大于16,除以后取整有余数,取整部分为多少个字节
段,剩余的部分再需要一个16字节段来存储它。所以最终得到此公式:(n/16+1)*16 - 将下面的程序编译、连接,用debug加载、跟踪,然后回答问题
(1)Data段的数据没变
(2)cs=04AEh、ss=04B2h、ds=04B1h
(3)设code段的段地址为x,则data段的段地址为x+3,stack段的段地址为x+4 - 如果将1、2、3题中的最后一条伪指令“end start”改为“end”(也就是说,不指明程序的入口),则哪个程序仍然可以正确执行?请说明原因
解:第3个程序仍然可以正确执行,因为当exe文件被加载进内存中,首先将cs:ip指向程序的首地址,而第3个程序的程序中一开始定义的是代码段,所以cs:ip也就自然的指向了指令的首地址。第1和第2个程序的程序中一开始定义的是数据段,所以cs:ip自然指向了数据的首地址而非指令,数据段反汇编出来的是一堆杂乱的指令,所以不可执行。 - 程序如下,编写code段的代码,将a段和b段中的数据依次相加,将结果存到c段中。
- 程序如下,编写code段的代码,用push指令将a段中的前8个字型数据,逆序存储到b段中。