使用汇编编程时要直接操作硬件资源,如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位作为标志位)
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 复杂业务系统线上问题排查过程
· 通过抓包,深入揭秘MCP协议底层通信
· 记一次.NET MAUI项目中绑定Android库实现硬件控制的开发经历
· 糊涂啊!这个需求居然没想到用时间轮来解决
· 浅谈为什么我讨厌分布式事务
· 那些年我们一起追过的Java技术,现在真的别再追了!
· 还在手写JSON调教大模型?.NET 9有新玩法
· 为大模型 MCP Code Interpreter 而生:C# Runner 开源发布
· 面试时该如何做好自我介绍呢?附带介绍样板示例!!!
· JavaScript 编年史:探索前端界巨变的幕后推手