堆棧sp指針如何變化 匯編中,BP,SP有何區(qū)別?
匯編中,BP,SP有何區(qū)別?SP—堆棧指針。在程序中,堆棧指針只能通過push、pop、sub SP、N、add SP、N等指令進(jìn)行移動。BP—堆?;芳拇嫫鳌.?dāng)(1)在堆棧中打開一定量的空間來存儲數(shù)
匯編中,BP,SP有何區(qū)別?
SP—堆棧指針。在程序中,堆棧指針只能通過push、pop、sub SP、N、add SP、N等指令進(jìn)行移動。BP—堆棧基址寄存器。當(dāng)(1)在堆棧中打開一定量的空間來存儲數(shù)據(jù)或(2)在主例程和子例程之間傳遞參數(shù)時,使用BP。例如,在程序的數(shù)據(jù)部分中,變量單位沒有分配,但您暫時需要兩個字單位。您可以:sub SP,4-------打開四字節(jié)空間mov BP,SP-------將當(dāng)前堆棧指針保存到堆?;鵅P,這樣您就可以引用add word PTR[BP],2add word PTR[BP 2],4。。。。。。。。。。。Add SP,4------使用后返回4字節(jié)的空間以保持堆棧的平衡
堆棧指針為SP(stack pointer)。堆棧本身在內(nèi)存中,也就是說,它需要占用一段內(nèi)存空間,這是由我們分配的。在初始化期間,SP有一個默認(rèn)值,但默認(rèn)值指向的地址不是我們想要的地址。如果要使用某段內(nèi)存作為堆棧區(qū),我們會重置堆棧指針SP,進(jìn)程調(diào)用和中斷調(diào)用中的棧頂操作是由SP指定的,所以有時我們要根據(jù)自己的要求先設(shè)置SP,調(diào)用后恢復(fù)。
匯編語言中,為什么要對堆,指針PS進(jìn)行設(shè)置?
在MCS-51單片機(jī)的匯編語言中,沒有SP指令,只有SP操作指令。SP是51單片機(jī)中的堆棧指針寄存器,存儲當(dāng)前堆棧地址。堆棧用于存儲子程序調(diào)用和中斷程序調(diào)用的返回地址,或臨時存儲寄存器的值。除了在初始化堆棧時直接為sp賦值外,sp還顯式存在。其他影響SP的指令在SP上隱式操作,即SP不出現(xiàn)在指令操作數(shù)中。例如,當(dāng)以下指令(SP)=(SP)2nop子例程返回時,RET指令從堆棧中彈出PC值,因此它將返回這里,(SP)=(SP)-2Push ACC accumulator A的內(nèi)容被存儲,(SP)=(SP)1pop堆棧B中存儲的累加器A的內(nèi)容彈出到寄存器B,(SP)=(SP)-1。使用push和pop指令來使用堆棧。注意堆棧內(nèi)外的匹配,否則會造成意想不到的后果。另外,如果將30h分配給sp,則稱為設(shè)置堆棧底部。稍后:push ACC在31h單元中存儲ACC內(nèi)容;push PSW在32H單元中存儲PSW內(nèi)容;push B在33H單元中存儲B內(nèi)容彈出時應(yīng)使用Pop命令。使用堆棧,您不必關(guān)心特定內(nèi)容存儲在哪個單元中。SP將自動管理它。
什么是堆棧,51單片機(jī)堆棧指針SP的使用舉例?
匯編中mov sp?
這里保存堆棧區(qū)域的值。SP指針指向2000:0010,因此第一行是堆棧的內(nèi)容。在執(zhí)行t命令時,首先將flags標(biāo)志放入堆棧,然后將斷點地址1000:0008放入堆棧,這樣t命令就可以返回MOV ax,3123指令,然后保存堆棧段地址2000:0000。不省略Mov SP,10,而是在執(zhí)行Mov SS,ax時一起執(zhí)行。這是為了確保對SS段寄存器和堆棧指針的修改不會被破壞。(在此期間,CPU不會響應(yīng)其他中斷)