arm的按条件执行指令的功能
arm的条件执行功能可以避免执行jmp指令,但每条指令都判断一次条件。
和x86对比的汇编代码如下。
C语言代码如下:
int b;
int test(int a) {
if (a>0)
return a+b;
return b;
}
分别用arm gcc 4.3.3 和x86 gcc 4.3.3 加-O2 -S选项 生成汇编代码。
arm的汇编代码如下:
test:
.fnstart
.LFB2:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
@ link register save eliminated.
cmp r0, #0
ldrgt r3, .L5
ldrle r3, .L5
ldrgt r2, [r3, #0]
ldrle r0, [r3, #0]
addgt r0, r0, r2
bx lr
.L6:
.align 2
.L5:
.word b
x86的汇编代码如下:
test:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
testl %eax, %eax
jle .L2
addl b, %eax
popl %ebp
ret
.p2align 4,,7
.p2align 3
.L2:
movl b, %eax
popl %ebp
ret
.size test, .-test
.comm b,4,4
和x86对比的汇编代码如下。
C语言代码如下:
int b;
int test(int a) {
if (a>0)
return a+b;
return b;
}
分别用arm gcc 4.3.3 和x86 gcc 4.3.3 加-O2 -S选项 生成汇编代码。
arm的汇编代码如下:
test:
.fnstart
.LFB2:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
@ link register save eliminated.
cmp r0, #0
ldrgt r3, .L5
ldrle r3, .L5
ldrgt r2, [r3, #0]
ldrle r0, [r3, #0]
addgt r0, r0, r2
bx lr
.L6:
.align 2
.L5:
.word b
x86的汇编代码如下:
test:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
testl %eax, %eax
jle .L2
addl b, %eax
popl %ebp
ret
.p2align 4,,7
.p2align 3
.L2:
movl b, %eax
popl %ebp
ret
.size test, .-test
.comm b,4,4
转载请注明出处