ARM指令例子

本文通过多个实例展示了ARM指令的使用,包括判断处理器状态、数据加载存储、数组求和、最大公约数计算以及块数据传输等操作。同时,探讨了函数调用的标准和堆栈在多层函数调用中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

;判断当前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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值