实验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
mov ds,ax
mov ax,c
mov es,ax
mov bx,0
mov cx,8
mov es:[bx],al
inc bx
loop s
mov ds,ax
mov bx,0
mov cx,8
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的方法,感觉这是这次实验最大的收获。