以下代码在 linux-x86、darwin-x86 上运行良好,但不适用于 ios-armv7。 正确的输出应该是: m[0]:0.500000,v:0.500000 m[1]:0.500000,v:0.500000 m[2]:0.500000,v:0.500000 m[3]:0.500000,v:0.500000 m[4]:0.500000,v:0.500000 但我发现错误的输出: m[0]:0.500000,v:0.500000 m[1]:0.500000,v:0.000000 m[2]:0.500000,v:0.000000 m[3]:0.500000,v:0.000000 m[4]:0.500000,v:0.000000 当它为 ios-armv7 构建时,我也发现了它的缺点: [a] 删除函数'func',将函数体移动到'main'函数,它工作正常 [b] 将数组 'm[5]' 声明为 'double m[5]',它工作正常 [c] 将变量 'v' 设置为 'v = 0.5 或 v = sqrt(2.0f/8)',它工作正常 [d] 如果 gcc 优化选项是 '-O0',它可以正常工作,但是当它是 '-O1 或 -O2' 时,会出现错误输出 我的 iPad1 被破解了,所以我可以在我的 MacBook Air 上交叉编译一个可执行文件,然后将可执行文件“scp”到 iPad1 并运行它。以下是详细信息: 1. 在 Mac 上交叉编译一个可执行文件: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-gcc -O1 -Wall -arch armv7 -mcpu=cortex-a8 -isysroot /Applications/Xcode.app/Contents/ Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include - D__IPHONE_OS__ -miphoneos-version-min=4.0 foo.c 2. 'scp' 可执行文件到 iPad scp a.out mobile@192.168.1.106:~ 3. 'ssh' 到 iPad ssh mobile@192.168.1.106 #默认密码是'alpine' 4. 在 iPad 上运行 a.out ./a.out
#include <stdio.h>
#include <math.h>
int
func(int n) /* [a] */
{
int i;
float m[5]; /* [b] */
double v;
v = sqrt(2.0f/n); /* [c] */
for(i=0;i<5;++i) {
m[i]=v;
printf("m[%d]: %f, v: %f\n", i, m[i], v);
}
return 0;
}
int
main(int argc, char **argv)
{
return func(8);
}
您还可以在https://gist.github.com/ashun/5992120上找到整个代码
以下是组装。你可以在命令'vim -d'的帮助下找到不同之处
- 前面代码的汇编,将数组'm[5]'声明为'double m[5]'
.section __TEXT,__text,regular,pure_instructions .section __TEXT,__textcoal_nt,coalesced,pure_instructions .section __TEXT,__const_coal,coalesced .section __TEXT,__picsymbolstub4,symbol_stubs,none,16 .section __TEXT,__StaticInit,regular,pure_instructions .syntax 统一 .section __TEXT,__text,regular,pure_instructions .globl _func .对齐 2 .code 16 .thumb_func _func _func: 推 {r4, r5, r6, r7, lr} 添加 r7, sp, #12 str r8,[sp,#-4]! 潜艇,#8 vmov.f32 s0, #2.000000e+00 movw r8, :lower16:(L_.str-(LPC0_0+4)) vmov s2, r0 movt r8, :upper16:(L_.str-(LPC0_0+4)) vcvt.f32.s32 d1, d1 LPC0_0: 添加 r8, 电脑 移动 r4, #0 vdiv.f32 s0, s0, s2 vsqrt.f32 s0, s0 vcvt.f64.f32 d16, s0 vmov r5, r6, d16 LBB0_1: 移动 r1, r4 移动 r0, r8 移动 r2, r5 移动 r3, r6 vstr.64 d16,[sp] 添加 r4, #1 blx _printf cmp r4, #5 bne LBB0_1 移动 r0, #0 添加 sp,#8 ldr r8, [sp], #4 弹出 {r4, r5, r6, r7, 电脑} .globl _main .对齐 2 .code 16 .thumb_func _main _主要的: 推 {r7, lr} mov r7, sp 移动 r0, #8 bl _func 移动 r0, #0 弹出 {r7, 电脑} .section __TEXT,__cstring,cstring_literals L_.str: .asciz "m[%d]: %f, v: %f\n" .subsections_via_symbols
- 前面代码的汇编,将数组'm[5]'声明为'double m[5]'
.section __TEXT,__text,regular,pure_instructions .section __TEXT,__textcoal_nt,coalesced,pure_instructions .section __TEXT,__const_coal,coalesced .section __TEXT,__picsymbolstub4,symbol_stubs,none,16 .section __TEXT,__StaticInit,regular,pure_instructions .syntax 统一 .section __TEXT,__text,regular,pure_instructions .globl _func .对齐 2 .code 16 .thumb_func _func _func: 推 {r4, r5, r6, r7, lr} 添加 r7, sp, #12 str r8,[sp,#-4]! **vpush {d8}** 潜艇,#8 vmov.f32 s0, #2.000000e+00 movw r8, :lower16:(L_.str-(LPC0_0+4)) vmov s2, r0 movt r8, :upper16:(L_.str-(LPC0_0+4)) vcvt.f32.s32 d1, d1 LPC0_0: 添加 r8, 电脑 移动 r4, #0 vdiv.f32 s0, s0, s2 vcvt.f64.f32 d16, s0 vsqrt.f64 d8, d16 vmov r5, r6, d8 LBB0_1: 移动 r1, r4 移动 r0, r8 移动 r2, r5 移动 r3, r6 vstr.64 d8, [sp] 添加 r4, #1 blx _printf cmp r4, #5 bne LBB0_1 移动 r0, #0 添加 sp,#8 流行音乐 {d8} ldr r8, [sp], #4 弹出 {r4, r5, r6, r7, 电脑} .globl _main .对齐 2 .code 16 .thumb_func _main _主要的: 推 {r7, lr} mov r7, sp 移动 r0, #8 bl _func 移动 r0, #0 弹出 {r7, 电脑} .section __TEXT,__cstring,cstring_literals L_.str: .asciz "m[%d]: %f, v: %f\n" .subsections_via_symbols