实验五
(1)
1,CPU执行程序,程序返回前,data段的数据为
23 01 56 04 89 07 BC 0A EF 0D ED 0F BA 0C 87 09
0123h 0456h 0789h 0ABCh 0DEFh 0FEDh 0CBAh 0987h
2,CPU,cs=0772h, ss=0771h,ds=0770h
3 设程序加载后,code段地址为x, 则data段地址为x-2h,stack段地址为x-1h
(2)
1,CPU执行程序,程序返回前,data段的数据为
23 01 56 04
0123h 0456h
2,CPU执行程序,程序返回前,cs=0772h, ss=0771h,ds=0770h
3 设程序加载后,code段地址为x, 则data段地址为x-2h,stack段地址为x-1h
4,如果段中数据占N个字节,该段实际占有的空间为[(N+15)/16].
([x]是高斯(取整)函数)
(3)
1,CPU执行程序,程序返回前,data段的数据为
23 01 56 04
0123h 0456h
2,CPU执行程序,程序返回前,cs=0770h, ss=0774h,ds=0773h
3 设程序加载后,code段地址为x, 则data段地址为x+3h,stack段地址为x+4h
(4)
第三个仍然可以执行。因为把end start 改为end后,程序就不会从start开始执行了,所以IP的初值为0,所以会从第一个段开始执行。
而只有第三个程序的机器码在前面,所以仅第三个仍然可以执行。
(5)
源代码:
1 assume cs:code 2 a1 segment 3 db 1,2,3,4,5,6,7,8 4 a1 ends 5 6 b1 segment 7 db 1,2,3,4,5,6,7,8 8 b1 ends 9 10 c1 segment ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称 11 db 8 dup(0) 12 c1 ends ; 改的时候要成对一起修改 13 code segment 14 start: 15 mov ax,a1 16 mov ds,ax 17 mov cx,8 18 mov bx,0 19 20 s: mov ax,[bx] 21 add ax,[bx+10h] 22 mov [bx+20h],ax 23 add bx,2 24 loop s 25 26 mov ax,4c00h 27 int 21h 28 code ends 29 end start
①在实现数据相加前,逻辑段c的8个字节
②执行完实现加运算的代码后,逻辑段c的8个字节
根据①和②的调试,数据相加正确。(此处用的是字型数据的加法,而不是字节的加法,而且是重复了8次,(后面的00+00看不出来所以就没有用黄色笔标注,不是只有前面加了,后面也相加了!!!)但是毕竟没有进位,所以看不出来区别,而题目中也没有说明,a,b段中的数据如何相加,此处不影响结果。
(6)
1 assume cs:code 2 a1 segment 3 dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh 4 a1 ends 5 6 b1 segment 7 dw 8 dup(0) 8 b1 ends 9 10 code segment 11 start: 12 mov ax,a1 13 mov ds,ax 14 mov cx,8 15 mov bx,0 16 mov ax,b1 17 mov ss,ax 18 mov sp,10h 19 s: push [bx] 20 add bx,2 21 loop s 22 23 mov ax,4c00h 24 int 21h 25 code ends 26 end start
6.(2)
① 在push操作执行前,查看逻辑段b的8个字单元信息截图
② 执行 push操作,然后再次查看逻辑段b的8个子单元信息截图
根据①和②的调试,数据相加正确。
总结与体会
在程序二(4)的填空蒙了一下,具体过程可参见(老师上课有提示,不过鄙人愚钝,只能查资料了。。。)
编译器实际的处理方式是将段中的所有内容放在一个段的起始地址处,下一个段里的所有内容放在后续一个段的起始地址处(这也是汇编指令segment的本义:将不同数据分段)。这样,即使段中只包含一个字节,也要占一个段(16个字节),所以,一个段实际占用的空间=(段中字节数+15)/16。
https://wenku.baidu.com/view/ca6ae5b30342a8956bec0975f46527d3240ca6c3.html
完成第六个实验的时候,犯了一点低级错误,记反了字节型数据和字型数据,
现纠正如下:字节型数据只占一个字节;字型数据占连续两个字节,低字节在前,高字节在后。
然后重新看了一下第五个实验的内容。
发现那个加法后面的00也是参加运算的,也就是说,在第五个实验中,cx的值从4到8都可以,都不会影响实验结果。
(我开始没有思考,直接写的cx=8 ,add bx,2。现在理解清楚了:如果这题有9个字节型数据,也是应该写cx=8,而不是cx=9)