一、实验内容-教材133实验 5
实验任务(1)~(4),
直接在教材上填写实验后通过运行、调试观察到的结果,以及由此得 到的结论,以拍照或直接在博客中录入方式,给出填写的结论。
1)书上P134的源码如下:
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
在程序编译、连接完成之后,使用Debug进行调试,依次使用R命令,U命令,G命令,D命令
观察后可发现,CPU执行程序,程序返回前,data段中的数据没变,仍旧为
0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
同时也能看出cs=076ch,ss=076bh,ds=076ah,推断出cs、ss、ds之间的规律
由此可以回答第三问,code段的段地址为X(即cs=X),则data段的段地址为X-2,stack中的段地址为X-1
2)书上P135源码如下
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
在程序编译、连接完成之后,使用Debug进行调试,依次使用R命令,U命令,G命令,D命令
观察后可发现,CPU执行程序,程序返回前,data段中的数据没变,仍旧为
0123h, 0456h
同时也能看出cs=076ch,ss=076bh,ds=076ah,推断出cs、ss、ds之间的规律
由此可以回答第三问,code段的段地址为X(即cs=X),则data段的段地址为X-2,stack中的段地址为X-1
对于第四小问,分N分为被16整除和不被16整除讨论 1)当N被16整除时: 占有的空间为(N/16)*16 2)当N不被16整除时: 占有的空间为(N/16+1)*16,N/16得出的是可以整除的部分,还有一个余数,余数肯定小于16,加上一个16。
程序加载后分配空间是以16个字节为单位的,也就是说如果不足16个字节的也分配16个字节。以上两种情况总结成一个通用的公式:((N+15)/16)*16 【详解参考王爽的课后答案】
3)书上P135源码如下:
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
在程序编译、连接完成之后,使用Debug进行调试,依次使用R命令,U命令,G命令,D命令
观察后可发现,CPU执行程序,程序返回前,data段中的数据没变,仍旧为
0123h, 0456h
同时也能看出cs=076ah,ss=076eh,ds=076dh,推断出cs、ss、ds之间的规律
由此可以回答第三问,code段的段地址为X(即cs=X),则data段的段地址为X+3,stack中的段地址为X+4
4)第三个程序仍然可以正确执行,请说明原因???我运行了啊,,,
“如果不指明入口位置,则程序从所分配的空间开始执行,前2个是数据段,只有从第3条开始是指令代码。”———来自参考答案
实验任务(5),
~(1) 汇编程序源代码(已将此处的段名称由改为c1)
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
c1 segment
db 8 dup(0)
c1 ends
code segment
start: mov ax,c1
mov ds,ax
mov ax,a
mov es,ax
mov bx,0
mov cx,8
s: mov al,es:[bx]
mov [bx],al
inc bx
loop s
mov ax,b
mov es,ax
mov bx,0
mov cx,8
s0: mov al,es:[bx]
add [bx],al
inc bx
loop s0
mov ax,4ch
int 21h
code ends
end start
~(2) 在debug中调试程序截图,截图中包括如下信息: ① 在实现数据相加前,逻辑段c的8个字节 ② 执行完实现加运算的代码后,逻辑段c的8个字节
依次使用g命令,d命令,在执行后查看a、b、c段中的存储数据
再执行倒数第二步,查看c段中此时存储的数据
~(3) 根据①和②的调试,验证是否正确的实现数据相加。
由上图可知,已经实现相加,大概正确吧。
实验任务(6),
~(1) 汇编程序源代码
assume cs:code a segment dw 1,2,3,4,5,6,7,8 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 bx,0 mov ss,ax mov sp,16 mov cx,8 s: push [bx] add bx,2 loop s code ends end start
~(2) 在debug中调试程序截图,截图中包括如下信息: ① 在push操作执行前,查看逻辑段b的8个字单元信息截图 ② 执行 push操作,然后再次查看逻辑段b的8个子单元信息截图
使用G命令,D命令,执行并查看a段,b段中存储的数据,以及b中最终存储的数据
~(3) 根据①和②的调试,验证是否正确的实现数据逆序存储。
由上图可知,已经实现数据逆序存储。
二、实验总结
对于课上讲的“利用栈将程序中定义的数据逆序存放”,没懂为什么要用dw定义16个0,只用8个不可以吗???试了一下好像可以,没出什么问题
实验任务6中我使用U命令之后出现了一行"CLD",在使用G命令执行时才看到,但是对汇编指令执行没有产生影响
查阅之后,有这样的解释