(1)将所给的程序编译连接,用Debug加载、跟踪,然后回答问题。

  源代码书本已给出,故在此不展示,调试程序。

  

<1>cpu执行程序,程序返回前,data段中的数据是多少?

0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h,可以发现数据并没有改变。

<2>cpu执行程序,程序返回前,cs=076Ch,  ss=076Bh, ds=076Ah

<3>设程序加载后,code段的地址为X,则data段的地址 X-2,stack段为X-1

(2)将所给的程序编译连接,用Debug加载、跟踪,然后回答问题。

  这题和题目一差不多,只不过这边是2个数据。

 

<1>cpu执行程序,程序返回前,data段中的数据为多少?

0123h,0456h,也和原来一样。

<2>cpu执行程序,程序返回前,cs=076Ch,ss=076Bh,ds=076Ah

<3>设程序加载后,code段的短地址为X,则data段的短地址为X-2,stack段的短地址为X-1

<4>对于如下定义的段:
      name segment
      …
      name ends
     如果段中的数据占N个字节,则程序加载后该段实际占有的空间为        N除以16向下取整(即如果N为17则取1)*16 + 16, 即 ([N/16] + 1)*16。

因为这边每段之间相隔一个地址即如果 a段的地址为 076A, 则b段的地址为076B, 当然a段的字节数不能超过16,入超过哪怕只是1个字节,那b 就变成076C。

 

(3)将所给的程序编译连接,用Debug加载、跟踪,然后回答问题。

  和前面两题差不多。

<1>CPU执行程序,程序返回前,data段中的数据为多少?

0123h, 0456h, 和原来的一样。

<2>CPU执行程序,程序返回前,cs=076Ah,ss=076Eh,ds=076Dh.

<3>设程序加载后,code段的短地址为X,则data段的短地址为__X+3__,stack段的短地址为__X+4__。

 

(4)如果将(1),(2),(3)题中的最后一条伪指令end start改为end(也就是说,不指明程序的入口个),则哪个程序仍然可以正确执行?请说明原因。

第三给程序能够正确的运行,因为当不指明程序的入口时,cs:code segment的默认ip为0,第三个程序在ip为0时正好对应程序的开始的地方,前面的两个ip对应的是存数据的地方故会错。

如图所示,这是第一题的代码,数据为data dw写入的数据。故解析指令的时候出错。

(5)程序如下,编写code段中的代码,将a段和b段中的数据依次相加,将结果存放到c段中。

代码如下:

  

assume cs:code
a segment 
        db 1, 2, 3, 4, 5, 6, 7, 8
a ends

b segment
        db 1, 2, 3, 4, 5, 6, 7, 8
b ends

c segment
        db 0, 0, 0, 0, 0, 0, 0, 0
c ends

code segment
start:  mov ax, a
        mov ds, ax
        mov bx, 0
        mov cx, 8
s:      mov dl, ds:[bx]
        add dl, ds:[bx+16]
        mov ds:[bx+32], dl
        add bx, 1
        loop s

        mov ax, 4c00h
        int 21h
        
code ends

end start

  

这里直接用ds+16, 利用了上面的实验推出的结论, 不同段之间相差1,即16个字节,这样省去将b的地址也存下然后相加的过程,可以看到成功将a,b的数据对应一一相加存入到c中。

(6)编写code段中的代码,用push指令将a段中的前8个字型数据,逆序存储到b段中。

assume cs:code

a segment
        dw 1, 2, 3, 4, 5, 6, 7, 8, 9, 0ah, 0bh, 0ch, 0dh, 0eh, 0fh, 0ffh
a ends

b segment
        dw 0, 0, 0, 0, 0, 0, 0, 0
b ends

code segment
start:  mov ax, a
        mov ds, ax

        mov ax, b
        mov ss, ax
        mov sp, 10h
        
        mov bx, 0
        mov cx, 8
s:      push ds:[bx]
        add bx, 2
        loop s

        mov ax, 4c00h
        int 21h

code ends

end start

  因为栈要分配16个字节,即ss:0~ss:f,而在栈空时栈指针sp应该指向栈底的下一个单元即为ss:10h,所以赋值sp为10h。令循环次数cx为8,执行循环s,实现用push指令将a段中的前8个字型数据,逆序存储到b段中。

用d查看后,可以发现我们成功。