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