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