c++ - 使用(MLA 指令)将 C++ 转换为 ARM 程序集
问题描述
我正在尝试翻译此 C++ 代码:
y = y+ x*32;
z = y+ x*x;
对于 ARM 汇编假设(x 是 R1 寄存器,y 是 R2,z 在 R3 中),我应该为每种情况只使用一个汇编指令 所以,我建议使用 (MLA) 但我不知道如何,可以你请帮帮我!!
解决方案
首先,将您的代码片段放在一个函数中并创建一个完整的代码。
void x(void){
volatile int x = 1, y = 2, z = 3;
y = y+ x*32;
z = y+ x*x;
}
然后,在Compiler Explorer上编译它。
结果是:
x:
mov r1, #1
mov r2, #2
mov r3, #3
sub sp, sp, #16
str r1, [sp, #4]
str r2, [sp, #8]
str r3, [sp, #12]
ldr r2, [sp, #4]
ldr r3, [sp, #8]
add r3, r3, r2, lsl #5
str r3, [sp, #8]
ldr r0, [sp, #4]
ldr r1, [sp, #4]
ldr r2, [sp, #8]
mla r3, r1, r0, r2
str r3, [sp, #12]
add sp, sp, #16
bx lr
之后,从值中获取变量的赋值。看起来[sp, #4]
是x
、[sp, #8]
是y
、[sp, #12]
是z
。
最后,使用这个关系,构造结果。
答案是:
add r2, r2, r1, lsl #5
mla r3, r1, r1, r2
推荐阅读
- c# - 有没有一种有效的方法将 c# 类增量从 web api 2.2 应用程序传播到测试程序应用程序?
- geolocation - 如何在地理围栏中获得停留时间?
- ruby - 如何使用 sed 和正则表达式格式化 ruby 版本字符串?
- php - 尝试连接数据库时不显示输出
- javascript - 带有浮动图像的多列内容
- android - 淡出闪屏,淡入android中的webview
- docker - 如何在 Docker (Laradock) 中使用 Deployer
- python - 将 edgelist 数据转换为 networkx 对象
- python - 线程/Tkinter Python
- java - 实体管理器工厂和持久性单元中的 JPA 属性之间的区别