ARM指令例子

来源:互联网 发布:mac os x ei 编辑:程序博客网 时间:2024/06/05 01:36
;判断当前ARM处理器是ARM状态还是THUMB状态,如果是ARM状态,请设置为USR模式
MRS R0, CPSR
TST R0,#0x20
ANDEQ R0, #0xFFFFFFE0
ORREQ R0, #0X10
MSREQ CPSR_fxsc, R0


================================================================================


load/store架构------》 数据加载和存储指令
ARM
AREA  |.text| ,code , READONLY
ENTRY
PRESERVE8

main
LDR R0, =src
LDR R2, =dest

LDR R1, [R0]
STR R1, [R2]


STOP
B STOP

src DCD 0x1
AREA  |.data| ,data, READWRITE
dest SPACE 8

END


===================================================================================
//pre、post index


LDR R0, =src
LDR R2, =dest

; LDR R1, [R0, #4]!
; LDR R1, [R0, #4]


LDR R1, [R0], #4


==================================================================================
本汇编实现数组求和(不使用函数调用)




ARM
AREA  |.text| ,code , READONLY
ENTRY
PRESERVE8

main
LDR R0, =src
LDR R1, =dest
MOV R2, #4
LOOP
CMP R2, #0
BEQ STR_WRITE
LDR R3, [R0], #4
ADD R4, R4, R3
SUB R2, #1
B LOOP
STR_WRITE
STR R4, [R1]

STOP
B STOP

src DCD 0x1, 0x2, 0x3, 0x4
;src DCB "helloworld"
AREA  |.data| ,data, READWRITE
dest SPACE 128


END
=========================================================================
本程序实现求取最大公约数(不使用函数调用)




ARM
AREA  |.text| ,code , READONLY
ENTRY
PRESERVE8

main
MOV R0, #12
MOV R1, #24
LOOP
CMP R0, R1
BEQ WRITE
SUBHI R0, R0, R1
SUBCC R1, R1, R0
B LOOP
WRITE
MOV R2, R0

STOP
B STOP



AREA  |.data| ,data, READWRITE

END
=============================================================================


本程序实现求取最大公约数(使用函数调用)
AAPCS函数调用标准规定(函数调用:只能使用R0 - R3 这四个寄存器传参,多出4个请用堆栈)


ARM
AREA  |.text| ,code , READONLY
ENTRY
PRESERVE8

main
MOV R0, #12
MOV R1, #24
LOOP
CMP R0, R1
BEQ WRITE
SUBHI R0, R0, R1
SUBCC R1, R1, R0
B LOOP
WRITE
MOV R2, R0

STOP
B STOP



AREA  |.data| ,data, READWRITE

END

LDR R1, [R0], #4


==================================================================================
块数据传输

; LDR R0, =src
LDR R4, =dest
; LDMIA R0!, {R1 - R3}
; STMIA R4!, {R1, R2, R3}

; LDMIB R0!, {R1 - R3}

LDR R0, =src
ADD R0, #12
LDMDA R0!, {R3, R2, R1}


=================================================================================


ARM汇编多层函数调用要使用堆栈



ARM
AREA  |.text| ,code , READONLY
ENTRY
PRESERVE8
main
LDR SP, =STACK_T
MOV R0, #1
BL FUNC
MOV R1, #0XFF
B STOP
FUNC
MOV R2, #5
STMFD SP!, {R0 - R9, LR}
BL FUNC1
MOV R3, #0XFF
LDMFD SP!, {R0 - R9, PC}

FUNC1
MOV   R2, #0X2
MOV R5, 0XFF000000
BX LR

STOP
B STOP


src DCD 0X1, 0X2, 0X3, 0X4


AREA  |.data| ,data, READWRITE
SPACE 128
STACK_T
SPACE 128
TT

END
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小区在监狱附近怎么办 遇到开发商捂盘怎么办 卖完房子后悔了怎么办 没有钱买房子怎么办 没有钱想买房怎么办 房子卖亏了后悔怎么办 物业停业主水电怎么办 死者家属一直闹怎么办 车祸找不到死者家属怎么办 房子违章被投诉怎么办 桐乡世贸二期怎么办 失业金汇到保险金账户怎么办 氧气罐阀门漏气怎么办 小微餐饮证怎么办 打网球手腕疼怎么办 晚上睡觉饿了怎么办 孕妇凌晨饿了怎么办 减肥想吃泡面怎么办 自考的实践考核怎么办 c1本怎么办从业资格证 办理资格证假的怎么办 高一学习差怎么办 职业资格证书理论考试不合格怎么办 职称证查不到怎么办 社保与工资不符怎么办 社保审计不过关怎么办 企安宝登录不上怎么办 苹果维修没发票怎么办 园林绿化资质取消后怎么办 出租车从业资格证到期怎么办 养老金认证身份证不符怎么办 硬盘指示灯不亮怎么办 做业务产品质量很差怎么办 没有户籍证明了怎么办 回执编号忘了怎么办 泳镜里面花了怎么办 网页打印预览空白怎么办 中专毕业证掉了怎么办 会计证年检忘了怎么办 会计准考证丢了怎么办 从业资格证没带怎么办