u012747072
menxiaoqi
采纳率0%
2015-02-03 10:19 阅读 2.5k

ARM汇编,MDK,ARM初学

我是一名linux嵌入式初学者,现在在看ARM处理器。
使用的是一块S3C2440的开发板,目前的开发调试环境是KEIL4。

我在一个添加了启动代码的工程中添加一个自己编写的简单汇编文件。然后在启动代码的C入口点处修改,import添加的简单汇编文件中的程序段,并使其跳转到该程序段。
编译不能通过,错误提示的我编写的汇编文件中定义的label没有定义。想知道如何解决。
我想在启动代码执行结束后调用一个定义在其他文件中的汇编程序。
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

1条回答 默认 最新

  • lr2131 lr2131 2015-02-11 06:59

    以下是我自己写的可以用的S3C2440汇编启动代码:

    ; .include "/SystemInit/LowLevelInit.s"

    INTOFFSET EQU 0x4A000014

    SVC_STACK_LEGTH EQU 0 ;;;;;;;;;;;;;;;;;;
    FIQ_STACK_LEGTH EQU 0 ;;;;;;;;;;;;;;;;;;
    IRQ_STACK_LEGTH EQU 256 ;;;;;;;;;;;;;;;;;;
    ABT_STACK_LEGTH EQU 0 ;;;;;;;;;;;;;;;;;;
    UND_STACK_LEGTH EQU 0 ;;;;;;;;;;;;;;;;;;

    NoInt EQU 0x80
    NoFIQ EQU 0x40

    USR32Mode EQU 0x10
    SVC32Mode EQU 0x13
    SYS32Mode EQU 0x1f
    IRQ32Mode EQU 0x12
    FIQ32Mode EQU 0x11

    ; IMPORT __use_no_semihosting_swi
    ; IMPORT FIQ_Exception
    IMPORT __main
    IMPORT SystemInit
    IMPORT LowLevelInit
    ; IMPORT _ClockInit
    ; IMPORT _LedInit
    ; IMPORT _LedOn
    ; IMPORT _LedOff
    ; IMPORT LedInit
    ; IMPORT LedOn
    ; IMPORT LedOff
    ; IMPORT Delay

    IMPORT  IRQHandle
    

    ; IMPORT Timer4_IRQ
    IMPORT StartHandle

    EXPORT  bottom_of_heap   ;;;;;;;;;;;;;;;;;;
    EXPORT  StackUsr;;;;;;;;;;;;;;;;;;
    EXPORT  Reset
    EXPORT __user_initial_stackheap;;;;;;;;;;;;;;;;;;
    
    
    PRESERVE8
    ;CODE32
    AREA    os,CODE,READONLY
    ARM
    

    ; ENTRY

    Reset
    LDR PC, ResetAddr
    LDR PC, UndefinedAddr
    LDR PC, SWI_Addr
    LDR PC, PrefetchAddr
    LDR PC, DataAbortAddr
    DCD 0xb9205f80
    LDR PC, IRQ_Addr
    LDR PC, FIQ_Addr

    ResetAddr DCD ResetInit
    UndefinedAddr DCD Undefined
    SWI_Addr DCD SoftwareInterrupt
    PrefetchAddr DCD PrefetchAbort
    DataAbortAddr DCD DataAbort
    Nouse DCD 0
    IRQ_Addr DCD IRQ_Handler
    FIQ_Addr DCD FIQ_Handler

    Undefined
    B Undefined

    SoftwareInterrupt

    CMP R0, #4
    LDRLO PC, [PC, R0, LSL #2]
    MOVS PC, LR

    SwiFunction
    DCD IRQDisable ;0
    DCD IRQEnable ;1
    DCD FIQDisable ;2
    DCD FIQEnable ;3
    ; DCD Enable ;4

    IRQDisable
    MRS R0, SPSR
    ORR R0, R0, #NoInt
    MSR SPSR_c, R0
    MOVS PC, LR

    IRQEnable
    MRS R0, SPSR
    BIC R0, R0, #NoInt
    MSR SPSR_c, R0
    MOVS PC, LR

    FIQDisable
    MRS R0, SPSR
    ORR R0, R0, #NoFIQ
    MSR SPSR_c, R0
    MOVS PC, LR

    FIQEnable
    MRS R0, SPSR
    BIC R0, R0, #NoFIQ
    MSR SPSR_c, R0
    MOVS PC, LR

    ;Enadle

    PrefetchAbort
    B PrefetchAbort

    DataAbort
    B DataAbort

    FIQ_Handler
    STMFD SP!, {R0-R4, LR}
    ; BL FIQ_Exception
    LDMFD SP!, {R0-R4, LR}
    SUBS PC, LR, #4

    IRQ_Handler
    ; ÒÔºóÓÐʱ¼ä£¬Ö±½ÓÓûã±à²é±íµÄ·½·¨À´×ö£¬²»ÒªÒÀÀµCº¯Êý·½Ê½£¬ÌáÉýЧÂÊ
    STMFD SP!, {R0-R4, LR}
    ;Ìøתµ½ÍⲿÖжϵĴ¦Àíº¯Êý
    ;Á½¸ö±ê¼ÇλµÄÇå³ýÒ²¿ÉÔÚÕâÀïÍê³É£¬µ«Ä¿Ç°ÏÈÓÉÓû§Íê³É°É

    ; LDR R1,=INTOFFSET
    ; LDR R0,[R1]
    ; LDR R2,=IRQHandle
    ; LDR R1,[R2,R0,LSL #2] ; MOV R1,#4; MLA R3,R0,R1,R2;
    ; LDR R3,[R1]
    ; MOV LR,PC
    ; BX R3
    BL StartHandle

    LDMFD SP!, {R0-R4, LR}
    SUBS PC, LR, #4

    InitStack

    MOV R0, LR
    MSR CPSR_c, #0xd3

    LDR SP, StackSvc

    MSR CPSR_c, #0xd2
    LDR SP, StackIrq
    MSR CPSR_c, #0xd1
    LDR SP, StackFiq
    MSR CPSR_c, #0xd7
    LDR SP, StackAbt
    MSR CPSR_c, #0xdb
    LDR SP, StackUnd
    MSR CPSR_c, #0xdf
    LDR SP, =StackUsr-32
    BX R0; ²»ÄÜʹÓÃLR·µ»Ø£¬LR¿ÉÄÜÒѾ­±»ÐÞ¸ÄÁË£¬ËùÒÔ½èÓÉR0·µ»Ø ; MOV PC, R0 ;

    ResetInit
    BL LowLevelInit

    BL InitStack ;ÔÚÕâÖ®ºó£¬¿ÉÒÔʹÓÃCº¯Êý
    BL SystemInit
    ; BL _ClockInit
    ; BL LedInit
    LOOP
    ; BL LedOn
    ; LDR R0,=0x100
    ; BL Delay
    ; BL LedOff
    ; LDR R0,=0x100
    ; BL Delay
    ; B LOOP

    _Delay
    ; LDR R3,=0x100000

    ; STMFD SP!, {R0-R4, LR}
    ; BL SystemInit
    ; LDMFD SP!, {R0-R4, LR}
    ; B .

    ; BL TargetResetInit

    BL IRQ_Handler
    B __main

    __user_initial_stackheap

    LDR r0,=bottom_of_heap ;;;;;;;;;;;;;;;;;;
    ; LDR r1,=StackUsr ;;;;;;;;;;;;;;;;;;

    BX LR; MOV pc,lr ;

    StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4 ;;;;;;;;;;;;;;;;;;
    StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4 ;;;;;;;;;;;;;;;;;;
    StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4 ;;;;;;;;;;;;;;;;;;
    StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4 ;;;;;;;;;;;;;;;;;;
    StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)* 4 ;;;;;;;;;;;;;;;;;;

        AREA    MyStacks, DATA, NOINIT, ALIGN=2
    

    SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;Stack spaces for Administration Mode ¹ÜÀíģʽ¶ÑÕ»¿Õ¼ä
    IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;Stack spaces for Interrupt ReQuest Mode ÖжÏģʽ¶ÑÕ»¿Õ¼ä
    FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;Stack spaces for Fast Interrupt reQuest Mode ¿ìËÙÖжÏģʽ¶ÑÕ»¿Õ¼ä
    AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;Stack spaces for Suspend Mode ÖÐÖ¹Òåģʽ¶ÑÕ»¿Õ¼ä
    UndtStackSpace SPACE UND_STACK_LEGTH * 4 ;Stack spaces for Undefined Mode 䶨Òåģʽ¶ÑÕ»

        AREA    Heap, DATA, NOINIT
    

    bottom_of_heap SPACE 1

        AREA    Stacks, DATA, NOINIT
    

    StackUsr

    END
    
    点赞 评论 复制链接分享

相关推荐