实验任务1:
1.运行程序 用r查看寄存器值 cs:076c,ss:0769,ds:075a
2.用u命令反汇编
知道程序返回前应是0019
3.用g命令执行到001d 查看data中的值 关掉程序重新debug 对比076a中0~f 值不变
回答:1、data中数值不变 如上图
2、程序返回前cs:076c ds;076a ss:076b
3、data地址为x-2,stack为x-1
实验任务2:
1. debug代码 观察cs的值,用u反汇编
2. 用g命令执行
回答:1、data中值没变
2、可见CS:076C,SS:076B,DS:076A
3、设程序加载后,code段的段地址为X,则data为X-2,stack为X-1
4、该段实际占有的空间:(N/16+1)*16 也就是说 不满16的空间会被自动补全
实验任务3:
1、debug后用u查看 用g运行到程序返回前
data中数据:
ds:076d ss:076e cs:076a
data地址x+2 stack地址为x+4
实验任务4:
在notepad中修改123的指令end start->end
例如运行程序1 用u反汇编
不是我们想要看到的代码 说明程序失败
实验二同样这样 只有实验三可以
实验任务5:
代码:
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 8 dup(0) c ends code segment start: mov cx,8 s:mov dx,0 mov ax,a mov ds,ax add dl,[bx] mov ax,b mov ds,ax add dl,[bx] mov ax,c mov ds,ax mov [bx],dl inc bx loop s mov ax,4c00h int 21h code ends end start
在dosbox中debug 用u反汇编 用g执行到返回前
查看实验结果 ds即是c的段地址 发现程序运行成功
在程序运行前ds:
程序运行后:
实现了a和b的相加
实验任务6:
实验代码;
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 8 dup(0) b ends code segment start: mov ax,a mov ds,ax mov ax,b mov ss,ax mov sp,0fh mov cx,8 s:push [bx] add bx,2 loop s mov ax,4c00h int 21h code ends end start
如图执行到push之前
此时ss中均为0
再运行到程序返回之前
可见程序完成了要求
实验总结: 在执行多段程序中 end start必不可少 不然程序无法找到执行的入口
8086机制下,不管data段等内容满不满16 都会自动补全。
此次试验巩固了各种命令的使用。