機(jī)器級(jí)編程的重要抽象
對(duì)于機(jī)器級(jí)編程來(lái)說(shuō),兩種抽象尤為重要:
- ISA,全稱(chēng)為
指令集體系結(jié)構(gòu)或指令集架構(gòu),它定義了處理器狀態(tài)、指令的格式以及每條指令對(duì)狀態(tài)的影響,用于屏蔽了硬件處理指令的復(fù)雜行為,將程序的每條行為描述為順序執(zhí)行 - 內(nèi)存虛擬化,它將多個(gè)硬件存儲(chǔ)器和操作系統(tǒng)軟件結(jié)合起來(lái),將對(duì)外提供的內(nèi)存模型抽象為一個(gè)很大的字節(jié)數(shù)組
重要的處理器狀態(tài)
- 程序計(jì)數(shù)器:給出將要執(zhí)行的下一條指令在內(nèi)存中的地址
- 整數(shù)寄存器文件,包含16個(gè)命名的位置,分別存儲(chǔ)64位的值,這些寄存器可以存儲(chǔ)地址或整數(shù)數(shù)據(jù)
- 條件寄存器,保存著最近執(zhí)行的算術(shù)或邏輯指令的狀態(tài)信息
- 一組向量寄存器,可以存放一個(gè)或多個(gè)整數(shù)或浮點(diǎn)數(shù)的值
機(jī)器級(jí)代碼的特點(diǎn)
我們可以通過(guò)C語(yǔ)言在內(nèi)存中聲明和分配各種數(shù)據(jù)類(lèi)型的對(duì)象,但是機(jī)器代碼只是很簡(jiǎn)單的將內(nèi)存看做是一個(gè)很大的、按照字節(jié)尋址的數(shù)組。匯編代碼不區(qū)分有符號(hào)或無(wú)符號(hào)整數(shù),不區(qū)分各種類(lèi)型的指針,甚至不區(qū)分指針和整數(shù)
程序內(nèi)存
程序的內(nèi)存包括:
- 程序的可執(zhí)行機(jī)器代碼
- 操作系統(tǒng)需要的一些信息
- 用來(lái)管理過(guò)程調(diào)用和返回的運(yùn)行時(shí)棧
- 用戶(hù)分配的內(nèi)存塊
數(shù)據(jù)格式
Intel用術(shù)語(yǔ)字表示16位的數(shù)據(jù)類(lèi)型,因此也將32位數(shù)稱(chēng)為雙字,64位數(shù)稱(chēng)為四字
對(duì)于x86-64系統(tǒng)而言,C語(yǔ)言的各種數(shù)據(jù)類(lèi)型的信息如下:
| C聲明 | Intel數(shù)據(jù)類(lèi)型 | 匯編代碼后綴 | 字節(jié)大小 |
|---|---|---|---|
| char | 字節(jié) | b | 1 |
| short | 字 | w | 2 |
| int | 雙字 | l | 4 |
| long | 四字 | q | 8 |
| char* | 四字 | q | 8 |
| float | 單精度 | s | 4 |
| double | 雙精度 | 1 | 8 |
注意:大多數(shù)GCC生成的匯編代碼指令都有一個(gè)字符的后綴,表明操作數(shù)的大小,例如:
- movb: 傳送字節(jié)
- mobw: 傳送字
- movl: 傳送雙字
- movq: 傳送四字