汇编语言实例问题

  在早先的一些著名高校里(不知道现在还有没有),老师是通过让学生设计出一套计算机电路系统来让学生了解计算机的工作原理,而现在绝大部分高校都开设了微型计算机原理与接口技术这样一门课,学生通过学习编写汇编代码这样一个过程来了解计算机的内部工作方式。汇编毕竟是一种低级计算机语言,所以我觉得我们没有必要说一定要写出多牛逼的汇编代码,而是了解到计算机是如何传送数据,处理数据,在外部给出一个复杂动作时计算机内部进行了一个怎样的处理过程我觉得这门课的意义就达到了,那么以后在对使用高级计算机语言编写的代码进行调试的时候,我们就多了一个思考维度,从计算机底层工作方式去分析并解决问题。

    然而现在关键的问题是微机这门课学起来真的是让人头秃,尤其是遇到一个只会念PPT并且在讲汇编指令之前直接跳过计算机内部结构的微机老师。这就导致在他讲了两节课的指令之后我还以为在CPU里面有好多个AX寄存器,还不知道内存其实是一个整体,只是为了方便理解才被人为"划分"成了一段一段。。。但是怎么说呢,学习本身就是一个从小白到入门,从入门到继续入门,从继续入门到放弃的过程嘛,在慢慢熟悉一个完全陌生的事物之前的热身和准备阶段总归是痛苦难熬且让人头秃的。想把这门课学好终归还是要通过自己大量的查阅、学习和整理,最终在大脑里形成一个计算机内部工作方式的体系框架。

    以上是对微机的一些小感慨,最后因为这篇文章并不是对微机知识的一个具体介绍和总结,所以就以我的同学问我的PPT上的一道题结尾吧:

汇编语言实例问题

    个人认为这道题对理解计算机的一些寻址方式(尤其是间接寻址)还是大有裨益,也当做是对自己做的一个知识强化,在此将这道题的过程梳理下来:

    本题的问题是连续执行下面一串指令之后,寄存器AL中的数值为多少?内存X单元中的数据变为多少?本质上就是寄存器与内存的数值传送问题。

    首先前两行,先把数据1000H这样一个16位数送到寄存器AX中,再把AX中的值送到数据段DS中。寄存器DS中的值就变成了1000H,这样的一个操作其目的就是保存了一个段基址1000H。

    第三行将数据2345H送到寄存器BX中没什么好说的,第四行将BX用中括号括起来,寻址方式就成了寄存器间接寻址[BX],寻址方式我们说其目的就是为了得到一个操作数,[BX]这样一写我们实际上就得到了这个操作数,这个操作数在哪儿呢?在内存里面。有人又会问了,我没看到啊,[BX]能说明什么吗?且看我变一变样,[BX]  =  DS:[BX],这两者是等价的,[BX]是偏移地址,DS是数据段,DS:[BX]这样就构成了一个逻辑地址,根据逻辑地址我们可以得到物理地址,一个物理地址对应内存中的一个值,那么我们只要计算得到这个物理地址即可。物理地址 = 段基址*16+偏移地址,那么我们这边的物理地址就等于DS中的1000H *16 +2345H = 12345H,题目中告诉我们12345H中保存的数据是55H,最终通过MOV AL,[BX],我们就将内存单元中的55H送到了寄存器AL当中。

    最后两行我先说一下它是干了一件什么样的事情。五六两行执行完之后,我么修改了内存单元X中的值。首先第五行,MOV SI,X单元的有效地址。 X单元的有效地址就是X单元的偏移地址。将该偏移地址保存到寄存器SI当中。第六行,MOV [SI],BL。[SI]是一种变址寻址,同样做一个等价[SI] = DS:[SI],这样我们就找到了X内存单元所在的地址,其原来里面存放的数是66H,这个时候我们将BL里面的数据45H送进去,X内存单元的值就变成了45H,我们就成功修改了该内存单元中的值。

    真的头秃!!!