硬件方向个人札记(part 0)
分类:硬件方向个人札记日期:2012-02-26作者:SimolluS Heinz阅读:341 views
嗯嗯……估计发了这么多文史青年的东西已经没人还记着我的本行是计算机系了……然后就从今天起另开一个专题以正视听吧。话说我这个人一向不喜欢按部就班地学东西——显然不像好孩子是不——前一阵子自学逻辑电路,后来却因为缺少实验的支撑不得不中途停滞,随后寒假里痛定思痛决定学习一些不这么难以亲手一试的东西,于是在接下来很长一段时间里,我要学习汇编语言。
学汇编的老规矩,从王爽先生的《汇编语言》(第二版)入门,测试环境:
Windows 7 (Ultimate) + Windows XP mode + MASM 5.0
发这第一篇文的初衷源于今天遇到的一个很奇怪的问题,有关第九章“转移指令的原理”最后的实验九,第一次利用汇编语言向屏幕输出内容。首先是试验向屏幕左上角输出一行白色字母,写下的程序如下:
然后下意识地用Debug调试,结果居然一片混乱!每一次单步运行后,无论是否修改显示缓冲区B800:0000起的32KB空间,这一部分内存中的内容总是不断变化的:
想了半天个中奥妙却百思不得其解,最后忽然发现右边翻译出的ASCII码很有意思,貌似是各寄存器名……忽然意识到也许这个缓冲区是与寄存器不同的,寄存器在单步运行时只会作受控改变,但缓冲区内容永远指向当前(或说是显示内存这一命令下达前)的屏幕内容,也就是说带有显示功能的16位汇编程序是不可以进入调试的!
有了这个思路,我决定退出Debug直接运行程序,但显示出了这个:
还是什么也没有……然后瞬间想到自己又犯二了,注意运行时光标已经在最后一行了,所以……运行后要刷屏= =
CLS清空屏幕再运行,perfect !~
没有什么可总结的了,还要提及一点就是最好不要用SS寄存器存储显示缓冲区段地址B800H,没有什么特别的原因,就是我自己试的时候发现有时会造成些比较诡异的问题,有时就很好,所以没有截图。
最后附上实验九所要求的最终程序,解释即运行结果以供参考:
初始化代码区,数据区,堆栈区;
外圈循环控制输出三行,随后将计数器CX压入堆栈保存,内圈循环从代码区向显示缓冲区复制内容后CX出栈。
循环控制向显示缓冲区写入字符属性,注意写入数据类型,使用“MOV BYTE PTR […], idata”格式输入数据,最后int函数返回shell。
特此
ES不是一般等于DS么,为什么要显式的写成0B800H?