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