对于传统的8051,必须定义一个堆栈段,堆栈空间必须按下面的方法保留。这种定义也适用于扩展的8051和251,而一般情况下,这些控制指令也可以在其它区域设置堆栈。
| STACK | SEGMENT | IDATA | |
| RSEG | STACK | ; 选择堆栈段 | |
| DS | 10h | ; 保留16个字节的空间 |
然后,你必须在程序的开始初始化堆栈指针。
| CSEG | AT | 0 | ; 复位向量 |
| JMP | STARTUP | ; 跳转到启动代码 | |
| STARTUP: | ; 在复位时执行的代码 | ||
| MOV | SP, #STACK - 1 | ; 装入堆栈指针 |
对于Philips 80C51MX或者Intel/Atmel WM 251,可以定义一个堆栈段,而且必须按下面的方法保留堆栈空间。
| STACK | SEGMENT | EDATA | |
| RSEG | STACK | ; 选择堆栈段 | |
| DS | 100h | ; 保留256个字节的空间 |
然后,你必须在程序的开始初始化堆栈指针。
| CSEG | AT | 0 | ; 复位向量 |
| JMP | STARTUP | ; 跳转到启动代码 | |
| STARTUP: | ; 在复位时执行的代码 | ||
| ;为Philips 80C51MX设置堆栈 | |||
| ORL | MXCON, #0x02 | ; 使能扩展的堆栈 | |
| MOV | SPE, #HIGH (STACK - 1) | ; 装入堆栈高字节 | |
| MOV | SP, #LOW (STACK - 1) | ; 装入堆栈低字节 | |
| 为Intel/Atmel WM 251设置堆栈 | |||
| MOV | DR60, #STACK - 1 | ; 装入堆栈指针 | |
如果你要使汇编接口到C,你可能不需要设置堆栈。这在C启动代码中已经为你做好了。
