⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 push.s

📁 ARM push assembly example
💻 S
字号:
/* include symbol file */.include "push.h"/* define symbols of program */.set	IRQ0,			0x00000001.set	IRQ6,			0x00000040.set	IRQ7,			0x00000080.set	DELAY_CNT,		0xffff.set	MODE_USR,		0x10.set	MODE_IRQ,		0x12.set	MODE_SVC,		0x13.set	I_BIT,			0x80.set	F_BIT,			0x40.set	LCM_WR_1,		0x00000010.set	LCM_WR_0,		0xffffffef.set	LCM_RS_1,		0x00000020.set	LCM_RS_0,		0x000000df.set	LCM_E_1,		0x00000020.set	LCM_E_0,		0xffffffdf.set	LCM_FUNC_SET,		0x38.set	LCM_DISP_ON,		0x0e.set	LCM_DISP_OFF,		0x08.set	LCM_DISP_CLR,		0x01.set	LCM_ENTRY_SET,		0x06/* define symbols for memory management */.set	IRQ_STACK,		0x08031000.set	USR_STACK,		0x08030f00.set	SVC_STACK,		0x08030e00.set	LED_STATUS,		0x08030000.set	LCM_STATUS,		0x08030001.global _start_start:.text.code 32exception_vector:	b	reset_handler			b	undefined_handler			b	swi_handler			b	prefetch_handler			b	abort_handler			nop			b	irq_handler			b	fiq_handler		/* reset exception handler */reset_handler:/* allocate stack for supervisor mode */			ldr	sp, =SVC_STACK/* initialize variable LED_STATUS */			ldr	r0, =LED_STATUS			mov	r1, #0x01			strb	r1, [r0]/* initialize variable LCM_STATUS */			ldr	r0, =LCM_STATUS			mov	r1, #0			strb	r1, [r0]/* setup PORT A */												ldr	r0, =PORTA_DIR			mov	r1, #0			str	r1, [r0]			ldr	r0, =PORTA_MUX					ldr	r1, =0x3fff			str	r1, [r0]/* setup PORT 7 */			ldr	r0, =PORT7_DIR			mov	r1, #0xcf			str	r1, [r0]				ldr	r0, =PORT7_MUX						mov	r1, #0x30			str	r1, [r0] /* setup PORT B */			ldr	r0, =PORTB_DIR			mov	r1, #0			str	r1, [r0]					ldr	r0, =PORTB_DATA			mov	r1, #0			str	r1, [r0]					ldr	r0, =PORTB_MUX			ldr	r1, =0x00000faa			str	r1, [r0]/* setup PORT 9 */					ldr	r0, =PORT9_DIR			mov	r1, #0			str	r1, [r0]			ldr	r0, =PORT9_DATA			mov	r1, #0			str	r1, [r0]			ldr	r0, =PORT9_MUX			ldr	r1, =0x00000140			str	r1, [r0]/* initialize LCM */			adr	r6, string_init			mov	r8, #5	lcm_init_loop:		ldrb	r1, [r6]			ldr	r2, =LCM_RS_0			bl	lcm_write			add	r6, r6, #1			subs	r8, r8, #1			bne	lcm_init_loop/* setup interrupt controller */				ldr	r0, =TRIGGER_MODE			ldr	r1, =0x01000000			str	r1, [r0]					ldr	r0, =TRIGGER_POLAR			ldr	r1, =0x01000000			str	r1, [r0]					ldr	r0, =INT_DIR			mov	r1, #0			str	r1, [r0]					ldr	r0, =FIQ_MASK			ldr	r1, =0x01ffffff			str	r1, [r0]					ldr	r0, =IRQ_MASK			ldr	r1, =0x01ffffbe			str	r1, [r0]			ldr	r0, =INT_STATUS_CLR			ldr	r1, =0x00000041			str	r1, [r0]								ldr	r0, =GLOBAL_MASK			ldr	r1, =0x01ffffbe			str	r1, [r0]			/* chnage to irq mode and allocate stack */			mov	r0, #MODE_IRQ | I_BIT | F_BIT			msr	cpsr_c, r0			ldr	sp, =IRQ_STACK			/* change to user mode and allocate stack */			mov	r0, #MODE_USR			msr	cpsr_c, r0			ldr	sp, =USR_STACK/* jump to main program */			b	start/* undefined exception handler */undefined_handler:	movs	pc, lr/* swi exception handler */swi_handler:		movs	pc, lr/* prefetch abort exception handler */prefetch_handler:	subs	pc, lr, #4/* data abort exception handler */abort_handler:		subs	pc, lr, #8/* irq exception handler */irq_handler:		sub	lr, lr, #4			stmfd	sp!, {r0-r12,lr}			ldr	r0, =IRQ_STATUS			ldrt	r4, [r0]			tst	r4, #IRQ0			blne	irq0_handler			tst	r4, #IRQ6			blne	irq6_handler			ldmfd	sp!, {r0-r12,pc}^/* irq0 handler */			irq0_handler:		ldr	r0, =INT_STATUS_CLR			ldr	r1, =0x00000001			strt	r1, [r0]			ldr	r0, =LED_STATUS			ldrbt	r1, [r0]			cmp	r1, #0x00000080			movne	r1, r1, LSL #1			moveq	r1, #1			strb	r1, [r0]			mvn	r1, r1			ldr	r0, =PORTA_DATA			strt	r1, [r0]										mov	pc, lr			/* irq 6 handler */irq6_handler:		mov	r3, lr						ldr	r0, =INT_STATUS_CLR			ldr	r1, =0x00000040			strt	r1, [r0]						ldr	r1, =LCM_DISP_CLR			ldr	r2, =LCM_RS_0			bl	lcm_write			ldr	r0, =LCM_STATUS			ldrb	r1, [r0]			cmp	r1, #9			subeq	r1, r1, r1			addne	r1, r1, #1			strb	r1, [r0]			add	r1, r1, #0x30			ldr	r2, =LCM_RS_1			bl	lcm_write						mov	lr, r3			mov	pc, lr				/* fiq exception handler */fiq_handler:		subs	pc, lr, #4/* declare constants */.poolstring_init:.byte		LCM_FUNC_SET, LCM_DISP_OFF, LCM_DISP_CLR, LCM_DISP_ON, LCM_ENTRY_SET/* main program */start:/* display first LED */			ldr	r0, =LED_STATUS			ldrb	r1, [r0]			mvn	r1, r1			ldr	r0, =PORTA_DATA			str	r1, [r0]					/* LCM display char 0 */			ldr	r0, =LCM_STATUS			ldrb	r1, [r0]			add	r1, r1, #0x30			ldr	r2, =LCM_RS_1			bl	lcm_write/* program wait here */stop:			b	stop/* lcm write subroutine */lcm_write:		stmfd	sp!, {r0-r7, lr}			mov	r3, #0			mov	r5, #0			ldr	r0, =PORT9_DATA			ldr	r4, =LCM_E_0			and	r3, r3, r4			str	r3, [r0]			ldr	r0, =0x1fff			bl	delay					ldr	r0, =PORT7_DATA			orr	r5, r5, r2			str	r5, [r0]			ldr	r0, =PORT9_DATA			ldr	r4, =LCM_WR_0			and	r3, r3, r4			str	r3, [r0]				ldr	r0, =0x1fff			bl	delay						ldr	r0, =PORT9_DATA			ldr	r4, =LCM_E_1			orr	r3, r3, r4			str	r3, [r0]			ldr	r0, =0x1fff					bl	delay					ldr	r0, =PORTB_DATA			str	r1, [r0]					ldr	r0, =0x1fff			bl	delay						ldr	r0, =PORT9_DATA			ldr	r4, =LCM_E_0			and	r3, r3, r4			str	r3, [r0]			ldr	r0, =0x1fff			bl	delay			ldmfd	sp!, {r0-r7, lr}			mov	pc, lr		/* delay subroutine */delay:			subs	r0, r0, #1			bne	delay			mov	pc, lr.end

⌨️ 快捷键说明

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