考虑下一个代码:
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
可以省略吗?在"ARM11TechnicalRefManual"的第1-34节"拇指指令集"下,它说:
"Thumb指令集是最常用的32位ARM指令的子集.Tumb指令长16位,并且具有相应的32位ARM指令,对处理器型号具有相同的影响."
谁可以解释更多关于这个特别是第二句话,并说处理器如何执行它?
我对指令集有点困惑.有Thumb,ARM和Thumb 2.根据我的阅读Thumb指令都是16位,但在ARMv7M用户手册(第vi页)中,提到了Thumb 16位和Thumb 32位指令.
现在我必须克服这种困惑.据说Thumb 2支持16位和32位指令.那么ARMv7M实际上支持Thumb 2指令而不仅仅是Thumb吗?
还有一件事.我可以说Thumb(32位)与ARM指令相同,它们都是32位吗?
我想知道是否有人在iPhone 3GS上有ARM与Thumb代码性能有任何硬数据.特别是对于非浮点(VFP或NEON)代码 - 我知道Thumb模式下浮点性能的问题.
是否存在大型ARM指令的额外代码大小成为性能危害的程度?换句话说,如果我的可执行代码与可用内存相比相对较小,那么打开Thumb模式是否有任何测量的性能差异?
我问的原因是虽然我可以使用"-marm"选项为Xcode中的NEON特定源文件启用ARM,但这会破坏模拟器构建,因为GCC正在构建x86.我想知道我是否应该关闭"以拇指编译"并完成它.
以下行在arm组件中做了什么:
000031e6 2916 cmp r1, #22
000031e8 bf1a itte ne
Run Code Online (Sandbox Code Playgroud)
我得到了第一行(比较r1到22)但是第二行怎么样(我之前从未见过itte命令而googling没有返回任何内容)
我正在尝试学习在固件修改中有用的技能(我没有源代码)这些问题涉及使用拇指代码中的BX来跳转或调用其他现有的拇指代码.
我的理解是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)
这是我不明白的地方:
R2中的地址没有设置lsb位...所以不会bx r2
将模式切换到ARM模式?
LR .. PC有地址(当前指令开始,+ 4),我被告知.在Thumb和Arm中,任何指令地址都必须对齐(16位或32位),因此它不会将LSB位设置为1.只有奇数将lsb位设置为1.
所以在上面的代码中,我将LR设置为(PC),一个也没有lsb位1设置的地址.因此,当我调用的函数来到它的结尾时,并且确实BX LR
......嗯......如何才能返回到我的THUMB代码?我肯定错过了什么...
通常BL用于调用函数.手册说BL指令将LR设置为下一行代码......那么这是否意味着(通常使用的)BL
THUMB指令将LR设置为return addr + 1
自动?
我正在尝试将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) 我听说在iPhone目标的设置中关闭"compile for thumb"以提高性能可能是个好主意.我找不到这个设置有些麻烦.由于我在我当前的项目中找不到它,我决定创建一个新的(我可以找到并设置它),并将我的文件复制到它(并同时更新我正在使用的所有库) ).
但现在看来这个设置也从这个新项目中消失了.无论我选择什么SDK,模拟器或设备,设置都不会显示在目标设置中!但我似乎仍然突然在"用户定义"类别下有一个名为GCC_THUMB_SUPPORT的变量.这是什么?
我尝试制作一个新目标,但该设置也不会出现(甚至不是GCC_THUMB_SUPPORT).
我正在尝试用gcc反汇编为ARM构建的对象.不幸的是,objdump试图猜测代码是否是ARM和Thumb,并且错了:它认为我的代码是Thumb,而它实际上是ARM.
我看到objdump有一个选项可以强制它将所有指令解释为Thumb(-Mforce-thumb
),但它没有强制ARM模式!
这对我来说似乎是一个非常奇怪的遗漏,它严重妨碍了我完成工作的能力(我在嵌入式设备上,我唯一的调试方法是查看反汇编).我尝试了各种方法,包括尝试告诉objdump使用不支持Thumb的ARM架构,但似乎没有任何工作.有任何想法吗?
(是的,我知道指令真的是 ARM ...)
我试图在ARM中使用GCC进行一些裸机编程并在QEMU上进行测试.每当我从C调用ARM标签时,我的程序就会挂起.我有一个简单的代码示例,在https://gist.github.com/1654392上显示问题- 当我在该代码中调用activate()时,它会挂起.
我用objdump观察到当我从汇编到C代码(从_start开始)执行bl时,它生成一个小包装器,切换到拇指指令.看起来C代码都是用拇指指令生成的,但我的所有程序集都是用ARM(32位)指令生成的.我无法弄清楚为什么会这样或如何解决它.