网站公告列表     本站全新改版正在建设中!  [admin  2007年10月22日]        
加入收藏
设为首页
联系站长
您现在的位置: 东方电子科技有限公司 >> 技术文章 >> HT单片机更多 >> 文章正文
  [图文]HT MCU软件堆栈的应用           ★★★ 【字体:
HT MCU软件堆栈的应用
HT MCU软件堆栈的应用
作者:佚名    文章来源:本站原创    点击数:    更新时间:2007-10-13    
HT MCU软件堆栈的应用


;文件名: SSTACK.INC
;介绍:
;  软件堆栈用数据存储器(RAM)来模拟CALL和RET指令。使用过模拟的CALL指
; 令后 (MCALL),堆栈在数据存储器中从高到低排列。另外,需要使用一个数据存储器;
; 指针(MP)作为堆栈指针(SP)。
;  用法:
;  1. 定义下列单片机中的一种
;   _HT48R10A_1, _HT48R30A_1, _HT48R50A_1, _HT48R70A_1
;  2. 定义_CALL_DEPTH来确定堆栈级数(默认为5级)
;   例如:_CALL_DEPTH EQU 10H
;  3. 默认使用MP0作为堆栈指针
;   可以写入_SS_USE_MP1语句来使用MP1作为堆栈指针
;  4. 在使用软件堆栈之前写入INIT_STACK语句
;  5. 用MCALL proc_name和MRET来模拟CALL和RET指令
;  6. 检测堆栈是否溢出
;   a. 定义SS_DEBUG
;    例如:_SS_DEBUG EQU 1
;   b. SS_OVERFLOW
;   堆栈溢出时,程序会停在SS_OVERFLOW处
; --------------------------------------------------------
; --------------------------------------------------------
IFNDEF  _INCLUDE_SSTACK_INC   
#define _INCLUDE_SSTACK_INC

  IFDEF _HT48R10A_1      
  _ABOVE_HT48R10A_1 EQU  1
  _SS_BOTTOM   EQU  07fh
  _SS_7bitMP   EQU  1
  ELSE
   IFDEF _HT48R30A_1
   _ABOVE_HT48R10A_1 EQU  1
   _ABOVE_HT48R30A_1 EQU  1
   _SS_BOTTOM   EQU  07fh
   _SS_7bitMP   EQU  1
   ELSE
    IFDEF _HT48R50A_1
    _ABOVE_HT48R10A_1 EQU  1
    _ABOVE_HT48R30A_1 EQU  1
    _ABOVE_HT48R50A_1 EQU  1
    _SS_BOTTOM   EQU  0ffh
    ELSE
     IFDEF _HT48R70A_1
     _ABOVE_HT48R10A_1 EQU  1
     _ABOVE_HT48R30A_1 EQU  1
     _ABOVE_HT48R50A_1 EQU  1
     _ABOVE_HT48R70A_1 EQU  1
     _SS_BOTTOM   EQU  0ffh
     ELSE
     MESSAGE 'Software Stack: Not a valid chip'
     QUIT_SSTACK  EQU  1
     ENDIF
   ENDIF
  ENDIF
 ENDIF

IFNDEF QUIT_SSTACK

IFNDEF _SS_DEBUG
_SS_DEBUG  EQU  0
ENDIF

IFNDEF _CALL_DEPTH
_CALL_DEPTH EQU  5
ENDIF

IFNDEF _SS_USE_MP1
_SP  EQU  [01h]
_IAR EQU  [00h]
ELSE
_SP  EQU  [03h]
_IAR EQU  [02h]
ENDIF

_SS_TOP EQU  _SS_BOTTOM-2*_CALL_DEPTH
_PCL  EQU  [06h]

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;INIT_STACK
;
INIT_SSTACK macro
 MOV  A,_ss_bottom-1
 MOV  _SP,A
 endm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;SS_OVERFLOW
;
SS_OVERFLOW macro
_SS_OVR_STOP:
 JMP  $
 endm

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;SS_PUSH
;
SS_PUSH macro value
 MOV  A, value
 MOV  _IAR, A
 DEC  _SP
 endm

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;SS_POP
;
SS_POP macro
 INC  _SP
 MOV  A, _IAR
 endm

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;MCALL
;
MCALL macro labe1
 Local  _RETURN_ADDR
IF _SS_DEBUG
 MOV  A,_SS_TOP-1
IFDEF _SS_7bitMP
 SET   [05h].7
ENDIF
 XOR  A, _SP
 SZ  [0ah].2
 JMP  _SS_OVR_STOP
ENDIF
 SS_PUSH HIGH _RETURN_ADDR
 SS_PUSH LOW _RETURN_ADDR
 JMP labe1
_RETURN_ADDR:
endm

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;MRET
;
IFNDEF SSTACK_ASM
EXTERN _SS_PAGEJMP: NEAR
ENDIF
MRET macro
 JMP  _SS_PAGEJMP
 endm
ENDIF  ;
ENDIF  ;
;----------------------------------------------------------
;end of SSTACK.INC
;----------------------------------------------------------

 

;---------------------------------------------------------
;文件名:SSTACK.ASM
;用途:建立软件堆栈的库文件
;步骤:
; 1. 选择以下单片机中的一种
;  _HT48R10A_1 EQU  1
;  _HT48R30A_1 EQU  1
;  _HT48R50A_1 EQU  1
;  _HT48R70A_1 EQU  1
; 2. 在HT-IDE下进行汇编
; 3. 通过库文件管理生成SS48RX0A_1.LIB,并将产生的目标文件(.OBJ)加入
;  进去。
;-----------------------------------------------------------
_HT48R10A_1 EQU  1
#define SSTACK_ASM
INCLUDE SSTACK.INC

PUBLIC _SS_PAGEJMP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;INTER-PAGE JUMP

_PAGEJMPSEC .SECTION 'CODE'
_SS_PAGEJMP:
 SS_POP
 MOV  [_SS_BOTTOM], A
 SS_POP
 ADDM A, _PCL
 JMP  _SS_PAGE0
 JMP  _SS_PAGE1
IFDEF _ABOVE_HT48R10A_1
 JMP  _SS_PAGE2
 JMP  _SS_PAGE3
IFDEF _ABOVE_HT48R30A_1
 JMP  _SS_PAGE4
 JMP  _SS_PAGE5
 JMP  _SS_PAGE6
 JMP  _SS_PAGE7
IFDEF _ABOVE_HT48R50A_1
 JMP  _SS_PAGE8
 JMP  _SS_PAGE9
 JMP  _SS_PAGE10
 JMP  _SS_PAGE11
 JMP  _SS_PAGE12
 JMP  _SS_PAGE13
 JMP  _SS_PAGE14
 JMP  _SS_PAGE15
IFDEF _ABOVE_HT48R70A_1
 JMP  _SS_PAGE16
 JMP  _SS_PAGE17
 JMP  _SS_PAGE18
 JMP  _SS_PAGE19
 JMP  _SS_PAGE20
 JMP  _SS_PAGE21
 JMP  _SS_PAGE22
 JMP  _SS_PAGE23
 JMP  _SS_PAGE24
 JMP  _SS_PAGE25
 JMP  _SS_PAGE26
 JMP  _SS_PAGE27
 JMP  _SS_PAGE28
 JMP  _SS_PAGE29
 JMP  _SS_PAGE30
 JMP  _SS_PAGE31
ENDIF
ENDIF
ENDIF
ENDIF

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;INTRA-PAGE JUMP
;
P0_ .SECTION AT 00FDH 'CODE'
_SS_PAGE0:
 MOV  A, [_SS_BOTTOM]
 MOV  _PCL, A
P1_ .SECTION AT 01FDH 'CODE'
_SS_PAGE1:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL, A

IFDEF _ABOVE_HT48R10A_1
P2_ .SECTION AT 02FDH 'CODE'
_SS_PAGE2:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P3_ .SECTION AT 03FDH 'CODE'
_SS_PAGE3:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A

IFDEF _ABOVE_HT48R30A_1
P4_ .SECTION AT 04FDH 'CODE'
_SS_PAGE4:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P5_ .SECTION AT 05FDH 'CODE'
_SS_PAGE5:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P6_ .SECTION AT 06FDH 'CODE'
_SS_PAGE6:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P7_ .SECTION AT 07FDH 'CODE'
_SS_PAGE7:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A

IFDEF _ABOVE_HT48R50A_1
P8_ .SECTION AT 08FDH 'CODE'
_SS_PAGE8:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P9_ .SECTION AT 09FDH 'CODE'
_SS_PAGE9:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P10 .SECTION AT 0AFDH 'CODE'
_SS_PAGE10:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P11 .SECTION AT OBFDH 'CODE'
_SS_PAGE11:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P12 .SECTION AT 0CFDH 'CODE'
_SS_PAGE12:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P13_.SECTION AT 0DFDH 'CODE'
_SS_PAGE13:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P14_.SECTION AT 0EFDH'CODE'
_SS_PAGE14:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P15 .SECTION AT 0FFDH 'CODE'
_SS_PAGE15:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A

IFDEF _ABOVE_HT48R70A_1
P16 .SECTION AT 10FDH 'CODE'
_SS_PAGE16:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P17 .SECTION AT 11FDH 'CODE'
_SS_PAGE17:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P18 .SECTION AT 12FDH 'CODE'
_SS_PAGE18:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P19 .SECTION AT 13FDH 'CODE'
_SS_PAGE19:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P20 .SECTION AT 14FDH 'CODE'
_SS_PAGE20:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P21 .SECTION AT 15FDH 'CODE'
_SS_PAGE21:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P22 .SECTION AT 16FDH 'CODE'
_SS_PAGE22:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P23 .SECTION AT 17FDH 'CODE'
_SS_PAGE23:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P24 .SECTION AT 18FDH 'CODE'
_SS_PAGE24:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P25 .SECTION AT 19FDH 'CODE'
_SS_PAGE25:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P26 .SECTION AT 1AFDH 'CODE'
_SS_PAGE26:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P27 .SECTION AT 1BFDH 'CODE'
_SS_PAGE27:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P28 .SECTION AT 1CFDH 'CODE'
_SS_PAGE28:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P29 .SECTION AT 1DFDH 'CODE'
_SS_PAGE29:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P30 .SECTION AT 1EFDH 'CODE'
_SS_PAGE30:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
P31 .SECTION AT 1FFDH 'CODE'
_SS_PAGE31:
 MOV  A,[_SS_BOTTOM]
 MOV  _PCL,A
ENDIF
ENDIF
ENDIF
ENDIF
;------------------------------------------------------------
;end of SSTACK.ASM
;-------------------------------

;-------------------------------------------------------
;程序名: Test.asm
;作者: 盛扬半导体(上海)有限公司软件部
;目的: 测试软件堆栈
;--------------------------------------------------------
_HT48R10A_1 EQU 1     ;定义使用HT48R10A-1单片机 
_SS_DEBUG EQU 1     ;设定调试使能
_CALL_DEPTH EQU  3   ;设定堆栈为3级
include SSTACK.INC    
main .section at 0 'code'
 INIT_SSTACK     ;初始化软件堆栈
again:
 MCALL mfunc     ;调用mfunc子程序
 Jmp  again     ;循环
 SS_OVERFLOW     ;如果堆栈溢出,程序停止

mfunc PROC      ;mfunc2子程序
  MCALL mfunc2    ;调用MFUNC2子程序
  MRET      ; mfunc子程序返回
mfunc ENDP      ; mfunc子程序结束
mfunc2 PROC      
  MCALL mfunc3    ;调用MFUNC3子程序
  MRET      ; mfunc2子程序返回
mfunc2 ENDP      ; mfunc2子程序结束
mfunc3 PROC      ; mfunc3子程序
  MRET      ; mfunc3子程序返回
mfunc3 ENDP      ; mfunc3子程序结束

;--------------------------------
;测试程序结束
;---------------------------------
;-------------------------------------------------------
;程序名: Test.asm
;作者: 盛扬半导体(上海)有限公司软件部
;目的: 测试软件堆栈
;--------------------------------------------------------
_HT48R10A_1 EQU 1     ;定义使用HT48R10A-1单片机 
_SS_DEBUG EQU 1     ;设定调试使能
_CALL_DEPTH EQU  3   ;设定堆栈为3级
include SSTACK.INC    
main .section at 0 'code'
 INIT_SSTACK     ;初始化软件堆栈
again:
 MCALL mfunc     ;调用mfunc子程序
 Jmp  again     ;循环
 SS_OVERFLOW     ;如果堆栈溢出,程序停止

mfunc PROC      ;mfunc2子程序
  MCALL mfunc2    ;调用MFUNC2子程序
  MRET      ; mfunc子程序返回
mfunc ENDP      ; mfunc子程序结束
mfunc2 PROC      
  MCALL mfunc3    ;调用MFUNC3子程序
  MRET      ; mfunc2子程序返回
mfunc2 ENDP      ; mfunc2子程序结束
mfunc3 PROC      ; mfunc3子程序
  MCALL mfunc4
  MRET      ; mfunc3子程序返回
mfunc3 ENDP      ; mfunc3子程序结束
mfunc4 PROC      ; mfunc3子程序
  MRET      ; mfunc3子程序返回
mfunc4 ENDP      ; mfunc3子程序结束

;--------------------------------
;测试程序结束
;---------------------------------


文章录入:admin    责任编辑:admin 
  • 上一篇文章: 没有了

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    利用单片机I/O口直接驱动LCD
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    Copyright © 2005-2008 东方电子科技. All Rights Reserved. 本网站由东方电子科技制作与维护 地址:东莞市塘厦镇林村环村路190号二三楼整层(林村小学对面) 电话:076987282024 手机:13712641904 Email: sanplug@126.com 粤ICP备06051393号 站长:admin