彙編語言初探 0x00 參考 "阮一峰的網路日誌之彙編語言入門教程" "ARM彙編語言學習筆記(一) ARM彙編的程式結構" 0x01 要點概述 標準化以後,稱為 assembly language,縮寫為 asm,中文譯為彙編語言。 彙編語言是二進位指令的文本形式,與指令是一一對應的關係。 每一種 ...
彙編語言初探
0x00 參考
0x01 要點概述
標準化以後,稱為 assembly language,縮寫為 asm,中文譯為彙編語言。
彙編語言是二進位指令的文本形式,與指令是一一對應的關係。
每一種 CPU 的機器指令都是不一樣的,因此對應的彙編語言也不一樣。
早期的 x86 CPU 的8個寄存器名稱
EAX EBX ECX EDX EDI ESI EBP ESP
ESP 寄存器有特定用途,保存當前 Stack 的地址gcc 將程式轉成彙編語言:gcc -S example.c
一般來說,調用棧有多少層(即函數有多少個),就有多少幀。
一句彙編語言有一個CPU指令和零到多個運運算元組成
0x02 x86 CPU 彙編指令
push
指令
用於將運運算元放入Stack。
該指令有一個前置操作:它會先取出 ESP 寄存器裡面的地址,將其減去幾個位元組,然後將新地址寫入 ESP 寄存器。
pop
指令
用於取出 Stack 最近一個寫入的值(即最低位地址的值),並將這個值寫入運運算元指定的位置。
該指令還會將 ESP 寄存器裡面的地址加4,即回收4個位元組。
mov
指令
用於將一個值寫入某個寄存器。
add
指令
用於將兩個運運算元相加,並將結果寫入第一個運運算元。
call
指令
用來調用函數。
ret
指令
用於終止當前函數的執行,將運行權交還給上層函數。也就是,當前函數的幀將被回收。
0x03 ARM CPU 彙編指令
單行註釋用 @
表示,多行註釋用 /* */
所有以點開頭的都是彙編器指令,就是給彙編器讀的指令,不屬於ARM指令集
.flie:指定了源文件名。手寫可忽略
.align:指定了代碼對齊方式你後面跟的是2的次方
.ascii:聲明字元串
.global:聲明全局符號。全局符號是指在本程式外可訪問的符號
.type:指定符號的類型,“.type main,%function”表示main為函數
.word: 用來存放地址
.size:設定指定符號的大小。“.size main,.-main”中的”.”表示當前地址,減去main符號的地址為整個main函數的大小
.ident:編譯器標識,無實際意義
STR指令
用於從源寄存器中將一個32位的字數據傳送到存儲器中。
該指令在程式設計中比較常用,定址方式靈活多樣,使用方式可參考指令LDR。
STR R0, [R1], #8 : 將R0中的字數據寫入以R1為地址的存儲器中,並將新地址R1+8寫入R1。
STR R0, [R1, #8] ; 將R0中的字數據寫入以R1+8為地址的存儲器中。