彙編基礎

Junglezt發表於2024-04-28

CPU結構和指令集

CPU是名稱為中央處理單元,簡稱處理器,主要的作用是從記憶體中讀取指令,然後解碼和執行。
CPU架構就是CPU內部設計的結構,是一堆硬體組成,用於實現指令集所規定的操作

指令集包含了一系列的操作碼(opcode),以及特定的CPU執行的基本命令。如果想要設計CPU,就得先解決使用什麼樣的指令集,然後設計硬體的電路。根據現在指令集的特徵,可以分為兩類:CSSCRISC

由於指令集是一堆二進位制資料,不方便閱讀和理解,於是就有了組合語言(Assembly language),組合語言就是類似人類語言的方式對執行集進行描述,每個彙編指定都會對應的機械執行。再往後就有了C/C++等高階語言

指令集架構

  • CISC: 複雜指令集計算機,代表的是x86處理器
  • RISC: 精簡指令集計算機,典型代表是ARM處理器

需要注意的一點是RISC可以完全使用暫存器來傳遞引數,而CISC只能使用棧,或者是棧和暫存器結合起來使用

x86/x64彙編基礎

我們主要以瞭解x86的彙編語法來了解組合語言
x86彙編主要的語法有兩種風格: AT&TIntel風格

通常在Linux中見到的AT&T的風格比較多,常見的GCC、GDB、objdump都是使用的AT&T風格,他們兩個之間語法有一些簡單的區別,我們主要了解Intel風格

有很多細節的不同,AT&T的特徵是暫存器和數字的前面通常會加入% $的符號,Intel沒有,十六進位制使用的是0xIntel使用的是後方計入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

INCDEC分別為運算元加1和運算元減1

ADDSUB為加和減

.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  

跳轉指令一般是JMPLOOP,通常分為有條件和無條件跳轉

棧與函式呼叫

相關文章