日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

汇编对sp指针进行修改_从汇编理解函数调用的过程

發(fā)布時間:2023/12/19 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编对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)容還不錯,歡迎將生活随笔推薦給好友。