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

浙公网安备 33010602011771号