呼叫彙編庫:
程式堆疊
引數3引數2
引數1返回位址
舊的ebp值 esp
區域性變數。。。
可以安全使用mmx sse 但是必須小心使用fpu
必須保留ebx edi esi ebp esp
eax 用於儲存輸出值
ebx 用於指向全域性偏移表
ecx 在函式中可用
edx 在函式中可用
ebp c中作為基位址指標 必須保留
esp 在函式中用於指向新的堆疊位置 必須保留
edi 區域性暫存器 必須保留
esi 區域性暫存器 必須保留
st(0) 用於儲存浮點值,但是可能在函式返回之前被修改
st(1)-(7) 在函式中可用
c語言呼叫彙編模板
.section .text
.type func , @function
func:
pushl %ebp
movl %esp , %ebp
subl $12 , %esp
pushl %edi
pushl %esi
pushl %ebx
....function code
popl %ebx
popl %esi
popl %edi
movl %ebp , %esp
popl %ebp
ret64位整數,返回值存放在edx:eax中。
對字串返回位址值
c語言預設返回整數值,返回其它型別必須宣告
原型通常放在define include語句之後,必須在main函式之前。
c樣式使用st(0)在函式之間交換浮點值。
精度不是特別重要。
呼叫函式能夠按照錯誤的順序把值存放到堆疊中。
彙編函式能夠按照錯誤的順序從堆疊中讀取值。
靜態庫:ar
ar d 從存檔檔案中刪除檔案
m 把檔案移動到存檔檔案中
p 把存檔檔案中指定的檔案輸出到標準輸出流
q 快速把檔案追加到存檔檔案中
r 把檔案插入(替換)到存檔檔案中。
t 顯示存檔檔案中的檔案列表
x 從存檔檔案提取檔案
修飾: a 新增到後面 b 前面 c 建立 f 截短存檔檔名稱
i p s u v
約定 libx.a
ar r libcgap14.a square.o cpuidfunc.o areafunc.o greater.o fpmathfunc.o
ranlib 建立顯示存檔檔案索引
nm -s libchap14.a | more
使用庫來編譯不會影響可執行檔案長度
共享庫libx.so
gcc -shared -o libchap14.so square.o cpuidfunc.o areafunc.ogcc -o inttest -l. -lchap14 inttest.c
動態載入找不到相應函式**
ldd inttest
/etc/ld.so.conf ldconfig
export ld_library_path="$ld_library_path:."
除錯彙編函式 gcc -gstabs
編譯器優化:
優化運算,變數,迴圈,條件分支,通用子表示式。
優化變數:
使用.data .bss段在記憶體定義變數。
使用ebp基址針在堆疊中定義變數
使用可用的暫存器儲存變數。
直接使用常量。
迴圈使用暫存器控制次數
.p2align 4,,7
.p2align number , value , max
number 位址中必須為0的低位0位的位數。
value填充位元組中使用的值。跳過則為0
max 對準指令應該跳過的最大位元組數。7表示對準下一段應該跳過的位元組數量不應該超過7個位元組。否則會跳過改指令。
AT T彙編學習筆記之字串
movsb 傳送單位元組 movsw movsl 傳送雙字 源運算元esi指向記憶體位置 edi目的運算元 movl output edi lea指定記憶體位置 源運算元必須指向乙個記憶體位置 leal output edi eflags df決定傳送方向 正向0 cld 反向 1 std std向...
at t彙編學習(一)
工作一年了,很是迷茫,乙個程式設計師不知到何去何從,現在網際網路上每天都會出現大量的程式語言,大量的新技術,感覺沒有自己的方向。找不到方向就積累知識。at t組合語言的基本框架如下所示 section data section text globl start start movl 1,eax mo...
iOS 學習 AT T彙編
at t彙編和8086組合語言雖然兩者很相似,但是還是不能根據8086的語法規則來讀at t彙編的吧,所以還是要看看at t彙編的語法規則,因為在讀核心 時,跟硬體打交道的部分 是用at t彙編編寫的,所以不可避免的會遇到at t彙編,下面先來看看at t彙編的語法規則吧。一 大小寫 intel格式...