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段中的数据不变 。

(2)CPU执行程序,程序返回前,CS=076C,SS=076B,DS=076A 。

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

截图:

 

 结论:

1)、通过观察0770:0000结果可以发现,data段的数据在执行程序后,程序返回前并未改变。

2)、CPU执行程序,程序返回前,cs= 0772h 、ss=  0771h  、ds= 0770 h

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)、与(1)的结果一样,data段的数据在执行程序后,程序返回前仍未改变,仍是原始数据。

2)、CPU执行程序,程序返回前,cs= 0772h 、ss=  0771h  、ds= 0770 h

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

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

name  segment

.........

name ends

如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为  (N/16+1)*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)、可以发现,data段的数据在执行程序后,程序返回前并未改变,仍是原始数据。

2)、从图中可以看出,CPU执行程序,程序返回前,cs=0770h、ss= 0774h、ds=0773h。

3)\进一步可以发现,若code段的段地址为X,则data段的段地址为X+3,stack段的段地址为X+4。

实验(4)

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

答:(1)(2)改变前后SS发生变化,都是数据先加载进内存,所以不能正确运行。(3)是代码段先被加载进内存,所以能够运行且执行正确。

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,b

        mov es,ax

        mov ax,c

        mov ss,ax

        mov bx,0

        mov cx,8

s:      mov ax,[bx]

        mov ss:[bx],ax

        mov ax,es:[bx]

 

        add ss:[bx],ax

        inc bx

        loop s

        mov ax,4c00h

        int 21h

code ends

end start

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

 

posted on 2018-11-30 22:40  TheaQ  阅读(204)  评论(1)    收藏  举报