Ⅰ· 无病呻吟
学一门语言,不动手实验是学不好的,在实验中不断遇坑然后解决,才有进益。所以写一下我在第一次汇编实验中的所思所想(王爽《汇编语言》第二章章末实验)。
Ⅱ · 实验内容
- 题解思路:
这个题需要我们向内存中写入一段代码并单步执行,仔细看过我上篇博文给出的链接,很容易想到,写入一段东西 有两个指令:e和a。
e是向指定位置写入机器码,(-e [段地址]:[偏移量],可逐个修改,亦可批量修改,下面是逐个修改),输完回车会显示指定内存地址处的原数据,输入要修改为的值。然后个选择,1.空格:修改紧接着的下一个地址的内容。2.回车:不再继续修改。单步执行命令为t,从cs:ip默认地址开始执行命令。
- 题解过程:
1.再用 a 指令直接输入一段代码,然后用 d 命令查看其机器码。
2.t单步执行(每次执行一条指令的时候,会根据指令长度,计算下一个命令的地址,做预读取)
- 题解思路:
写入指令倒是没什么难度,a 命令加上个指定地址就好了,重点在于,利用无条件跳转 jmp 达到计算2^8的目的,这就需要自己手动指定什么时候停止。这里用 t 加 指定指令数来实现。那就要算好要执行的指令数,将 add 和 jmp 做为一套运算,每套运算下来相当于ax的值乘以2,所以要计算2^8就是要做8套运算,乘以二就是要执行16条指令,别忘了还有一开始给ax赋初值的一条,所以总共17条指令!这里有个坑!!!dosbox里都是十六进制,所以如果输入条数的时候输入的是17,那实际上执行了23条指令。
另外,讲过t从cs:ip默认指向的地址开始执行,所以要先改好cs值,ip的值可以在用 t 命令时指定。
- 题解过程:
1.写完指令后看下寄存器状态和指令机器码
2.用 r 查看并修改cs值
3.单步执行,并查看最后运算结果
- 题解思路:
用 d 命令加上起始地址查看指定内容,并用 e 尝试修改
- 题解过程:
事实证明,不能修改,原因是这段属于ROM(只读存储),其内容,在一开始就烧录好,只供读取使用。
- 题解思路:
照打命令,查看现象。修改命令参数,尝试修改显示的位置、符号、颜色、背景色、闪烁。
- 题解过程:
1.照例尝试
2.上图发现写入不同内容后显示的图案样式颜色有所不同,在找到规律后,如下实验
实际上,这里能看出来两点:一、dos内显示区域起始位置为b8000。二、参数细节不同,显示效果不同。详细如下:
奇数位的字节表示显示什么符号,这是对应的十六进制ASCII码值,四行命令对比即可体现,诸君可尝试不同图案。
然后偶数位字节分出来高位(前位)和低位(后位)。低位表示何种颜色(0~F共16种)图中用笑脸和梅花共同展示了所有的16种颜色(黑色在最开头,不过融入窗体黑色,看不到,这里就可以当作“隐藏了”)高位数字又分成两个段,0~7和8~F,他们都有背景色,且一样,但是后段有闪烁效果。
(以上文段为本人总结规律,并非真正原理,有所偏差,以下面链接作矫。)
https://blog.csdn.net/nicholas199109/article/details/8554886
整体上就是这些了,最后一个比较有意思,诸君可以玩出点不同的效果。
Ⅲ · 补充
补充一张8086PC机内存地址空间分配的基本情况,实验3、4都用到了