MCS-51单片机汇编语言的SP指令有什么作用?
我知道它是堆栈指针,但不知道有什么作用。例如,MOVSP,#30H,把30H赋给了SP,对后面的指令有什么影响?...
我知道它是堆栈指针,但不知道有什么作用。
例如,MOV SP,#30H ,把30H赋给了SP,对后面的指令有什么影响? 展开
例如,MOV SP,#30H ,把30H赋给了SP,对后面的指令有什么影响? 展开
3个回答
展开全部
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指令使用堆栈,要注意进出栈的匹配,否则将引起不可预期的后果。
除了初始化堆栈时直接给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指令使用堆栈,要注意进出栈的匹配,否则将引起不可预期的后果。
展开全部
SP是堆栈寄存器,在调用子程序时,都会用到,保存原来程序的环境使用,如各个寄存器的内容,最重要的是,调用返回时程序的运行指令地址,这是由调用时将返回地址压入堆栈,返回时取出并传给PC寄存器来实现的。给SP的初始化值的大小,显示了堆栈的存放位置和堆栈的大小,如果堆栈太小,会出现堆栈溢出的问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
设置了堆栈的栈底,以后就在此地址的上面,作为堆栈空间;
其它指令,一般来说是 不应该 再使用这片地址。
----
把30H赋给了SP,称为设置栈底。以后:
PUSH ACC ,就把ACC的内容存放到31H单元;
PUSH PSW ,就把PSW的内容存放到32H单元;
PUSH B ,就把B的内容存放到33H单元。
……
弹出时,要用POP指令。
利用堆栈,就不用管具体的内容存放在什么单元了,SP会自动管理。
其它指令,一般来说是 不应该 再使用这片地址。
----
把30H赋给了SP,称为设置栈底。以后:
PUSH ACC ,就把ACC的内容存放到31H单元;
PUSH PSW ,就把PSW的内容存放到32H单元;
PUSH B ,就把B的内容存放到33H单元。
……
弹出时,要用POP指令。
利用堆栈,就不用管具体的内容存放在什么单元了,SP会自动管理。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询