汇编代码中使用栈
? ? ? ? ? ?先看一段代碼:
? ? ? ? ? ?
? ? ? ? ? 上面代碼的作用是將程序中的數據逆序存放,程序定義自己的數據,還定義一段空值內存來當做棧來使用,在程序加載時,操作系統會為它們分配內存。start表示程序的入口處,start的上面只是程序定義的數據。
? ? ? ? ? ss:sp是用來指向棧頂的,mov ax,cs是要ss指向程序的數據部分ss:48,棧底對應的那段內存地址是ss:16~ss:47。當棧空時,棧頂指針棧頂的下一個地址,即ss:48 。cs:[bx]這里的cs稱為段前綴,通常'[]'都是取段寄存器ds中的值,但是如果有段前綴,則'[]'取段前綴的地址。
? ? ? ? ?上述代碼中,棧頂指針ss:sp指向cs:40,push操作時:sp=sp-2;pop操作時:sp=sp+2,因為棧是從高地址往低地址增長的。push cs:[bx]對應的那個循環是將程序中的數據入棧。兩個循環bx來做偏移量,中間需要重置值。下面debug看一下。
?查看cd:0對應的數據,看到 23 01正是程序定義的數據,01是高位,23是低位。
當還沒有執行pop cs:[bx]指令時,1cd2:0020最后2個數據正好是0123h,這就是程序第一個push進入棧的,之前為00的數據現在有的已經有值了。下面再來看出棧。
現在第一個數據為0987h,這剛好是程序定義的第一個數據。
?
?
?
參考資料:<<匯編語言>>王爽
?
總結
- 上一篇: 汇编实现地址对应值相加
- 下一篇: 汇编中类似数组的寻址方式