51单片机程序计数器PC和堆栈指针SP如何指挥ROM和RAM工作

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编程模型

Keil中的执行情况

编程模型寄存器组

8位数据寄存器组

16位地址寄存器组

程序计数器PC

堆栈指针SP

状态标记寄存器组指令集

汇编指令集

C51指令集

编程模型

16位地址寄存器组片内ROM 8位数据寄存器组片内RAM

地址内容(指令)0x0FFF xx

0x0FFE xx

(xx)

0x0101xx

0x0100xx

(xx)

0x0002xx

0x0001xx

0x0000 xx 地址内容(数据)0x7F xx

0xFE xx

(xx)

0x61xx

0x60xx

(xx)

0x02xx

0x01xx

0x00 xx

只考虑片内时

SP、PC

SP PC

SP:堆栈指针,51单片机堆栈是向上生长型,即栈底是低位地址。SP 指向栈顶。存放有顺序要求的数据。用途:

(1)用来存放压入堆栈的数据。(2)存放函数调用是断口地址。(3)中断断口地址及保存数据。51单片机复位后的SP默认地址:

07H,为了避免和位寻址区重合,一般设置50H或者60H。PC:程序计数器,51单片机内不可访问,独立结构的16位地址寄存器。

(1)自动+1,CPU从ROM中每读一个字节,自动执行PC+1→PC。(2)执行转移指令,PC会根据指令要求修改下一次读ROM的地址(3)执行子程序调用或中断时,CPU自动将下一条执行的PC值压入堆栈,将子程序或中断入口地址装入PC,返回时,恢复原有压入堆栈的PC值,继续执行原程序。

举一个例子(汇编程序)

ORG0000H;规定下一条指令的起始地址为0000H

JMP START;跳转指令,程序跳转到START处执行

ORG0400H;规定下一条指令DELY 的起始地址为0400H

DELY: ;子函数DELY

NOP;NOP指令,空操作,什么都不做,消耗该指令周期的时间

RET;返回指令,弹出堆栈中断口地址,DELY调用返回指令

ORG0100H;规定下一条指令START 的起始地址为0100H

START: ;函数START

MOV SP,#60H ;设置堆栈指针的值,即设置单片机栈底的地址为60H

MOV DPTR,#1234H;将立即数1234H赋值给DPTR,其中低8位给DPTR的DPL(34H),

;高8位给DPTR的DPH(12H)

PUSH DPH;将DPH中数据12H压入堆栈

PUSH DPL;将DPL中数据34H压入堆栈

CALL DELY;调用子函数DELY

POP DPH;弹出堆栈中栈顶数据到DPH中

POP DPL;弹出堆栈中栈顶数据到DPL中

LJMP$;原地等待

END;结束标志

KEIL中的执行情况

PC=0x0000 ;即0000H

SP=0x07 ;即07H

黄色箭头表示PC指针指向

PC=0x0100 ;即0100H SP=0x07 ;即07H

PC指针指向下一条指令

PC=0x0103 ;即0103H SP=0x60 ;即60H

PC指针指向下一条指令

PC=0x0106 ;即0106H SP=0x60 ;即60H

PC指针指向下一条指令

PC=0x0108 ;即0108H

SP=0x61 ;即61H,且地址为61H中的数据为12H PC指针指向下一条指令

PC=0x010A ;即010AH

SP=0x62 ;即62H,且地址为61H中的数据为12H,62H中的数据为34H

PC指针指向下一条指令

PC=0x0400 ;即0400H

SP=0x64 ;即62H,且地址为61H中的数据为12H,62H中的数据为34H,63H中的数据为0CH,64H中的数据为01H。

PC指针指向下一条指令

PC=0x0401 ;即0401H

SP=0x64 ;即62H,且地址为

61H中的数据为12H,62H中的数

据为34H,63H中的数据为0CH,

64H中的数据为01H。

PC指针指向下一条指令

60H 61H 62H 63H

PC=0x010C ;即010CH

SP=0x62 ;即62H,且地址为61H中的数据为12H,62H中的数据为34H,63H和64H中的数据弹出。

PC指针指向下一条指令

SP DPL DPH

PC=0x010E ;即010EH

SP=0x61 ;即61H,且地址为61H中的数据为12H,62H中的数据弹出。

PC指针指向下一条指令

SP DPL DPH

PC=0x0110 ;即0110H

SP=0x60 ;即60H,且地址为61H中的数据弹出。

PC指针指向下一条指令

程序功能实现了DPH和DPL数据的交换。

SP DPL DPH

总结

PC指针从ROM区(16位地址)一条一条取指令执行。堆栈设置在RAM区,可通过SP指针设置,堆栈中的内容可以是数据也可是地址(16位地址拆分为2个字节,低8位地址存放在低地址字节中,高8位存放在高地址字节中),压入堆栈的数据必须弹出,否则无法恢复原状。程序执行就在PC指针和SP指针的调度下在ROM和RAM中有序执行。

相关文档
最新文档