80X86寻址方式新视角

时间:2022-06-25 04:09:17

【摘要】本文从寻址方式产生的背景出发,从实际应用的角度认识寻址方式,通过分析各种寻址方式的特点和适用场合,深入探求各种寻址方式之间的关系及在高级语言中寻址方式的痕迹来理清程序设计语言的发展脉络,为学习寻址方式提供新的思路。

【关键词】寻址方式;关系;发展

1.前言

在《微计算机技术》课程里,80X86寻址方式是一个重点教学内容[1],原因之一是寻址和每一条指令有关,会有很大的蔓延性,该部分技术没有理解透彻,会对其他环节的理解产生障碍;其二是该部分内容有很强的实操性,需要加深理解寻址技术的来龙去脉,才能应用自如,所以需要一个过程,但很多同学不能将这种理解在后续的学习中深入进去,而且有的学生还有意回避,所以这部分的学习在学习中慢慢成为教学的难点。

2.寻址技术的背景

如图1,从程序本身来看,程序就是指令序列,每条指令由操作码和操作数构成(有些操作数是隐含的)。

3.寻址方式的种类及含义

为了叙述方便,实例参见图2,另外为了集中讨论寻址方式的问题,暂不考虑物理地址的计算[2],本文假定数据的段地址均在DS中,这样各种寻址方式的主要任务就变成了提供有效地址,所有寻址方式的探讨,均以MOV指令的源操作数为例。

1)立即数寻址:操作数直接在指令中给出,例如:MOV AL,5将立即数5送AL寄存器,数据5由程序员指定,既不来自寄存器,也不来自内存,该寻址方式适用于一次性赋初值的情况,方便直接,但使用机会较少。

2)寄存器寻址:操作数在指定的寄存器中,例如:MOV DX,AX,将(AX)内容送(DX)中,该寻址方式常用于数据的中转,因为寄存器离CPU最近,指令中的操作数都要直接或间接送到CPU的寄存器里才能进入ALU。

3)直接寻址:操作数在内存中,有效地址由指令直接给出,如:MOV AX,[1100H],该条指令是将有效地址1100H内存单元存放的内容25H送AX寄存器,为了区别立即寻址直接寻址直接给出的地址,需要加地址运算符号“[]”,在实际应用中,有效地址能具体给出的情形较少,如同我们坐公交车,在保证每个乘客都有座位的前提下,在某站上车,很难在上车前就知道自己固定的座位号,所以我们通常用“变量”来虚拟这个临时被分到的地址,所以MOV DX,word ptr var1形式较为多见,该指令是将Var1对应的有效地址的内存单元对应的内容45H送DX寄存器。

4)寄存器间接寻址:操作数在内存中,有效地址存放在地址寄存器中(基址BX、BP;变址SI、DI)。如:MOV AX,[BX]假设(BX)=1101H,该指令将BX中存放的内存有效地址单元对应的内容41H送AX寄存器,为了指示该寄存器存储的是地址,需要在BX上加上“[]”地址运算符号。该寻址方式就是C语言指针类型的前身。需要说明的是不同地址寄存器搭配不同的段,详细内容可参见文献[1]

5)基址变址寻址:操作数在内存中,有效地址由基址寄存器(BX/BP)和变址寄存器(SI/DI)共同提供,如:已知(BX)=1005H,欲读取字符’d’到AX中,我们可以使用变址寄存器对基址进行调整,如将当前地址和访问单元地址的差值03H送SI寄存器,然后使用MOV AX,[BX][SI]即可实现访问,改种寻址方式适用于处理数组、结构体等构造类型,同寄存器间接寻址一样,不同地址寄存器需要搭配不同的段。

4.各种寻址方式之间的关系

通过以上对五种寻址方式的分析,我们将寻址方式分成内存型寻址和非内存型寻址,前者包括直接寻址,寄存器间接寻址和基址变址寻址,后者包括寄存器寻址和立即数寻址。对初学者来说选择合适的寻址方式是不容易的,所以需告知他们具体解决某一种情况选用哪种寻址方式不是绝对的,他们彼此也可以转化的,比如在处理一维数组可以使用寄存器寻址,也可以使用基址变址寻址方式,但在保证正确实现的前提下,优先考虑非内存型,再选内存型寻址;第二个问题是对于一条指令中两个以上的操作数,要考虑两种寻址方式的搭配问题,以MOV指令为例,操作数可以是RR型,RS型,RI型(R指寄存器,S指内存单元,I指立即数),不允许是SS型,比如形如MOV var1,var2的形式是不允许的,假设该指令合法,那就意味着我们程序员编写的指令可以与CPU毫无关系,这和实际情况是不相符的。

如图3,各种寻址方式在程序设计中有一个大致出现的频率,立即数寻址和寄存器寻址大约占3%和50%。三种内存型寻址出现的频率大约在40%以上,当然这种统计只是为了让初学者了解寻址方式的使用情况而进行的粗略估计,这个也可以做一个简单的解释,寄存器寻址使用的频率高是因为我们所有内存数据都会尽可能的到离CPU近的地方才参与运算,这样有利于提高效率,内存型寻址解决了我们程序设计中一大部分操作数的问题,因为寄存器虽然方便、快捷,但是因为数量少,所以承载能力毕竟有限,立即数寻址完成的赋初值功能,对任何有程序设计经验的人都清楚,能在程序设计之初就能确定下来的值才有这样的待遇,所以符合条件的情况确实不多[2]。

5.寻址的发展:高级语言中的寻址方式

寻址方式之所以难学,是因为很多初学者在高级语言中没有体会,但高级语言不可能跨越寻址技术,它们是通过系统程序员改善编译环境来实现寻址技术,使得程序员可以将更多精力投入到具体问题的解决上来,我们以C为例来看寻址技术的发展。

C语言的一大贡献是给出了有“数据类型”的“变量”的概念[3],将程序员从复杂的寻址方式中解放出来,C中使用的基本数据类型,如整型、实型、字符型是通过直接寻址(符号地址,比如var1)+范围(精度)来完成定义的;构造类型,如数组、结构体和共用体是通过寄存器相对或基址变址寻址完成的;指针类型是典型的寄存器间接寻址,-寄存器里放的不是操作数,而是地址,再“顺藤摸瓜”才会找到需要的数;

C++的在这方面的贡献就是提出了“基于对象”的概念,将数据类型进行了更符合使用习惯的封装;C#提出了“面向对象”的概念,将这种技术进行到底。

6.结语

寻址方式是经过程序员实际工作中积累的智慧结晶,需要初学者慢慢体会,深入理解和灵活应用需要过程,希望本文能解决学习者的一些困惑。

参考文献

[1]郭旭平.汇编语言寻址方式[J].机械管理开发,2006(6): 153-154.

[2]沈美明,温冬婵.IBM—PC汇编语言程序设计(第2版)[M].清华大学出版社,2001,08.

[3]邓炳炎.寻址方式在C程序设计语言中的应用[J].科技资讯,2008(13).

上一篇:基于GIS技术的电力配网巡检系统应用研究 下一篇:基于FPGA的VGA显示控制器设计研究