编写、调试具有多个段的程序
一、 实验目的
- 熟练使用debug调试具有多个段的汇编程序。
- 学会合理使用代码段、栈段、数据段。
二、实验内容或主要代码
-
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 -
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 -
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 -
4.如果将(1)(2)(3)题中的最后一条伪指令“end start”改为“end”(也就是说,不指明程序的入口),则哪个程序仍然可以正确执行?请说明原因。
-
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:
?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,0,0ah,0bh ,0ch,0dh,0eh,0fh,0ffh
a ends
b segment
dw 0,0,0,0,0,0,0,0
b ends
code segmment
start:
?
code ends
end start
三、 实验结果或截图
1.
(1)CPU执行程序,程序返回前,data段中的数据为多少?
答:不变,仍为0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h。
(2)CPU执行程序,程序返回前,cs=04b0h、ss=04afh、ds=04aeh。
(3)设程序加载后,code段的短地址为X,则data段的段地址为X-2,stack段的短地址为X-1。
(1)CPU执行程序,程序返回前,data段中的数据为多少?
答:不变,仍为0123h,0456h。
(2)CPU执行程序,程序返回前,cs=04b0h、ss=04afh、ds=04aeh。
(3)设程序加载后,code段的短地址为X,则data段的段地址为X-2,stack段的短地址为X-1。
(1)CPU执行程序,程序返回前,data段中的数据为多少?
答:不变,仍为0123h,0456h。
(2)CPU执行程序,程序返回前,cs=04b0h、ss=04afh、ds=04aeh。
(3)设程序加载后,code段的短地址为X,则data段的段地址为X+3,stack段的短地址为X+4。
4.都能正确执行,如果不指明程序的入口,编辑器自动默认代码的第一条指令为程序的入口。
5.
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 al,ds:[bx]
add al,ds:[bx+16]
mov ds:[bx+32],al
inc bx
loop s
code ends
end start
经过多次t命令追踪后:
6.
assume cs:code
a segment
dw 1,2,3,4,5,6,7,8,9,0,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 bx,0
mov ax,b
mov ss,ax
mov sp,16
mov cx,8
s:push [bx]
inc bx
inc bx
loop s
code ends
end start
经过多次t命令追踪后:
四、实验分析或体会
此次实验,重点在于程序的编译、连接,Debug的加载、跟踪。通过此次实验,我深刻了解了end的作用,若end指明了程序的入口,CPU会直接从入口处开始执行;若未指明,程序从加载进内存的第一个单元起开始执行。并且,定义多个段来存放数据、代码、栈使程序井然有序,可读性强。