购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.4.2 寄存器寻址方式

指令的操作数存放在处理器的寄存器中,就是寄存器寻址方式。通常直接使用寄存器名表示它保存的数据,即寄存器操作数。绝大多数指令采用通用寄存器寻址(IA-32处理器是EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP,它还支持其16位形式,即AX、BX、CX、DX、SI、DI、BP和SP,以及8位形式,即AL、AH、BL、BH、CL、CH、DL和DH),部分指令支持专用寄存器,如段寄存器、标志寄存器等。高级语言常需要频繁使用变量,而寄存器就像是处理器内部事先定义好的变量,汇编语言程序员可以直接使用、无须定义。因此,寄存器寻址方式简单快捷,是最常使用的寻址方式。

在前面示例程序的许多指令中,凡是只使用寄存器名(无其他符号,如加有中括号、变量名等)的操作数都采用寄存器寻址方式。

[例2-9]寄存器寻址程序

本示例程序的指令操作数都是寄存器寻址。寄存器既可以做源操作数也可以做目的操作数,另一个操作数可以是变量也可以是常量(源操作数)。但要注意,指令通常要求操作数类型一致,所以最后一条指令“MOV EDI,SI”有错,列表文件将其标示出来,记录下语句行号、错误编号和错误原因(有时不甚准确,尤其是多种错误同时出现时)。该指令错误信息的含义是:指令操作数必须类型一致(同样长度)。汇编程序MASM提示的错误信息保存在ML.ERR文件中,常见的汇编错误信息见附录F。

初学编程的读者难免会出现各种错误。首先遇到的问题可能就是汇编(编译)不通过、提示各种错误(Error)或警告(Warning)信息,这是因为书写了不符合语法规则的语句,导致汇编(编译)程序无法翻译,称为语法错误。造成语法错误的常见原因有符号拼写错误、多余的空格、遗忘的后缀字母或前导0、不正确的标点、太过复杂的常量或表达式等。初学者也常因为未能熟练掌握指令功能导致出现操作数类型不匹配、错用寄存器等语法错误,当然还会因为算法流程、非法地址等出现逻辑错误或者运行错误。可以根据提示的语句行号和错误原因进行修改。注意,汇编(编译)程序只能发现语法错误,而且提示的错误信息有时不甚准确,尤其当多种错误同时出现时。应特别留心第一个引起错误的指令,因为后续错误可能因其产生,修改了这个错误也就可能纠正了后续错误。

更准确地说,本例错误的原因是两个操作数的类型不匹配,因为EDI是32位寄存器、SI是16位寄存器,MOV指令不允许把16位寄存器的数据传送到32位寄存器。读者会认为32位寄存器可以放下16位数据,占用其低16位就可以了,但事实上,80x86处理器的设计人员基于简化硬件电路的考虑,没有按照该思路去实现。所以,这是一条不存在的指令,即非法指令。同时,编写汇编程序的系统程序员也没有人性化地按照这个思路去处理该问题。对于应用程序员来说,只能遵循这个规则。虽然这让我们很困惑,但其实,透过现象看本质,我们是否也略微体会了处理器的工作原理和设计思路呢? 34pzt1hdGfuBPQuA1UfyQgiC6fS7BsKb+ZZQMcYxSO+7hx3r3UEt9MWYnCNmyCEP

点击中间区域
呼出菜单
上一章
目录
下一章
×