2019年8月5日 星期一

unix組語筆記


gcc inline的ouput第一個會自動從eax取得 默認只能取一個(有空再研究一下gcc的inline好了)
movq 需要 uint64_t, movl 則只需要普通int
當call一個function會有
call function //function是函數簽名
每次進人新function,function內的頭2句都會是
push rbp
mov rsp,rbp
作用是把上一個function的回傳地址推入stack然後再將目前的rsp內容複製到rbp,是一個進入新環境的概念 然後離開函式時會
ret //same as "pop eip"
把當前esp pop進eip
另外再留一下gdb的用法 對理解程序有幫助 首先如果想反組譯某些函數
b*funcname //funcname是函數名 另外建議幫gdb安裝插件例如gdb-peda 一目了然比較好懂
r//same as run 作用是從breakpoint開始函式
nexti//下一個執行組語指令
p *x//打印x位置所存內容
i r//打印r系列register
x /100c addr//顯示addr開始以後100個位的內容
一個小撇步:如果想查看array的內容 可以用以下指令
p *(T (*)[N])addr //T是類形 N是array長度 addr是位址,記住array的位址是裝著第一個元素位址的前一個位址如:
//0x7fffffffdc90 --> 0x7fffffffdd08(array的地址 上面的addr) --> 0x7fffffffe0c7 ("array element")
//實用例子:打印一個在0x7fffffffdd08,類型為char*[74]的array
p *(char* (*)[74])0x7fffffffdd08


最後記一個與組語無關的小知識 在研究unix執行程式開始運行的程序段(有興趣google一下_init)我發現了一般C的main寫法
int main(int argc, char *argv[])
不是完全究極體(?),真正完整的main是:
int main(int argc, char *argv[], char *envp[])
其中的envp保存了運行程序時的環境訊息,比如你的os distro名啦,你開程式的方式啦,你的工作站名稱啦 如此類推

有空再寫一篇筆記討論一下好了,unix中的程序運行方式與glibc 留個連結

沒有留言:

張貼留言