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 留個連結
沒有留言:
張貼留言