标签:分享图片 理解 结束 ffffff 初始化 src 程序 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)感觉我的编程存在很大的问题,做这些实验特别费劲,可能还是对书本内容不熟悉,需要多看看书
标签:分享图片 理解 结束 ffffff 初始化 src 程序 loop 加载
原文地址:https://www.cnblogs.com/yinghuapiaoluo/p/9986668.html