《汇编语言》实验二课程

 实验二预备知识:

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”就可以呢?百度了也没找到答案,求指教!

附图:

 

转载于:https://www.cnblogs.com/zwHou/p/9865200.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值