第10部分-Linux x86 64位彙編 函數調用規則
彙編語言程序中創建函數需要3個步驟。
- 定義需要的輸入值
- 定義對輸入值執行的操作
- 定義如何生成輸出值以及如何把輸出值傳遞給發出調用的程序。
定義輸入值
可以使用寄存器,全局變量或者堆棧。
使用寄存器時候要注意,如果被調用的函數修改主程序使用的寄存器,那麼在被調用之前保存寄存器的當前狀態,並且在函數返回之後恢復寄存器的狀態。可以使用PUSH和POP,或者PUSHA和POPA。
全局變量是在內存中的位置,程序中所有函數都可以訪問這些內存位置。
定義函數處理
彙編器中聲明函數名稱如下:
.type func1,&function
func1:
函數結束由RET指令定義,執行到RET指令時,程序控制返回主程序,返回的位置是緊跟在調用函數的CALL指令後面的指令。
和高級語言不通,可以把任意數量的函數代碼放在_start之前也可以放在主程序之後。
定義輸出值
和輸入值類似,輸出結果可以是下面兩種常見的
把結果存放在一個或多個寄存器中
把結果存放在全局變量內存位置中。
訪問函數
創建好函數後,就可以在程序中的任何位置進行訪問。使用CALL指令用於把控制從主程序傳遞到函數。
call function