CPU結構和指令集
CPU是名稱為中央處理單元,簡稱處理器,主要的作用是從記憶體中讀取指令,然後解碼和執行。
CPU架構就是CPU內部設計的結構,是一堆硬體組成,用於實現指令集
所規定的操作
指令集包含了一系列的操作碼(opcode),以及特定的CPU執行的基本命令。如果想要設計CPU,就得先解決使用什麼樣的指令集,然後設計硬體的電路。根據現在指令集的特徵,可以分為兩類:CSSC和RISC
由於指令集是一堆二進位制資料,不方便閱讀和理解,於是就有了組合語言(Assembly language)
,組合語言就是類似人類語言的方式對執行集進行描述,每個彙編指定都會對應的機械執行。再往後就有了C/C++等高階語言
指令集架構
- CISC: 複雜指令集計算機,代表的是x86處理器
- RISC: 精簡指令集計算機,典型代表是ARM處理器
需要注意的一點是RISC可以完全使用暫存器來傳遞引數,而CISC只能使用棧,或者是棧和暫存器結合起來使用
x86/x64彙編基礎
我們主要以瞭解x86的彙編語法來了解組合語言
x86彙編主要的語法有兩種風格: AT&T
和Intel
風格
通常在Linux
中見到的AT&T
的風格比較多,常見的GCC、GDB、objdump
都是使用的AT&T
風格,他們兩個之間語法有一些簡單的區別,我們主要了解Intel風格
有很多細節的不同,AT&T
的特徵是暫存器和數字的前面通常會加入% $
的符號,Intel
沒有,十六進位制使用的是0x
而Intel
使用的是後方計入h
暫存器
暫存器從8位到16位,在到32位以及64為處理器,暫存器的名稱有一些變化。
您想要一個從8位到64位暫存器名稱變化的表格。以下是一個簡單的表格,顯示了不同位數暫存器的常見名稱。請注意,這只是一個基本的示例,實際的暫存器名稱可能因處理器架構、設計或特定應用而有所不同。
位數 | 暫存器名稱示例 |
---|---|
8位 | AL, AH, BL, BH, CL, CH, DL, DH |
16位 | AX, BX, CX, DX, SP, BP, SI, DI |
32位 | EAX, EBX, ECX, EDX, ESP, EBP, ESI, EDI |
64位 | RAX, RBX, RCX, RDX, RSP, RBP, RSI, RDI |
在64為模式下,操作書的預設大小仍然是32位
整數常量
如果給如一個1234不新增如何說明,它就是一個十進位制整數,也可以是八進位制或者十六進位制資料
因為十六禁止含有ABCDEF
,需要需要再數值的前方加入0
,在後方加入h
表示,例如1234
就是0x1234h
]
浮點數常亮
也稱實數常亮,浮點數中至少包含一個整數和一個小數點,例如:"1."、"+2.3"、"-3.14159"、"26.E53"
字串常亮
字串常亮通常使用單引號和雙引號包裹起來
彙編常用語句
MOV EAX, 0 # 將0儲存在EAX暫存器中
.data
testArray BYTE 99h, 98h, 97h, 96h
.code
MOV al, testArray ; al = 99h
MOV bl, [testArray+1] ; bl = 98h
MOV cl, [testArray+2] ; cl = 97h
INC
和DEC
分別為運算元加1和運算元減1
ADD
和SUB
為加和減
.data
testData DWORD 10000h
testData2 DWORD 20000h
.code
MOV EAX, testDATA ; EXA=10000h
ADD EAX, testDATA2 ; EAX=30000h
.data
testData DWORD 20000h
testData2 DWORD 10000h
.code
MOV EAX, testDATA ; EXA=20000h
SUB EAX, testDATA2 ; EAX=10000h
跳轉指令一般是JMP
和LOOP
,通常分為有條件和無條件跳轉