ARM指令
//c代码
if(a == 0) x = 0;
if(a > 0) x += 3;
//汇编代码
mov r0,#0
cmp r0,#0 ;比较大小,当相等时CPSR的Z位会置1
moveq r1,#0 ;如果相等,则执行mov r1,#0
addgt r1,r1,#3 ;如果r0大于#0,则执行add r1,r1,#3
c语言代码最终会被编译成二进制代码,存储在flash中,CPU控制器会向flash取址->译码,ALU执行
Rs:源操作数
Rd:目标操作数
cpucode:操作码,识别是哪个指令
cond:条件判断(1110:不启用)
ARM指令的合法性:
当源操作数太大时,如mov r0,#0x12345678是不合法的
此时,我们用伪指令替代:ldr r0,=0x12345678
用汇编实现C代码
//c code
int func3(int temp)
{
return temp - 1;
}
int func2(int temp)
{
return temp+3;
}
int func1(int temp)
{
if(temp ==2){
return func2(temp);
}else{
return func3(temp);
}
}
int mian()
{
int temp = 2;
func1(2);
while(1);
}
-------------------------------------
//asm code
.text
main:
mov r5,#0
mov r2,#2
bl func1
main_end:
b main_end
func1:
mov r12,LR
cmp r0,#2
bleq func2
blne func3
func1_end:
mov pc,r12
func2:
add r0,#3
mov pc,lr
func3:
sub r0,#1
mov pc,lr
.end
//asm
@delay for 1s for(int i=1000000;i>0;i--);
delay1s:
ldr r5,=0x3fffffff
loop:
cmp r5,#0
beq delay1s_end
sub r5,#1
b loop
delay1s_end:
mov pc,lr
//c实现求最大公约数
int GCD(int a,int b)
{
while(1){
if(a == b) break;
if(a > b){
a -= b;
}else{
b -= a;
}
}
return a;
}
//asm
.text
main:
mov r0,#9
mov r1,#15
bl gcd
main_end:
gcd:
loop:
cmp r0,r1
beq gcd_end
subgt r0,r0,r1
sublt r1,r1,r0
b loop
gcd_end:
moveq pc,lr
.end
Load/Store指令
注:load/store ,ARM架构规定,存储器间不能直接拷贝,必须通过寄存器中转
.text
main:
mov r0,#9
ldr r5,=buf
ldr r6,=dest_buf //ldr 是伪指令
ldr r0,[r5] //ldr 是ARM的load指令
str r0,[r6]
main_end:
b main_end
.data
@char buf[]={0x01,0x02,0x03,0x04}
buf:
.byte 0x01,0x02,0x03,0x04
dest_buf:
.space 8
.end
//c code
int main()
{
int i=0;
const char buf[]={1,2,3};
char destBuf[8];
for(i=0;i<3;i++){
destVBuf[i] = buf[i];
}
}
//asm
.text
main:
mov r5,#0
ldr r7,=buf
ldr r8,=dest_buf
loop:
cmp r5,#3
beq main_end
add r5,#1
ldrb r0,[r7],#1
strb r0,[r8],#1
b loop
main_end:
b main_end
buf:
.byte 0x01,0x02,0x03
.data
dest_buf:
.space 8
.end
GUN汇编伪指令
批量操作指令
.text
ldr r12,srcBuf
ldr r13,destBuf
ldmia r12!,{r0-r11}
stmia r13!,{r0-r11}
.data
srcBuf:
.string "adhgkakjsfdasjfa;kdjaks;da;gk\0"
destBuf:
.space 12*4
.end
L9-D2