汇编第2课(上):通用寄存器
通用寄存器
| 类型 | 64位 | 32位 | 16位 | 8位 | 编号(二进制) | 编号(十进制) |
| 累加寄存器 | RAX | EAX | AX | AL | 000 | 0 |
| 计数寄存器 | RCX | ECX | CX | CL | 001 | 1 |
| 数据寄存器 | RDX | EDX | DX | DL | 010 | 2 |
| 基址寄存器 | RBX | EBX | BX | BL | 011 | 3 |
| 堆栈顶指针 | RSP | ESP | SP | AH | 100 | 4 |
| 堆栈基指针 | RBP | EBP | BP | CH | 101 | 5 |
| 变址寄存器 | RSI | ESI | SI | DH | 110 | 6 |
| 指令寄存器 | RDI | EDI | DI | BH | 111 | 7 |
基础理论:
一、在16位CPU的时代,16位的通用寄存器分别命名为:AX、BX、CX、DX;到了32位CPU时代后,就在它们的名字前面加个“E”来区别是32位还是16位。
二、32位CPU有4个32位的通用寄存器EAX、EBX、ECX、EDX,用于保存临时数据。
三、“E”是“Expand”的首字母,代表含义是“扩展”。
四、这4个32位的通用寄存器可以当作16位使用,也可以当作8位使用。当作8位使用时,就将AX折开为AH和AL,AH中的“H”代表“high”,意思是高位的意思,AL中的“L”代表“low”,意思是低位的意思。同理,BX、CX和DX可折开为BH、BL、CH、CL、DH、DL来使用。如下图所示:

总的来说,4个16位寄存器可分割成8个独立的8位寄存器:
- AX可分为:AH和AL
- BX可分为:BH和BL
- CX可分为:CH和CL
- DX可分为:DH和DL
五、每个寄存器都有自己的名称,可独立存取。程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
六、一些寄存器是别的寄存器的一部分,例如:如果EAX保存了值12782345,其他寄存器的值(红色部分)如下图:
| EAX | 12 | 78 | 23 | 45 |
| AX | 12 | 78 | 23 | 45 |
| AH | 12 | 78 | 23 | 45 |
| AL | 12 | 78 | 23 | 45 |
七、通用寄存器概念:
寄存器AX称为累加器(Accumulator),常用于算数运算(加减乘除)、布尔操作、逻辑操作、输入/输出、返回函数结果等,累加器的使用频率很高;
寄存器BX称为基地址寄存器(Base Register),常用于存档内存地址,它可作为存储器指针来使用。
寄存器CX称为计数寄存器(Count Register),常用于存放循环语句的循环次数,字符串操作中也常用。在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数。
寄存器DX称为数据寄存器(Data Register),常常和EAX一起使用,在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
注意:上面所述的4个通用寄存器的专门用途不是一成不变的,编译器在编译程序的时候会根据很多因素,例如编译器、编译条件、操作系统等做出相应的改变,首先得知道是用什么编译器编译,然后针对具体的编译器,参考该编译器的说明。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
