匯編函數 哪些寄存器在使用時需要保護和恢復現場
阿新 • • 發佈:2018-12-16
-- size 相互 sdn 感覺 必須 mint 來源 返回
在寫匯編函數時,總感覺在哪些寄存器該保護哪些不需要保護的問題上比較模糊,要是保護所有使用到的寄存器感覺比較死板也不符合規則,所以就去網上搜了搜。找到了一些規則,我覺得這是一個規則問題,大家都遵守的話就可以相互復用函數了,當然這個規則也是有一定道理的。
1、你自己的函數在操作改變edi esi ebx ebp esp這幾個寄存器的值時,你必須先保存這幾個寄存器原先的值,並在函數返回之前恢復上述這幾個寄存器原先的值。
2、你的函數在調用外部的函數時,edi esi ebx ebp esp這幾個寄存器不會被函數修改(因為在函數中會保護這些寄存器),所以在調用外部函數時你的函數不用進行保存,但eax ecx edx這三個寄存器的值你的函數在調用外部函數前必須先保存(因為函數中不會保護這三個寄存器)。
還有就是關於棧恢復的問題,就是在調用函數之前的參數入棧和恢復棧的問題,可以采用C中的規則:
後面的參數先入棧,由調用者恢復棧(恢復時可以簡單地使用add esp,num,其中num就是你入棧時的參數字節數)
---------------------
作者:xiaominthere
來源:CSDN
原文:https://blog.csdn.net/xiaominthere/article/details/17486129
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
匯編函數 哪些寄存器在使用時需要保護和恢復現場