标签: thumb

在模数之前和分配操作之前,`if`语句是否冗余?

考虑下一个代码:

unsigned idx;
//.. some work with idx
if( idx >= idx_max )
    idx %= idx_max;
Run Code Online (Sandbox Code Playgroud)

可以简化为仅第二行:

idx %= idx_max;
Run Code Online (Sandbox Code Playgroud)

并将取得同样的结果.


好几次我遇到了下一个代码:

unsigned x;
//... some work with x
if( x!=0 )
  x=0;
Run Code Online (Sandbox Code Playgroud)

可以简化为

x=0;
Run Code Online (Sandbox Code Playgroud)

问题:

  • 有什么意义可以使用if,为什么?特别是使用ARM Thumb指令集.
  • 这些if可以省略吗?
  • 编译器有什么优化?

c c++ performance arm thumb

46
推荐指数
2
解决办法
5737
查看次数

什么是ARM Thumb指令集?

在"ARM11TechnicalRefManual"的第1-34节"拇指指令集"下,它说:

"Thumb指令集是最常用的32位ARM指令的子集.Tumb指令长16位,并且具有相应的32位ARM指令,对处理器型号具有相同的影响."

谁可以解释更多关于这个特别是第二句话,并说处理器如何执行它?

arm instruction-set thumb

38
推荐指数
1
解决办法
3万
查看次数

ARM,Thumb和Thumb 2指令编码有什么区别?

我对指令集有点困惑.有Thumb,ARM和Thumb 2.根据我的阅读Thumb指令都是16位,但在ARMv7M用户手册(第vi页)中,提到了Thumb 16位和Thumb 32位指令.

现在我必须克服这种困惑.据说Thumb 2支持16位和32位指令.那么ARMv7M实际上支持Thumb 2指令而不仅仅是Thumb吗?

还有一件事.我可以说Thumb(32位)与ARM指令相同,它们都是32位吗?

arm thumb

33
推荐指数
4
解决办法
3万
查看次数

iPhone 3GS上的ARM vs Thumb性能,非浮点代码

我想知道是否有人在iPhone 3GS上有ARM与Thumb代码性能有任何硬数据.特别是对于非浮点(VFP或NEON)代码 - 我知道Thumb模式下浮点性能的问题.

是否存在大型ARM指令的额外代码大小成为性能危害的程度?换句话说,如果我的可执行代码与可用内存相比相对较小,那么打开Thumb模式是否有任何测量的性能差异?

我问的原因是虽然我可以使用"-marm"选项为Xcode中的NEON特定源文件启用ARM,但这会破坏模拟器构建,因为GCC正在构建x86.我想知道我是否应该关闭"以拇指编译"并完成它.

iphone performance arm thumb

25
推荐指数
1
解决办法
8278
查看次数

在手臂组装中

以下行在arm组件中做了什么:

000031e6        2916    cmp r1, #22
000031e8        bf1a    itte    ne
Run Code Online (Sandbox Code Playgroud)

我得到了第一行(比较r1到22)但是第二行怎么样(我之前从未见过itte命令而googling没有返回任何内容)

embedded assembly arm instruction-set thumb

18
推荐指数
2
解决办法
7179
查看次数

在Thumb代码中使用BX来调用Thumb函数,或者跳转到另一个函数中的Thumb指令

我正在尝试学习在固件修改中有用的技能(我没有源代码)这些问题涉及使用拇指代码中的BX来跳转或调用其他现有的拇指代码.

  1. 如何从我的THUMB代码中将BX用于JUMP到现有固件THUMB代码.
  2. 如何从我的THUMB代码中使用BX来调用现有的THUMB函数(必须先设置LR).

我的理解是cpu查看lsb位(位0)并且我必须确保将其设置1为将cpu状态保持为"拇指状态".所以我想我必须添加1,将lsb位设置为1.

所以...说我想JUMP到0x24000(在一些现有的THUMB代码中间)

LDR R6, =0x24000
ADD R6, #1       @ (set lsb to 1)
BX R6
Run Code Online (Sandbox Code Playgroud)

我觉得这是对的吗?

现在说我想要使用BX调用现有的拇指功能,我希望它返回给我,所以我需要将LR设置为我希望它返回的位置.

让我说我要调用的函数是0x24000有人建议我使用:

ldr r2, =0x24000
mov lr, pc
bx r2
Run Code Online (Sandbox Code Playgroud)

这是我不明白的地方:

  1. R2中的地址没有设置lsb位...所以不会bx r2将模式切换到ARM模式?

  2. LR .. PC有地址(当前指令开始,+ 4),我被告知.在Thumb和Arm中,任何指令地址都必须对齐(16位或32位),因此它不会将LSB位设置为1.只有奇数将lsb位设置为1.

所以在上面的代码中,我将LR设置为(PC),一个也没有lsb位1设置的地址.因此,当我调用的函数来到它的结尾时,并且确实BX LR......嗯......如何才能返回到我的THUMB代码?我肯定错过了什么...

通常BL用于调用函数.手册说BL指令将LR设置为下一行代码......那么这是否意味着(通常使用的)BLTHUMB指令将LR设置为return addr + 1自动?

gcc arm thumb

15
推荐指数
1
解决办法
1万
查看次数

如何编译和链接生锈代码到Android apk打包应用程序

我正在尝试将Rust代码添加到android NDK示例(native-activity); 每当我将Rust代码(编译为.a)链接到.so时,它都无法运行.

我从这里获取信息,以获得一个知识渊博的防锈编译器和'独立工具链' https://github.com/mozilla/rust/wiki/Doc-building-for-android

有人在Rust IRC频道上建议我需要在某处提到"拇指"; 是否可以选择传递给rustc,或者我是否必须首先以不同的方式构建它?

我当然能够在桌面版本上调用另外的rust&c.

是否有人在.apk中使用锈蚀代码; 它必须简单..很难破解复杂项目的makefile.(我认为通过阅读伺服源来解决这个问题非常困难)

我已经证实这个过程可以生成一个可用的包装而不会生锈; 如果我链接未经剥离的防锈代码 - 即使没有达到(即使链接没有告诉我任何错误),它也无法运行 .如果我删除对'rusty_android()'的调用,它就可以了.如果我将对garbage_android的调用移动到未到达的点,它仍然无效.我可以用'nm'验证'rusty_android'是否在.so ...中没有.

这是我目前的构建过程:它取自android native-activity示例; 我添加了一个带有单个extern功能的锈源文件,返回一个值,并尝试从样本的C main调试打印

ANDROID_CXX  = /opt/ndk_standalone/bin/arm-linux-androideabi-gcc

android:
    $(ANDROID_CXX) -I/home/ME/android-ndk-r9b/sources/android/native_app_glue -c jni/main.c  -o obj/local/armeabi/objs/native-activity/main.o
    rustc --target=arm-linux-androideabi hello_android.rs -C android-cross-path=/opt/ndk_standalone --crate-type=staticlib -o rusty_android.a
    $(ANDROID_CXX) -shared -o libs/armeabi/libnative-activity.so obj/local/armeabi/objs/native-activity/main.o obj/local/armeabi/libandroid_native_app_glue.a another.o rusty_android.a -llog -landroid -lEGL -lGLESv1_CM
   ant debug
   adb install -r bin/NativeActivity-debug.apk
   adb shell am start -n com.example.native_activity/android.app.NativeActivity




hello_android.rs:-

use std::libc;
#[no_mangle]
pub extern fn   rusty_android()->libc::c_int {
99 as libc::c_int
} …
Run Code Online (Sandbox Code Playgroud)

android arm thumb android-ndk rust

14
推荐指数
1
解决办法
4093
查看次数

iPhone编译为拇指

我听说在iPhone目标的设置中关闭"compile for thumb"以提高性能可能是个好主意.我找不到这个设置有些麻烦.由于我在我当前的项目中找不到它,我决定创建一个新的(我可以找到并设置它),并将我的文件复制到它(并同时更新我正在使用的所有库) ).

但现在看来这个设置也从这个新项目中消失了.无论我选择什么SDK,模拟器或设备,设置都不会显示在目标设置中!但我似乎仍然突然在"用户定义"类别下有一个名为GCC_THUMB_SUPPORT的变量.这是什么?

我尝试制作一个新目标,但该设置也不会出现(甚至不是GCC_THUMB_SUPPORT).

iphone compilation thumb

8
推荐指数
1
解决办法
7782
查看次数

objdump和ARM vs Thumb

我正在尝试用gcc反汇编为ARM构建的对象.不幸的是,objdump试图猜测代码是否是ARM和Thumb,并且错了:它认为我的代码是Thumb,而它实际上是ARM.

我看到objdump有一个选项可以强制它将所有指令解释为Thumb(-Mforce-thumb),但它没有强制ARM模式!

这对我来说似乎是一个非常奇怪的遗漏,它严重妨碍了我完成工作的能力(我在嵌入式设备上,我唯一的调试方法是查看反汇编).我尝试了各种方法,包括尝试告诉objdump使用不支持Thumb的ARM架构,但似乎没有任何工作.有任何想法吗?

(是的,我知道指令真的是 ARM ...)

assembly arm objdump binutils thumb

8
推荐指数
2
解决办法
9670
查看次数

从C,GCC(裸机)调用ARM组件

我试图在ARM中使用GCC进行一些裸机编程并在QEMU上进行测试.每当我从C调用ARM标签时,我的程序就会挂起.我有一个简单的代码示例,在https://gist.github.com/1654392上显示问题- 当我在该代码中调用activate()时,它会挂起.

我用objdump观察到当我从汇编到C代码(从_start开始)执行bl时,它生成一个小包装器,切换到拇指指令.看起来C代码都是用拇指指令生成的,但我的所有程序集都是用ARM(32位)指令生成的.我无法弄清楚为什么会这样或如何解决它.

gcc arm qemu thumb armv6

7
推荐指数
1
解决办法
8135
查看次数