MCS-51微控制器組合語言中,沒有SP這條指令,只有針對SP操作的指令。51微控制器中SP是堆疊指標暫存器,存放著當前堆疊地址。堆疊用於儲存子程式呼叫、中斷程式呼叫時程式返回的地址,或者用來臨時儲存某一暫存器的值。 除了初始化堆疊時直接給SP賦值,SP顯式存在,其它的對SP有影響的指令,對SP的操作都是隱式的,就是說SP並不出現在指令運算元當中。 例如: MOV SP,#80H ;初始堆疊指標,(SP)=80H LCALL XXXX;呼叫XXXX處的子程式,下一條指令PC值壓棧,(SP)=(SP)+2 NOP;子程式返回時,RET指令從堆疊中彈出PC值,所以會返回到這裡,(SP)=(SP)-2 PUSH ACC;累加器A的內容壓棧儲存,(SP)=(SP)+1 POP B;堆疊內儲存的累加器A的內容彈出到B暫存器中,(SP)=(SP)-1 使用PUSH、POP指令使用堆疊,要注意進出棧的匹配,否則將引起不可預期的後果。 另外 如果把30H賦給了SP,稱為設定棧底。以後: PUSH ACC ,就把ACC的內容存放到31H單元; PUSH PSW ,就把PSW的內容存放到32H單元; PUSH B ,就把B的內容存放到33H單元。 …… 彈出時,要用POP指令。 利用堆疊,就不用管具體的內容存放在什麼單元了,SP會自動管理。
MCS-51微控制器組合語言中,沒有SP這條指令,只有針對SP操作的指令。51微控制器中SP是堆疊指標暫存器,存放著當前堆疊地址。堆疊用於儲存子程式呼叫、中斷程式呼叫時程式返回的地址,或者用來臨時儲存某一暫存器的值。 除了初始化堆疊時直接給SP賦值,SP顯式存在,其它的對SP有影響的指令,對SP的操作都是隱式的,就是說SP並不出現在指令運算元當中。 例如: MOV SP,#80H ;初始堆疊指標,(SP)=80H LCALL XXXX;呼叫XXXX處的子程式,下一條指令PC值壓棧,(SP)=(SP)+2 NOP;子程式返回時,RET指令從堆疊中彈出PC值,所以會返回到這裡,(SP)=(SP)-2 PUSH ACC;累加器A的內容壓棧儲存,(SP)=(SP)+1 POP B;堆疊內儲存的累加器A的內容彈出到B暫存器中,(SP)=(SP)-1 使用PUSH、POP指令使用堆疊,要注意進出棧的匹配,否則將引起不可預期的後果。 另外 如果把30H賦給了SP,稱為設定棧底。以後: PUSH ACC ,就把ACC的內容存放到31H單元; PUSH PSW ,就把PSW的內容存放到32H單元; PUSH B ,就把B的內容存放到33H單元。 …… 彈出時,要用POP指令。 利用堆疊,就不用管具體的內容存放在什麼單元了,SP會自動管理。