小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

CPU 指令

 融水公子 2021-03-14
表白:黑白圣堂血天使,天劍鬼刀阿修羅。 
講解對象:
/CPU 指令
作者:融水公子 rsgz
匯編教程
匯編教程 http://www./post/91.html

我們通過函數(shù)來理解一下。下面是一個簡單的函數(shù)
int add_a_and_b(int a, int b) {
   return a + b;
}

int main() {
   return add_a_and_b(2, 3);
}

gcc編譯器可以將這個程序轉(zhuǎn)化成匯編語言。發(fā)現(xiàn)轉(zhuǎn)換之后的匯編語言就是一行行的指令,CPU只要執(zhí)行這一行行的指令就可以完成函數(shù)的操作了,匯編會用標(biāo)簽add_a_and_b和main代替兩個函數(shù)
_add_a_and_b:
   push   %ebx
   mov    %eax, [%esp+8] 
   mov    %ebx, [%esp+12]
   add    %eax, %ebx 
   pop    %ebx 
   ret  

_main:
   push   3
   push   2
   call   _add_a_and_b 
   add    %esp, 8
   ret

分析:執(zhí)行的順序是這樣的。
_main:       //棧為_main建立一個幀,地址寫入ESP 寄存器
   push   3     //ESP 寄存器減去整型3的四個字節(jié),push指令把3放入main幀里面
   push   2     //ESP 寄存器減去整型2的四個字節(jié),push指令把2放入main幀里面 累積減了8字節(jié)
   call   _add_a_and_b  //call指令用來調(diào)用函數(shù),建立add_a_and_b幀

--------------------------------------------------------------
_add_a_and_b:  //棧為add_a_and_b建立一個幀,地址寫入ESP 寄存器
   push   %ebx   //ESP 寄存器減去四字節(jié),EBX 寄存器里面的值,寫入_add_a_and_b這個幀 ,累計減去12字節(jié)
   mov    %eax, [%esp+8]  //ESP 寄存器里面地址加8字節(jié),對應(yīng)的是2,將2寫入 EAX 寄存器
   mov    %ebx, [%esp+12] //ESP 寄存器里面地址加12字節(jié),對應(yīng)的是3,將3寫入 EBX 寄存器
   add    %eax, %ebx      //兩個運算子相加,并將結(jié)果寫入第一個運算子
   pop    %ebx            //ESP 寄存器里面地址加4字節(jié),加法已經(jīng)做完了,EBX 寄存器用不到了
   ret         //ret指令終止當(dāng)前函數(shù)的執(zhí)行,當(dāng)前函數(shù)的幀將被回收

--------------------------------------------------------------
   add    %esp, 8  // ESP 寄存器地址手動加8個字節(jié),等于說之前的12字節(jié)都收回來了
   ret   //ret指令退出main函數(shù)

最后我繼續(xù)畫一個畫畫吧

  

=== 
公眾號:小雪妃
謝謝大家的支持!可以點擊我的頭像,進入我的空間瀏覽更多文章呢。建議大家360doc[www.ahfyzs.com]注冊一個賬號登錄,里面真的有很多優(yōu)秀的文章,歡迎大家的到來。
---

    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多