官术网_书友最值得收藏!

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的值。

主站蜘蛛池模板: 龙泉市| 丹棱县| 大邑县| 平阳县| 聊城市| 安化县| 峨山| 新竹县| 浦江县| 四子王旗| 库尔勒市| 垣曲县| 昌江| 宝山区| 宁远县| 宜黄县| 呼和浩特市| 天峻县| 开平市| 新河县| 湖州市| 西乌珠穆沁旗| 西乌珠穆沁旗| 太白县| 周宁县| 泾川县| 于都县| 隆子县| 合阳县| 舞钢市| 河北省| 丰镇市| 莱阳市| 邓州市| 山丹县| 鹿泉市| 延寿县| 营山县| 霍林郭勒市| 湘阴县| 德格县|