一、实验任务
完成教材133实验5
1、将下面的程序编译、连接,用debug加载、跟踪,然后回答问题。
assume cs:code, ds:data, ss:stackdata segment dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987hdata endsstack segment dw 0, 0, 0, 0, 0, 0, 0, 0stack endscode segmentstart: 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 21hcode endsend start
用u指令反汇编,g指令执行到001d前,得到程序返回前。
(1)CPU执行程序,程序返回前,data段中的数据为多少?
(2)CPU执行程序,程序返回前,cs=076c、ss=076b、ds=076a。
(3)设程序加载后、code段段段地址为X,则data段的段地址为X-2,stack段的段地址为X-1(通过反汇编可以得到)。
2、运行ex5_2 debug(操作同1)
(1)CPU执行程序,程序返回前,data段中的数据为多少?
(2)CPU执行程序,程序返回前,cs、ss、ds的值。
(3)设程序加载后、code段段段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。
(4)对于如下定义的段:
name segment
...
name ends
如果段中的数据占n个字节,则程序加载后,该段实际占有的空间为:((n+15)/16)*16。
在8086CPU架构中,每个段都是以16字节来对齐的,即若段数据在16字节以内,也计作16字节。
3、运行ex5_3 debug
(1)CPU执行程序,程序返回前,data段中的数据为多少?
(2)CPU执行程序,程序返回前,cs、ss、ds的值。
(3)设程序加载后、code段段段地址为X,则data段的段地址为X+2,stack段的段地址为X+4。
4、如果将(1)(2)(3)题中的最后一条伪指令“end start”改为“end”,则哪个程序仍可以正确执行?请说明原因。
(1)(2)无法执行,因为(1)(2)以数据段开始,找不到程序入口无法执行第一条语句。(3)以指令开始,可以执行。
5、编写code段中的代码,将a段和b段中的数据一次相加,结果存到c段中。(补充完整后代码如下)
assume cs:codea segment db 1,2,3,4,5,6,7,8a endsb segment db 1,2,3,4,5,6,7,8b endsc segment db 8 dup(0)c ends code segmentstart:mov bx,0 mov dx,0 mov cx,8s:mov dx,0 mov ax,a mov ds,ax add dx,[bx] mov ax,b mov ds,ax add dx,[bx] mov ax,c mov ds,ax mov [bx],dx inc bx loop s mov ax,4c00h int 21hcode endsend start
·用t命令单步执行到mov [bx],dx之前,使得ds中保存的是c段的段地址。用d命令查看此时的c段中的内容。
·运行到程序结束前,d命令查看c段内容。
实验验证完毕。
6、编写code段中代码,用push指令将a段中的前八个字型数据逆序存储到b段中。
assume cs:code
a segment dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffha endsb segment
dw 8 dup(0)b endscode segment
start: mov ax,a mov ds,ax mov ax,b mov ss,ax mov sp,10h mov bx,0 mov cx,8s:push [bx]
add bx,2h loop smov ax,4c00h
int 21hcode endsend start用u指令反汇编、用g指令运行到程序返回前、用d指令查看b中内容。得到逆序。
总结:
了解了寄存器分段存储的相关知识,分段存储更加简洁明了,以及复习了栈的知识。实践时不够熟练,还是要多加练习。