;判断当前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
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