之前有次有個ARMv8的那篇讓我意識到自己的組語其實基底打得不好,所以趁這次補一下
Assembly language(組合語言),是一種介於高階語言與機器語言的低階語言。他會將要處理的機器碼
((machine code)0,1),以符號化表示。使得人類能更容易讀懂和編寫程式。他會針對特定的處理器架構進行設計,所以每一條指令( instruction )基本上都會對應到處理器的原生機械指令,針對特定的處理器架構進行設計。(大致先這樣概述)
組合語言是架構依賴的,這意味著不同的硬體架構(如 x86, ARM, MIPS)會有不同的指令集。開發者在不同架構上使用組合語言時,必須熟悉該架構的寄存器配置、指令集和記憶體訪問方式。
以下是常見的架構與其應用的場合:
//每行就代表一個指令,其格式為:mnemonic A, B。
//例如:
ADD R0, R1, R2 // 將 R1 和 R2 的值相加,結果存入 R0。
優點:
缺點:
// 1. 資料存取(Data Transfer)
MOV R0, #5 // MOV (Move):將數據5移動到暫存器R0中
STR R0, [R1] // STR (Store Register):將暫存器R0的數據存入記憶體位置R1
LDR R0, [R1] // LDR (Load Register):從記憶體位置R1載入數據到暫存器R0
// 2. 算術運算(Arithmetic Operations)
ADD R0, R1, R2 // ADD (Add):將暫存器R1和R2中的值相加,結果存入R0
SUB R0, R1, R2 // SUB (Subtract):將暫存器R1中的值減去R2中的值,結果存入R0
MUL R0, R1, R2 // MUL (Multiply):將暫存器R1和R2中的值相乘,結果存入R0
DIV R0, R1 // DIV (Divide):將暫存器R0中的值除以R1中的值,結果存入R0
// 3. 邏輯運算(Logical Operations)
AND R0, R1, R2 // AND (Logical AND):將暫存器R1和R2中的值按位與,結果存入R0
ORR R0, R1, R2 // ORR (Logical OR):將暫存器R1和R2中的值按位或,結果存入R0
EOR R0, R1, R2 // EOR (Exclusive OR):將暫存器R1和R2中的值按位異或,結果存入R0
LSL R0, R1, #2 // LSL (Logical Shift Left):將暫存器R1中的值邏輯左移2位,結果存入R0
LSR R0, R1, #2 // LSR (Logical Shift Right):將暫存器R1中的值邏輯右移2位,結果存入R0
// 4. 比較與條件控制(Comparison and Conditional Control)
CMP R0, R1 // CMP (Compare):比較暫存器R0與R1中的值,影響後續條件跳轉
TST R0, R1 // TST (Test):對R0和R1進行按位與運算,僅影響標誌位,不改變暫存器值
B label // B (Branch):無條件跳轉到label位置繼續執行
BL function_name// BL (Branch with Link):跳轉到子程序function_name並儲存返回地址
BX LR // BX (Branch and Exchange):跳轉到暫存器LR指示的地址,並可能切換處理器模式
// 5. 堆疊操作(Stack Operations)
PUSH {R0} // PUSH (Push):將暫存器R0中的值壓入堆疊
POP {R0} // POP (Pop):從堆疊彈出數據到暫存器R0
在我們平常看到的語言裡eax, ebx...是屬於X86架構的通用變數名字,而R0,R1,R2則是ARM 架構的變數名字。
以下是更詳細的說明:
後記:
我知道各位讀得很痛苦,但其實一點都不輕鬆,一起加油慢慢搞懂吧,希望哪天可以用組語手搓一款小遊戲(我在發瘋別理我。