对于第(1)~(3)题
基本都是在dosbox中编译连接,程序返回前,data段的数据都不变
使用debug的u命令查看cs,ss,ds值,以及在程序中定义的段的顺序
求差即可知当cs为X时,ss,ds为多少
第(3)题最后一小问,对于如此定义的段,数据占用N字节,则实际占用多少字节?
这里有个特性,内存分配是以16个字节为单位的,若数据不足16个字节,也要分配16个字节
若N%16=0,则实际空间为 ( N/16 ) * 16
若N%16!=0,则实际空间为 ( N / 16 + 1) * 16
总结下来公式即为 ( ( N + 15 ) / 16 ) * 16
具体原理请看https://blog.csdn.net/weixin_30569001/article/details/95053431
第(4)题,若不指明程序入口,则默认从内存分配的顺序执行,即头开始执行,只有(3)的程序是cs段在最前的,可以正确执行
第(5)题
我这里使用栈段,ss 指向 c段
es指向b段,ds指向a段
共用一个寄存器bx作为偏移地址进行mov,add运算
第(6)题
利用栈逆序存储,要注意的将b段作为栈段去push进来数据,b段所开辟的空间是8个字,即16字节,0~F,栈底sp需要设为16,从底到上进行push