myasm.a51

来自「C to ASM and ASM to C on Keil C」· A51 代码 · 共 83 行

A51
83
字号

; 汇编代码部分
$NOMOD51

NAME	MYASM

#include "REG51.H"			; 头文件在当前目录下,允许重复说明

?PR?_fnAdd?MYASM     SEGMENT CODE 	; 码段定义叙述,需要对本文件内的所有
?PR?_fnSub?MYASM     SEGMENT CODE 	; 函数进行描述
?PR?timerCt0?MYASM   SEGMENT CODE

	EXTRN	DATA (aa)		; 全局变量在主程序中已有定义
	extrn CODE (_fnMul)		; 外部C函数调用说明
	PUBLIC	timerCt0		; 对外传递函数名叙述
	PUBLIC	_fnSub
	PUBLIC	_fnAdd

;------------------------------------------------------------------------
; 相对应于C函数的函数格式:
; unsigned char fnAdd( unsigned char x ,unsigned char y )
;------------------------------------------------------------------------
	RSEG  ?PR?_fnAdd?MYASM
_fnAdd:
	USING	0
	PUSH    ACC
	lcall	_fnMul			; *** 调用C函数 ***
	MOV  	A,R7
	ADD  	A,R5
	MOV  	R7,A
	POP	ACC
?C0001:
	RET
;------------------------------------------------------------------------
; 相对应于C函数的函数格式:
; unsigned char fnSub( unsigned char x ,unsigned char y )
;------------------------------------------------------------------------

	RSEG  ?PR?_fnSub?MYASM
_fnSub:
	USING	0
	PUSH	ACC
	CLR  	C
	MOV  	A,R7
	SUBB 	A,R5
	MOV  	R7,A
	POP	ACC
?C0002:
	RET


;-----------------------------------------------------------------------
; 中断函数中断号对应向量表的说明,如果还有其他中断使用汇编的,请一并顺序
; 在此叙述。
;-----------------------------------------------------------------------
CSEG	AT	0000BH			; 定时中断0
	LJMP	timerCt0

;------------------------------------------------------------------------
; 相对应于C函数的函数格式:
; void timerCt0(void) interrupt 1
; 这是一个定时中断函数,作为演示没有做太多的处理,仅仅对(int)aa++。中断函
; 数须要特别留意现场保护
;------------------------------------------------------------------------

	RSEG  ?PR?timerCt0?MYASM
	USING	0
timerCt0:
	PUSH 	ACC
	PUSH	PSW
	MOV  	TH0,#0FFH
	MOV  	TL0,#0E0H
	INC  	aa+01H
	MOV  	A,aa+01H
	JNZ  	?C0004
	INC  	aa
?C0004:
	POP	PSW
	POP  	ACC
	RETI

	END

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?