1、ARM指令的寻址方式
; 该程序能够体现出ARM指令的立即寻址、寄存器寻址、寄存器间接寻址、
; 基址寻址、寄存器移位寻址、多寄存器寻址等寻址方式。
preserve8
area wangjietest1,code,readonly
entry
start
mov r0,#1 ;立即数寻址
mov r1,#2
add r2,r0,r1 ;寄存器寻址
add r3,r0,r2,lsl #1 ;寄存器移位寻址
ldr r0,[r1] ;寄存器间接寻址
ldr r4,[r1,#3] ;基址寻址
ldmia r0!,{r1-r4} ; 多寄存器寻址
end
2.add adc 和sub sbc的用法
;本实验是用ADD和ADC指令实现两个64位数的加减法运算
;比如0x7000000070000000 加上0xb0000000b0000000
preserve8
area wangjietest2,code,readonly
entry
code32
start
mov r1,#0x70000000
mov r2,#0x70000000
mov r3,#0xb0000000
mov r4,#0xb0000000
;adds r5,r1,r3
;adc r6,r2,r4
sub r5,r1,r3
sbc r6,r2,r4
end
3.bic的用法
;本实验是将R0的第0位和第3位清零,其余位不变。编译并调试该程序
;
preserve8
area wangjietest2,code,readonly
entry
code32
start
mov r0,#0xffffffff
bic r0,r0,#9
end
4.数据加载和存储指令的用法
;ARM指令的单寄存器与多寄存器的数据加载与存储指令的使用
area wangjietest3 ,code,readonly
entry
start ;单寄存器 操作
ldr r0,=0x70010 ;将r0寄存器中赋值为0x70010
;前索引
ldr r1,[r0,#0x04] ;前索引----将r0寄存器r0加上偏移量 4作为寻址的地址值,然后将r0的地址(0)赋值给r1
str r0,[r1,#-0x02] ;----------将r0存储在r1中,然后r1减去偏移量2
;自动索引
ldr r2,[r1,#0x02]! ;自动索引--将r1加上偏移量2,!然后实现寄存器的更新
;后索引
ldr r3,[r2],#0x04 ;后索引----将r2指向的地址数据赋值给r3 ,r2加上偏移量4
str r3,[r4],#-0x02 ;----------将r3的值存储在r4中,r4再减去偏移量2
ldrb r5,[r1,#0x04] ;将存储器地址为r1+4的字节数读入到r5中
strb r5,[r1,#2] ;将寄存器r5的字节数写入到r1+2的地址上
ldrh r6,[r1,#4] ;将存储器地址为r1+4的半字节数据读入寄存器r6中
strh r0,[r2] ;将寄存器r0的半字节数据写入到r2位地址的存储器中
;多寄存器操作
ldr r6,=0x90010
ldr r7,=0x90020
ldr r8,=0x90030
ldr r9,=0x90040
ldmia r0!,{r6-r9} ; 以r0的值 0x90010为基址取出一个32位数据0x00000001
; 放入到r6然后r0的值加4继续取出r0,放入到r7中。。。
ldmib r1!,{r6-r9} ;ib,表示每次传送前地址值增加
stmib r2!,{r6-r9} ;是指将r6-r9的值保存到r2指向的存储单元中(R2自动加1)
;堆栈操作
mov sp,r0 ;建栈
stmfd sp!,{r2-r5,r6} ;入栈
ldmfd sp!,{r1-r4} ;出
b start
end