一、练习一
代码如下:
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
①CPU执行程序,程序返回前,data段中的数据为:0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
②CPU执行程序,程序返回前,cs=076ch、ss=0769h、ds=075ah
③设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1
二、练习二
实验代码如下:
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
①CPU执行程序,程序返回前,data段中的数据为:0123h,0456h
②CPU执行程序,程序返回前,cs=076ch、ss=0769h、ds=075ah
③设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1
④对于如下定义的段:
name segment
...
name ends
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为[(N+15)/16]*16
解题思路:开辟栈空间时以16个字节为单位,所以栈的大小为16字节的整数倍。
三、练习三
实验代码如下:
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
①CPU执行程序,程序返回前,data段中的数据为:0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
②CPU执行程序,程序返回前,cs=076ch、ss=0769h、ds=075ah
③设程序加载后,code段的段地址为X,则data段的段地址为X+3,stack段的段地址为X+4
四、练习四
将最后一条伪指令end start改为end后练习一、二不能正确运行,练习三可以。
因为将end start用于指明程序的入口,由其指明的入口在编译、连接后被转化为一个入口地址,程序由该地址开始执行。
删去start后程序默认从第一个段开始执行,而只有练习三的代码段为第一个段,所以只有练习三可以正确运行。
五、练习五
编写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: mov ax,a mov ds,ax mov bx,0 mov cx,8 s: mov al,[bx] add al,[bx+10h] mov [bx+20h],al inc bx loop s mov ax,4c00h int 21h code ends end start
① 在实现数据相加前,逻辑段c 的8 个字节:
② 执行完实现加运算的代码后,逻辑段c 的8 个字节
经验证,已正确实现数据相加。
六、实验六
编写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,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 ax,b mov ss,ax mov sp,16 mov cx,8 mov bx,0 s: push [bx] add bx,2 loop s mov ax,4c00h int 21h code ends end start
① 在push 操作执行前,查看逻辑段b 的8 个字单元信息截图
② 执行push 操作,然后再次查看逻辑段b 的8 个字单元信息截图
经验证,已成功实现逆序存储。
思考与总结:
这次实验使我更深一步的了解了计算机内部运行程序时各指针的变化。本章内容虽然不多,但实际操作起来还是比较繁琐的。