实验二预备知识:
1、debug内容补充:①D命令由debug执行,debug执行D命令时,首先将段地址1000h送入段寄存器,且默认送入ds中。
②debug依靠CPU运行的程序来执行D命令,cpu从段寄存器中得到内存单元段地址。
2、debug的T命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行,这里的内容涉及到中断机制,笔者目前对中断不够了解,等到以后学到该内容再回来补充!
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
实验二任务:
(1)使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实验情况填空。
mov ax, ffff
mov ds,ax
mov ax,2200
mov ss,ax
mov sp,0100
mov ax,[0]
add ax,[2]
mov bx,[4]
add bx,[6]
push ax
push bx
pop ax
pop bx
push [4]
push [6]
下面对程序进行分析:
1、实验准备,通读实验,需查看下列内容:
① r命令查看以下内容:
d命令查看d ffff:0
d命令查看d 2000:0
2、开始实验
① 通过a命令将写入程序
②分步运行程序:
mov ax,ffff
mov ds,ax
解释:使ds指向ffff段内存,即现在的数据段从ffff:0开始
程序截图:
----------------------------------------------------------------------------------
mov ax,2200
mov ss,ax
mov sp,0100
解释:建立栈结构,使ss指向2200h内存,栈初始化栈顶指针为100h,即栈结构第一个内存单元为2200:0100
程序截图:
注意:这里t命令在执行(mov ss,ax)时直接将(mov sp,0100)也同步执行了,与前文提到的中断机制有关。
--------------------------------------------------------------------------------------------------------------------------------------------------------
下面的段程序是将数据段ffff:0之后的内容存入ax,bx中,各机器内容可能不一致,通过d ffff:0 查看即可,本实验截图已在实验准备中
mov ax,【0】 ; ax=C0EA ------->将数据段 ffff:0的内存传入ax中
add ax,【2】 ;ax=C0FC ------->ax=C0EA+0012=C0FC
mov bx,【4】 ;bx=30F0 ------->将数据段ffff:4的内容存入bx中
mov bx,【6】 ;bx=6021 ------->bx=30F0+2F31
程序截图:
注意:【x】代表传输的是数据段ds的内容,由于本实验中传入的是ax,bx,故每次需传入2字节,且使用小端法。
--------------------------------------------------------------------------------------------------------------------------------------------------------
push ax ;sp=00FE ; ;修改的内存单元的地址是 2200:FE到FF;内容是 FC C0 -------------> 将栈ax=C0FC压入栈中,sp=sp-2=00FE(栈顶指针上移两位),此时栈中一个元素
push bx ;sp=00FC; ;修改的内存单元的地址是 2200:FC到FD ; 内容是 21 60 ------------->将栈bx=6021压入栈中,sp=sp-2=00FC(栈顶指针上移两位),此时栈中两个元素
pop ax ;sp=00FE; ax=6021 ------------->* 弹出栈顶元素(6120)送入ax中,ax=6021,sp=sp+2(栈顶元素下移两位)
pop bx ;sp=0100; bx=C0FC ------------->*弹出栈顶元素(C0FC)送入ax中,ax=6021,sp=sp+2(栈顶元素下移两位),栈空
push 【4】 ;sp=00FE; 修改的内存单元的地址是 2200:FE到FF ; 内容是30 F0
push 【6】 ;sp=00FC; 修改的内存单元的地址是 2200:FC到FD ; 内容是 2F 31
程序截图:
注意:push,pop修改的是栈,即ss和sp 。
pop ax并不是弹出ax,而是将栈顶元素弹出并传给ax,且需注意入栈时候栈顶指针上移,即sp-2(此时ax入栈,有两个字节),出栈sp+2. 不能混淆两者、
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(2) 仔细观察图3.19中的实验过程,然后分析:为什么2000:0~2000:f中的内容会发生改变?
可能要再做些实验才能发现其中的规律。如果你在这里就正确回答了这个问题,那么要恭喜你,因为你有很好的悟性。大多数的学习者对这个问题还是比较迷惑的,不过不要紧,因为随着课程的进行,这个问题的答案将逐渐变得显而易见。
分析:程序截图
由于程序段和上面类似,就不单步分析了,大概说一下:
在2000h创建栈结构,令ss:sp指向2000:10
给ax赋值并压入栈中
之后再查看d 2000:0发现内存中有数据了
可以看出这是压入栈中ax;
这是cs:ip值;
通过查看其它博客知道这是由于中断的原因,由于笔者能力有限,暂时无法进行解释,等以后了解这方面的内容再来补充。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ps:实验二到这里就完成了。
有个小问题想请教一下,
用a命令时 为什么输入“a cs:ip”提示错误,而“a cs:100”就可以呢?百度了也没找到答案,求指教!
附图: