汇编语言(王爽)实验五 编写,调试具有多个段的程序

实验内容

  1. 将下面的程序编译、连接,用debug加载、跟踪,然后回答问题
    汇编语言(王爽)实验五 编写,调试具有多个段的程序_第1张图片
    汇编语言(王爽)实验五 编写,调试具有多个段的程序_第2张图片
    汇编语言(王爽)实验五 编写,调试具有多个段的程序_第3张图片
    汇编语言(王爽)实验五 编写,调试具有多个段的程序_第4张图片
    在这里插入图片描述
    (1)Data段的数据没变
    (2)cs=04B0h、ss=04AFh、ds=04AEh
    (3)设code段的段地址为x,则data段的段地址为x-2,stack段的段地址为x-1因为一个段的大小为64kb。
  2. 将下面的程序编译、连接,用debug加载、跟踪,然后回答问题
    汇编语言(王爽)实验五 编写,调试具有多个段的程序_第5张图片
    汇编语言(王爽)实验五 编写,调试具有多个段的程序_第6张图片 汇编语言(王爽)实验五 编写,调试具有多个段的程序_第7张图片
    汇编语言(王爽)实验五 编写,调试具有多个段的程序_第8张图片
    在这里插入图片描述
    (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
  3. 将下面的程序编译、连接,用debug加载、跟踪,然后回答问题
    汇编语言(王爽)实验五 编写,调试具有多个段的程序_第9张图片汇编语言(王爽)实验五 编写,调试具有多个段的程序_第10张图片
    汇编语言(王爽)实验五 编写,调试具有多个段的程序_第11张图片汇编语言(王爽)实验五 编写,调试具有多个段的程序_第12张图片汇编语言(王爽)实验五 编写,调试具有多个段的程序_第13张图片
    (1)Data段的数据没变
    (2)cs=04AEh、ss=04B2h、ds=04B1h
    (3)设code段的段地址为x,则data段的段地址为x+3,stack段的段地址为x+4
  4. 如果将1、2、3题中的最后一条伪指令“end start”改为“end”(也就是说,不指明程序的入口),则哪个程序仍然可以正确执行?请说明原因
    解:第3个程序仍然可以正确执行,因为当exe文件被加载进内存中,首先将cs:ip指向程序的首地址,而第3个程序的程序中一开始定义的是代码段,所以cs:ip也就自然的指向了指令的首地址。第1和第2个程序的程序中一开始定义的是数据段,所以cs:ip自然指向了数据的首地址而非指令,数据段反汇编出来的是一堆杂乱的指令,所以不可执行。
  5. 程序如下,编写code段的代码,将a段和b段中的数据依次相加,将结果存到c段中。
    汇编语言(王爽)实验五 编写,调试具有多个段的程序_第14张图片
    汇编语言(王爽)实验五 编写,调试具有多个段的程序_第15张图片
    汇编语言(王爽)实验五 编写,调试具有多个段的程序_第16张图片汇编语言(王爽)实验五 编写,调试具有多个段的程序_第17张图片
    在这里插入图片描述
  6. 程序如下,编写code段的代码,用push指令将a段中的前8个字型数据,逆序存储到b段中。
    汇编语言(王爽)实验五 编写,调试具有多个段的程序_第18张图片汇编语言(王爽)实验五 编写,调试具有多个段的程序_第19张图片
    汇编语言(王爽)实验五 编写,调试具有多个段的程序_第20张图片
    汇编语言(王爽)实验五 编写,调试具有多个段的程序_第21张图片

你可能感兴趣的:(知识学习)