实验4 [bx]和loop的使用

一、预备知识

ps:不知道为什么这段内容特别陌生,很多细碎的知识点感觉懂了又好像不明白,做实验的时候才知道很多知识点不是我以为我懂了就是懂了

ps:实际上还是理解的不够透彻,而这部分又没有特别多的知识点,所以我就打算这里带一下,不分开做知识点的整理了

1、内存单元间接表示:[bx]

(1)mov dl,[bx]

间接寻址,可以使用bx间接访问内存单元,间接给出内存单元的偏移地址,默认段地址在ds中

(2)mov ax,[bx]

bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中。即:(ax)=((ds)*  16  +(bx))

(3)mov [bx],ax

bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将ax中的数据送入内存SA:EA处。即:((ds)*  16  +(bx))=(ax)

2、loop指令

(1)CPU的执行过程

(cs)=(cx)-  1

判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行

(2)用loop指令来实现循环功能,cx中存放循环次数

(3)遇到loop指令时,使用p命令来执行,Debug就会自动重复执行循环中的命令,直到(cx)=  0为止

 

二、实验任务

1、综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充数据0403H

(1)源代码

一开始拿到这个实验还是很懵的状态,编出来这个后运行发现是空的,什么都没有输出出来

这个是我按照书上的代码改的,后来发现循环里面有问题

这个循环里面把[bx]给al,但是bx是空的啊,应该是把al中的数据传给[bx]才对

这样最后就可以运行出来了

mov ax,0b800h

mov ds,ax

mov bx,07b8h

这三行代码的意思是初始化ds:bx指向b800:07b8

mov ax,0403h

把要循环的数据传到ax中

mov cx,16

循环次数为16

我反汇编看了一下,只有loop那行的代码和我打的代码不一样

loop后面显示的是s所标识的地址,也就是循环开始的地址

 

(2)将源代码程序中字数据0403H->修改为0441H,再次运行,截图显示运行结果

接着,我又改了一次数据

这次输出的是B,也就是说屏幕上输出的东西是由循环的那个数据决定的

后来做完想了一下,循环体也可以改变一种写法

两种方式都可以实现这个功能,一个是把字节数据传给了[bx],一个是把字数据传给了[bx]

 

2、综合使用loop,[bx],编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH),综合使用loop,[bx],mov实现

(1)源代码

 

(2)汇编、链接无误后,灵活使用debug的t命令,g命令,p命令调试,用d命令查看0:200~0:23F,确认是否将0~63传送至此段内存区域

这道题就用到了p命令,跳过了中间的循环

 

3、下面的程序的功能是将“mov ax,4c00h”之前的指令赋值到内存0:200处,补全程序,上机调试,跟踪运行结果

(1)源代码

 

(a)程序加载进去一开始的地址是cs:ip,也就是第一条指令指向的位置

我们要把cs:ip这个地址处的代码复制到另一个内存处

但是我们用mov ax,[寄存器]这种写法的话,段地址默认在ds中

ds不一定就等于cs,所以这里填的是cs

(b)我大概判断了一下cx的值,感觉大概在12h差不多,所以写了10h

接着进行反汇编,观察mov ax,4c00h的地址,那里写的是0017

这个循环体里面,每次循环bx加1,实际上是变动了一个字节的数据

而那条指令所在的位置应该是第18个字节,从0~17

如果要复制到前一条指令的那些内容,需要17个循环,所以mov cx,17h

 

(2)汇编连接后,灵活使用debug的t命令、g命令、p命令调试,用d命令查看0:200之后的若干字节,观察是否将mov ax,4c00h之前的指令复制到指定内存

最后反汇编对照一下d 0:200处的数据对不对,最后可以看到,mov ax,4c00h之前的指令确实复制到了内存中

 

总结:

(1)当循环中遇到loop指令时,可以用P命令重复执行循环中的指令直到循环结束

(2)想要复制一段程序可以通过反汇编来确定循环次数

(3)程序段也可以当做数据段来使用,我们可以把程序段存入另一片内存中

(4)感觉我的编程存在很大的问题,做这些实验特别费劲,可能还是对书本内容不熟悉,需要多看看书

转载于:https://www.cnblogs.com/yinghuapiaoluo/p/9986668.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值