Alpha_dllg的个人空间 https://blog.eetop.cn/1010876 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

ARM 汇编程序

已有 1203 次阅读| 2012-10-14 09:01 |个人分类:ARM

天气: 舒适
心情: 平静
1、对数据区进行64位结果累加操作

/*----------------------------------------------------

*寄存器使用说明:

* R0:存放地址值

* R2:递减计数器

* R9:64位递加结果高32

* R8:64位递加结果低32

*----------------------------------------------------*/

.global _start

 

.text

 

.arm

 

_start:

       MOV R0,#0XB000                   @初始化寄存器

       MOV R1,#0X10000001

       MOV R2,#100

loop_1:                                 @第一次循环,给内存单元赋值

       STR R1,[R0],#4

       ADD R1,R1,#1

       SUBS R2,R2,#1

       BNE loop_1

      

       MOV R0,#0XB000

       MOV R2,#100

       MOV R9,#0

       MOV R8,#0

loop_2:                                 @第二次循环累加

       LDR R1,[R0],#4

       ADDS R8,R1,R8                    @R8=R8+R1,进位影响标志位

       ADC R9,R9,#0                     @R9=R9+CC为进位

       SUBS R2,R2,#1

       BNE loop_2

Stop:

       B Stop

.end                                    @文件结束


2、初始化ARM处理器各模式下的堆栈指针SP(R13)

/*----------------------------------------------------

* 寄存器使用说明:

* SP_usr:用户模式下的SP

* SP_svc:管理模式下的SP

* SP_und:未定义模式下的SP

* SP_abt:中止模式下的SP

* SP_irq:IRQ模式下的SP

* SP_fiq:FIQ模式下的SP

*----------------------------------------------------*/

.equ     _ISR_STARTADDRESS,      0xC7FF000            @设置栈的内存基地址

.equ     UserStack,       _ISR_STARTADDRESS           @用户模式堆栈地址0xc7ff000

.equ     SVCStack,        _ISR_STARTADDRESS+256       @管理模式堆栈地址0xc7ff100

.equ     UndefStack,      _ISR_STARTADDRESS+256*2     @未定义模式下的堆栈地址0xc7ff200

.equ     AbortStack,      _ISR_STARTADDRESS+256*3     @中止模式下的堆栈地址0xc7ff300

.equ     IRQStack,        _ISR_STARTADDRESS+256*4     @IRQ模式下的堆栈地址0xc7ff400

.equ     FIQStack,        _ISR_STARTADDRESS+256*2     @FIQ模式下的堆栈地址0xc7ff500

.equ     USERMODE,         0x10                        @用户模式

.equ     FIQMODE,          0x11                        @FIQ模式

.equ     IRQMODE,          0x12                        @IRQ模式

.equ     SVCMODE,          0x13                        @管理模式

.equ     ABORTMODE,        0x17                        @中止模式

.equ     UNDEFMODE,        0x1b                        @未定义模式

.equ     SYSMODE,          0x1F                        @系统模式

.equ     MODEMASK,         0x1f                        @模式位掩码


.global _start


.text


.arm


_start:

       MRS R0,CPSR                       @读取当前CPSR

       BIC R0,R0,#MODEMASK               @清除模式位

       

       #设置系统模式下的SP

       ORR R1,R0,#SYSMODE

       MSR CPSR_c,R1

       LDR SP,=UserStack

       

       #设置未定义模式下的SP

       ORR R1,R0,#UNDEFMODE

       MSR CPSR_c,R1

       LDR SP,=UndefStack

       

       #设置中止模式下的SP

       ORR R1,R0,#ABORTMODE

       MSR CPSR_c,R1

       LDR SP,=AbortStack

       

       #设置管理模式下的SP

       ORR R1,R0,#SVCMODE

       MSR CPSR_c,R1

       LDR SP,=SVCStack

       

       #设置IRQ模式下的SP

       ORR R1,R0,#IRQMODE

       MSR CPSR_c,R1

       LDR SP,=IRQStack


       #设置FIQ模式下的SP

       ORR R1,R0,#FIQMODE

       MSR CPSR_c,R1

       LDR SP,=FIQStack


Stop:

      B Stop       

.end                                    @文件结束


3、用ARM指令实现内存数据区块拷贝操作

/*----------------------------------------------------

* 寄存器使用说明:

* R0:源数据区指针

* R1:目标数据区指针

* R2:单字拷贝次数

* R3:块拷贝次数

* R5-R10:批量拷贝使用的寄存器组

* SP:栈指针

*----------------------------------------------------*/

 

#除法宏定义

.macro DIV dividend,divisor     

 

    MOV R2,\dividend

    MOV R0,\divisor

    MOV R3,#0

_md:

    ADD R3,R3,#1

    SUBS R2,R2,R0

    BPL _md

    ADD R2,R2,R0

    SUB R3,R3,#1

.endm

 

 

.global _start

 

.equ NUM, 32

.equ SIZE, 6

 

.text

 

.arm

 

_start:

       MOV R2,#NUM

       MOV R0,#SIZE

       DIV r2,r0            @宏调用计算块数和字数 r2中存放字数,r3中存放块数

       LDR  R0,=Src         @R0=源数据区指针

       LDR  R1,=Dst         @R1=目标数据区指针

       MOV SP,#0X9000

       MOVS R3,R3

       BEQ Copy_Words

       STMFD SP!,{R5-R10}                @保存寄存器内容

 

#进行块拷贝,每次6个字      

Copy_4Words:

       LDMIA R0!,{R5-R10}

       STMIA R1!,{R5-R10}

       SUBS  R3,R3,#1

       BNE Copy_4Words

       LDMFD SP!,{R5-R10}                @恢复寄存器内容

      

#将剩余的数据以字为单位进行拷贝

Copy_Words:     

       MOVS R2,R2

       BEQ  Stop 

      

Copy_Word:

       LDR R3,[R0],#4

       STR R3,[R1],#4

       SUBS R2,R2,#1

       BNE Copy_Word     

Stop:

      B Stop      

.ltorg

Src:

     .long      1,2,3,4,5,6,7,8,9,0xA,0xB,0xC,0xD,0xE,0xF,0x10

     .long      1,2,3,4,5,6,7,8,9,0xA,0xB,0xC,0xD,0xE,0xF,0x10

Src_num:

     .long  32    

Dst:

     .long      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0   

     .long      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0     

 

.end                                    @文件结束



点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 0

    获赞
  • 2

    评论
  • 304

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-12 06:21 , Processed in 0.018235 second(s), 16 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部