使用汇编编程时要直接操作硬件资源,如CPU内部资源,存储器和I/O端口,所以一定要学习并记住CPU内部寄存器的命名,功能以及常见的用途,感谢老天,寄存器并不是太多。还有要明白存储器的分段管理模式,存储单元的地址的表示法和物理地址的形成方式,当然也不难理解。
一 寄存器组
寄存器是CPU的内部数据存储资源,是汇编程序能用到的硬件资源之一,由于存取速度比内存快很多,所以在汇编写程序时,要尽可能充分利用寄存器的存储功能。
寄存器一般存储运算过程的中间结果,为随后的指令快速读取,避免压入堆栈再弹出带来的开销。
另外,由于寄存器的数量和容量都有限制,不可能把所有的中间结果都存入寄存器,所以要对寄存器进行适当的调整,根据指令的顺序,如何安排适当的寄存器,避免操作数过多的传送操作是一项很缜密的工作,有一些专门的寄存器的分配策略的文章,在《编译原理》一书中详细阐述。
16/32位CPU在PC中很常用,所以介绍这两种CPU的内部寄存器的名称和具体作用。
1. 16位CPU寄存器组
4个数据寄存器(AX,BX,CX,DX) 2个变址和指针寄存器(SI,DI) 2个指针寄存器(SP,BP)
4个段寄存器(ES,CS,SS,DS) 1个指令指针寄存器(IP) 1个标志寄存器(Flags:16个二进制位只用了9个二进制位作为标志位,下章会讲)
数据寄存器,变址和指针寄存器,指针寄存器都属于通用寄存器,因为具有良好的通用性,数据寄存器既能被当作一个16位寄存器使用,又能拆分成俩8位寄存器使用。
在某些CPU指令中,通用寄存器可能被当作隐含的操作数,比如我在第六章介绍的LOOP指令,就把ECX当作了隐含操作数,使它成为循环计数器。
2. 32位CPU寄存器组
包含16位CPU的所有寄存器,把通用寄存器,指令指针和标志寄存器都扩充到32位,另外增加了2个段寄存器FS,GS。
4个数据寄存器(EAX,EBX,ECX,EDX) 2个变址和指针寄存器(ESI,EDI) 2个指针寄存器(ESP,EBP)
6个段寄存器(ES,CS,SS,DS,FS,GS) 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags:32位只使用了13位作为标志位)
![](https://img2024.cnblogs.com/blog/35695/202403/35695-20240328092537879-1189167464.jpg)