|
;文件名: 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子程序结束
;-------------------------------- ;测试程序结束 ;---------------------------------
|