实验5 编写、调试具有多个段的程序

1.将下面的程序编译、连接、用Debug加载、跟踪,然后回答问题。

assume cs:code,ds:data,ss:stack

data segment
      dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
data ends
stack segment
     dw 0,0,0,0,0,0,0,0
stack ends

code segment

start:   mov ax,stack
           mov ss,ax
           mov sp,16

           mov ax,data
           mov ds,ax

           push ds:[0]
           push ds:[2]
           pop ds:[2]
           pop ds:[0]

           mov ax,4c00h
           int 21h

code ends

end start

 

(1)CPU执行程序,程序返回前,data段中的数据为0123h

(2)CPU执行程序,程序返回前,CS=076c、SS=076b、DS=076a。

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

2.将下面的程序编译、连接,用debug加载、跟踪,然后回答问题。

assume cs:code,ds:data,ss:stack

data segment
     dw 0123h,0456h
data ends

stack segment
     dw 0,0
stack ends

code segment

start:  mov ax,stack
          mov ss,ax
          mov sp,16

          mov ax,data
          mov ds,ax

          push ds:[0]
          push ds:[2]
          pop ds:[2]
          pop ds:[0]

          mov ax,4c00h
          int 21h
code ends
end start
      

(1)CPU执行程序,程序返回前data段中的数据为0123h

(2)CPU执行程序,程序返回前,CS=076c、SS=076b、DS=076a。

(3)设程序加载后,code段的段地址为X,则data段中的段地址为X-2,stack段的段地址为X-1。

(4)对于如下定义的段:

name segment

...

name ends

如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为

N<=16时,占有的空间为16字节,N>16时,占有的空间为[N/16]*16

3.将下面的程序编译、连接,用debug加载、跟踪,然后回答问题。

assume cs:code,ds:data,ss:stack

code segment

start:    mov ax,stack
            mov ss,ax
            mov sp,16

            mov ax,data
            mov ds,ax

            push ds:[0]
            push ds:[2]
            pop ds:[2]
            pop ds:[0]

            mov ax,4c00h
            int 21h

code ends

data segment

  dw 0123h,0456h

data ends

stack segment

   dw 0,0

stack ends

end start

(1)CPU执行程序,程序返回前,data段中的数据为0123h

(2)CPU执行程序,程序返回前,CS=076a、SS=076e、DS=076d

(3)设程序加载后,code段的段地址为X,则data段中的段地址为X+3,stack段的段地址为X+4。

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

虽然实验1、2都能通过汇编、连接、运行,但是反汇编后出现了令人看不懂的指令

实验3可以正确执行

从表面上看,3个实验的差异是实验3将代码段写在数据段和栈段之后,第1、2个实验数据段和栈段不是有效指令,如果不指定代码段入口,CPU会把数据当作指令来通过CS:IP指向。

(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 ax,c
          mov es,ax
          mov bx,0
          mov cx,8

     s:   mov al,ds:[bx]
          mov es:[bx],al
          inc bx
          loop s 

          mov ax,b
          mov ds,ax
          mov bx,0
          mov cx,8

    s0:    mov al,ds:[bx]
           add es:[bx],al
           inc bx
           loop s0
         mov ax,4c00h
int 21h
code ends end start

 

add操作执行前

add操作执行后

(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,b
          mov ss,ax
          mov sp,10h

          mov ax,a
          mov ds,ax
          mov bx,0
          mov cx,8

    s:   push [bx]
          add bx,2
          loop s

mov ax,4c00h int 21h code ends end start

 

 push操作执行前

push操作执行后

总结与体会

完成实验5时,老师给出了分阶段使用ds的方法,感觉这是这次实验最大的收获。

原文地址:https://www.cnblogs.com/547hh/p/9998598.html