实验4
实验内容1:综合使用 loop,[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个 字单元重复填充字数据 0403H;修改0403H为0441H,再次运行
步骤1:在记事本中编写好temp.asm文件
步骤2:进入dosbox环境进行编译连接并运行,屏幕特定位置显示16个红色爱心
步骤3:修改0403H为0441H,运行后观察结果
Tips:
进入debug环境逐步调试时,发现并没有修改b87b8H内存单元中的值。对比直接运行并在没有清屏条件下进入debug运行,和直接在debug环境中修改寄存器取值,发现可能的原因是:输出在屏幕上的符号是动态的,即刻显示当前位置的符号。如果显示的位置下面本来没有代码,后面输入的代码会覆盖这些符号;如果下面你本来就有代码,会随着代码的输入而不断上移位置
实验内容2:综合使用 loop,[bx],编写完整汇编源程序,实现向内存 0:200~0:23F 依次传送数据 0~63(3FH)
用loop, [bx]实现:
1、步骤1:在记事本中编写好temp2.asm文件
步骤2:进入dosbox环境进行编译连接并运行
步骤3:进入debug环境,灵活使用 debug 的 t 命令、g 命令、p 命令调试,用 d 命令 查看 0:200~0:23F,确认是否将 0~63 传送至此段内存区域
(用g命令调试)
(用t命令逐步调试、p命令一起执行循环的部分,结果和用g命令一样)
2、稍作改动,同样能实现
实验内容3:实现将“mov ax,4c00h”之前的语句全部复制到从0:200开始的一段空间中
步骤1:在记事本中编写好temp3.asm文件(填空的内容为1. CS 2.offset last-offset start)
步骤2:进入dosbox环境进行编译连接并运行
步骤3:灵活使用 debug 的 t 命令、g 命令、p 命令调试,用 d 命令查看 0:200 之后的若干字节,观察是否将 mov ax, 4c00h 之前的指令复制到指定内存
实验4——总结
收获:本次实验让我熟悉了loop、[bx]的使用,弄懂了屏幕上输出符号的位置与是否被覆盖的问题,了解了怎么进行代码的复制(怎么表示一段不知道大小的空间的大小),掌握了p命令的有一个功能——跳过循环的具体过程直接执行到循环结束。
问题:最后一个实验为什么在复制完成以后还会多出一段数据呢?
实验内容2的我尝试了用loop、push做但是失败了,查看内存单元发现并没有修改原来的取值。那么到底应该如何实现呢?