c - 反汇编的手臂代码似乎有一个错误
问题描述
我正在使用测试 C 文件为嵌入式 ARM 芯片编译一些测试代码。
test.c
如下:
int main(){
*(int*)0xFFFFF400 = 7;
}
我使用以下命令编译文件
arm-none-eabi-gcc -march=armv4 -mtune=arm7tdmi -specs=nosys.specs -Wall -o test test.c
编译时没有抱怨,然后我检查程序集
arm-none-eabi-objdump -d ./test
这会产生以下main()
部分的长输出:
00008018 <main>:
8018: e3e03000 mvn r3, #0
801c: e3a02007 mov r2, #7
8020: e3a00000 mov r0, #0
8024: e5032bff str r2, [r3, #-3071] ; 0xfffff401
8028: e1a0f00e mov pc, lr
为什么它说 0xfffff401 而不是 0xfffff400?为什么减去 3071 而不是 3072?
解决方案
该mvn
指令将其操作数的按位反转写入寄存器。0 的按位取反都是 1 位,在二进制补码中表示 -1。那么地址[r3, #-3071]
是-1 + -3071 = -3072。
我不知道为什么编译器选择基于 -1 而不是 0 的寻址。
推荐阅读
- postgresql - 代码返回不明确错误需要帮助
- kotlin - 在 Kotlin 的一行中使用(自定义)项目初始化新的 arraylist
- python - 我可以使用任何堆栈驱动程序监控 api 或 gcloud 命令获得 gcp 计算建议以调整实例大小吗
- python-3.x - 无法在 Raspberry Pi 上安装 snips-nlu:找不到 Rust 编译器
- c# - c#中的a is string和a !is string有什么区别
- android - 将 android studio 活动保存在单独的文件中
- mysql - PHP mySQL 查询,加入另一个表,但需要获取所有行
- react-native - Branch.io React Native 单次使用邀请链接
- soap - soapUI 中出现 401 Not Authorized 错误,但 Web 服务在 Postman 中运行良好
- javascript - 在链接单击 JS (anchrome.js) 时在新选项卡上打开链接