- 深度探索Go語言:對象模型與runtime的原理特性及應用
- 封幼林編著
- 778字
- 2023-08-10 16:55:33
1.1.1 32位架構
32位x86架構的CPU有8個32位的通用寄存器,在匯編語言中可以通過名稱直接引用這8個寄存器。按照Intel指令編碼中的編號和名稱如表1-1所示。
表1-1 Intel指令編碼中8個通用寄存器的編號和名稱

其中編號為0~3的4個寄存器還可以進一步拆分。如圖1-1所示,EAX的低16位可以單獨使用,引用名稱為AX,而AX又可以進一步拆分成高字節的AH和低字節的AL兩個8位寄存器。

圖1-1 EAX寄存器的結構
EAX、ECX、EDX和EBX寄存器都是按照表1-2所示的方式設計的。這種設計讓開發者能夠非常方便地對不同大小的數據進行操作。
表1-2 編號為0~3的寄存器的結構設計

編號為4~7的4個寄存器,低16位也有獨立的名稱,但是沒有對應的8位寄存器,如表1-3所示。可以認為這4個16位寄存器是為了向前兼容16位的8086,在32位的程序中很少使用。
表1-3 編號為4~7的寄存器的結構設計

有些通用寄存器是有特殊用途的:
(1)EAX寄存器會被乘法和除法指令自動使用,通常稱為擴展累加寄存器。
(2)ECX被LOOP系列指令用作循環計數器,但是多數上層語言不會使用LOOP指令,一般通過條件跳轉系列指令實現。
(3)ESP用來尋址棧上的數據,很少用于普通算數或數據傳輸,通常稱為擴展棧指針寄存器。
(4)ESI和EDI被高速內存傳輸指令分別用來指向源地址和目的地址,被稱為擴展源索引寄存器和擴展目標索引寄存器。
(5)EBP在高級語言中被用來引用棧上的函數參數和局部變量,一般不用于普通算數或數據傳輸,稱為擴展幀指針寄存器。
除了這些通用寄存器之外,還有一個標志寄存器EFLAGS比較重要。匯編語言中用于比較的CMP和TEST會修改標志寄存器里的相關標志,再結合條件跳轉系列指令,就能實現上層語言中的大部分流程控制語句,此處不進一步展開。
最后還有一個很重要而且很特殊的寄存器,即指令指針寄存器EIP。指令指針寄存器中存儲的是下一條將要被執行的指令的地址,而且匯編語言中不能通過名稱直接引用EIP,只能通過跳轉、CALL和RET等指令間接地修改EIP的值。
- Learning Java Functional Programming
- Android項目開發入門教程
- Java完全自學教程
- 架構不再難(全5冊)
- Xcode 7 Essentials(Second Edition)
- Java開發入行真功夫
- Python金融數據分析
- Learning OpenStack Networking(Neutron)
- Integrating Facebook iOS SDK with Your Application
- GameMaker Essentials
- 硬件產品設計與開發:從原型到交付
- C指針原理揭秘:基于底層實現機制
- 百萬在線:大型游戲服務端開發
- Web前端測試與集成:Jasmine/Selenium/Protractor/Jenkins的最佳實踐
- CryENGINE Game Programming with C++,C#,and Lua