生活随笔
收集整理的這篇文章主要介紹了
汇编对sp指针进行修改_从汇编理解函数调用的过程
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
平時,絕大部分時間我們都基本是使用C語言進行程序的編寫。而在C語言中,函數(shù)的調(diào)用是很簡單:只需要把函數(shù)名寫好,參數(shù)填好,然后放在需要調(diào)用的地方就行了。但是如果用匯編來寫的話就不會這么簡單了。下面我們從匯編的方式上對函數(shù)的調(diào)用進行一下理解。
我們知道PC寄存器的值是指向當前執(zhí)行指令的地址,但往往調(diào)用函數(shù)和被調(diào)用函數(shù)他們的地址是不相連的,這里就引出了第一點--需要將PC的值進行更改,讓其指向被調(diào)用函數(shù)的地址,一般使用BL或BLX指令。 當PC指向被調(diào)用函數(shù)后,我們就可以愉快的進行函數(shù)的執(zhí)行了嗎?這里就需要了解另一個知識點了:內(nèi)核在執(zhí)行每個指令時,具體執(zhí)行的各種數(shù)據(jù)都是依靠內(nèi)核上的寄存器的,也就是說內(nèi)核上的寄存器往往保存了當前函數(shù)所需要的信息。問題來了,如果我們在PC指向被調(diào)用函數(shù)后,直接執(zhí)行函數(shù),那么當前函數(shù)的信息就會覆蓋掉之前函數(shù)放在內(nèi)核寄存器上的值,當我們重新回到調(diào)用函數(shù)時,會發(fā)現(xiàn)信息全變了,本來放1的寄存器現(xiàn)在放0,全亂套了。所以我們需要把那些存放了關(guān)鍵信息的寄存器數(shù)據(jù)給保存起來。這里保存的機制就是壓棧:將需要保存的數(shù)據(jù)PUSH到內(nèi)存里。 PUSH好數(shù)據(jù)后就可以開始正常執(zhí)行函數(shù),但函數(shù)執(zhí)行過程中往往會有新變量創(chuàng)建,新變量在哪創(chuàng)建?棧中啊!你就會突然發(fā)現(xiàn):你之前保存好的數(shù)據(jù)上方在函數(shù)執(zhí)行過程中被一些數(shù)據(jù)給壓在下面了,而SP指針只能指向棧頂,你看不到保存的數(shù)據(jù)了。這就意味著,但函數(shù)執(zhí)行完畢后,我們想回去了,但是之前保存好的數(shù)據(jù)取不出來了。雖然我們把數(shù)據(jù)給放進保險箱里保護起來了,但是保險箱被土給埋起來了。那我們該如何把他們給取出來呢?最方便的方法:這個函數(shù)占用了多大的棧,我們用當前的SP值減去它就行了,SP就可以指向我們保存數(shù)據(jù)的位置,然后使用POP指令打卡保險箱就行了,之前保存好的信息就會回到原位。通過將保存再LR寄存器內(nèi)的地址復(fù)制到PC中,就可以回到當初調(diào)用函數(shù)時的位置了,一般為BX或BXL指令或?qū)⒈4婧玫膌r都值push到pc。
總結(jié)
以上是生活随笔為你收集整理的汇编对sp指针进行修改_从汇编理解函数调用的过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。