汇编代码练习
area mytexcode, code, readonly
;一般异常向量表都在最前面
b reset ; ldr pc, reset_space ; 0x0
undefined_exception
b undefined_exception ; 0x4
swi_exception
b swi_exception ; 0x8
prefecth_exception
b prefecth_exception ; 0xC
dataAbort_exception
b dataAbort_exception ; 0x10
reserved_exception ;0x14 nop
b reserved_exception
IRQ_exception ; 0x18
b IRQ_exception
FIQ_exception ;0x1C
b FIQ_exception
reset
mov r0, #4 ; r0=4
mov r1, #5 ; r1=5
mov r2, r1 ; r2=5
mov r3, r2, lsl #2 ; r3=r2<<2=5*4=20
add r4, r2, r3 ; r4=r2+r3=5+r0=25
sub r5, r4, r4 ; r5=r4-r4=0 不会更新标志位
subs r5, r4, r4 ; r5=r4-r4=0 更新标志位 z=1
bl delay ;演示如何延迟
;正常位svc模式模式切换:修改低5bit为0x1f
mrs r0, cpsr ;读取cpsr
bic r0, r0, #(0x1f<<0) ; r0=r0&(~(0x1f<<0))将低5bit全部清零
orr r0, r0, #(0x1f<<0) ; r0=r0|(0x1f<<0) 将低5bit全部置1
msr cpsr_c, r0 ;写入到cpsr
bl gcdfunc
swi 45
ldr r5, =0x234332
;读写内存数据
;初始化起始位置
ldr r5, =0x40000000
mov r1, #12 ; 0xC
mov r2, #14 ; 0xE
str r1, [r5, #4] ;将12存入0x40000004 : r5==0x40000000
str r2, [r5], #8 ;将14存入0x40000000 : r5= 0x40000008
bl copyfunc
;一次性将所有数据拷贝到r1-r8
ldr r0, =mydata ;r0为起始位置
ldmia r0!, {r1-r8} ;一次加载所有8个数据
loop
b loop
copyfunc
;连续将8个数据写入到0x40000010
ldr r6, =0x40000010 ;初始化目标地址
ldr r7, =mydata ;设定源数据地址 ldr r7, mydata 得到的就是mydata起始地址对应空间的数据
;取数据
mov r0, #8 ;控制次数
copyloop
ldr r8, [r7], #4 ; 先去取数据,r7自加4
str r8, [r6], #4 ; 先存数据,r6自加4
subs r0, r0, #1
bne copyloop ;状态寄存器中位是否为零
mov pc, lr
delay
mov r0, #10 ;初始化,延迟多少个cpu周期
delayloop
;不停的减1
sub r0, r0, #1
cmp r0, #0
;如果不为0, 就会继续减,为0,就会立马跳出
bne delayloop ;如果不相同就继续循环, ne/eq表示条件码
mov pc, lr
; bx lr
gcdfunc
mov r0, #24;初始化
mov r1, #9 ;
gcdloop
;表示将r0与r1比较
cmp r0, r1
;如果r0大于r1
subgt r0, r0, r1
sublt r1, r1, r0
bne gcdloop
mov pc, lr
mydata
dcd 0x1b ;相当于定义了数组
dcd 0x2b
dcd 0x3b
dcd 0x4b
dcd 0x5b
dcd 0x6b
dcd 0x7b
dcd 0x8b
reset_space
dcd reset
end