gpt4 book ai didi

loops - 在 ARM 汇编中创建嵌套 If 语句

转载 作者:行者123 更新时间:2023-12-01 22:49:23 25 4
gpt4 key购买 nike

我有兴趣将 C++ 中的斐波那契序列代码转换为 ARM 汇编语言。 C++代码如下:

#include <iostream> 
using namespace std;
int main()
{
int range, first = 0 , second = 1, fibonacci;
cout << "Enter range for the Fibonacci Sequence" << endl;
cin >> range;

for (int i = 0; i < range; i++)
{
if (i <=1)
{
fibonacci = i;
}
else
{
fibonacci = first and second;
first = second;
second = fibonacci;
}
}
cout << fibonacci << endl;

return 0;
}

我尝试将其转换为程序集如下:

    ldr r0, =0x00000000 ;loads 0 in r0
ldr r1, =0x00000001 ;loads 1 into r1
ldr r2, =0x00000002 ;loads 2 into r2, this will be the equivalent of 'n' in C++ code,
but I will force the value of 'n' when writing this code
ldr r3, =0x00000000 ;r3 will be used as a counter in the loop

;r4 will be used as 'fibonacci'

loop:
cmp r3, #2 ;Compares r3 with a value of 0
it lt
movlt r4, r3 ;If r3 is less than #0, r4 will equal r3. This means r4 will only ever be
0 or 1.

it eq ;If r3 is equal to 2, run through these instructions
addeq r4, r0, r1
moveq r0,r1
mov r1, r4
adds r3, r3, #1 ;Increases the counter by one

it gt ;Similarly, if r3 is greater than 2, run though these instructions
addgt r4, r0, r1
movgt r0, r1
mov r1, r4
adds r3, r3, #1

我不完全确定这是否就是您在汇编中执行 if 语句的方式,但这对我来说是次要的。我更感兴趣的是如何合并 if 语句来测试“计数器”与“范围”进行比较的初始条件。如果 counter < range,那么它应该进入代码的主体,斐波那契语句将在其中迭代。然后它将继续循环,直到 counter = range。

我不知道如何执行以下操作:

cmp r3, r2 
;If r3 < r2
{
<code>
}

;else, stop

此外,为了使其正确循环,我可以添加:

cmp r3, r2
bne loop

这样循环就会迭代直到 r3 = r2 为止?

提前致谢:)

最佳答案

将 if 语句放入循环内并不明智。摆脱它。

优化的(有点)独立斐波那契函数应该是这样的:

unsigned int fib(unsigned int n)
{
unsigned int first = 0;
unsigned int second = 1;
unsigned int temp;

if (n > 47) return 0xffffffff; // overflow check
if (n < 2) return n;

n -= 1;

while (1)
{
n -= 1;
if (n == 0) return second;
temp = first + second;
first = second;
second = temp
}
}

与阶乘非常相似,优化斐波那契数列在现实世界的计算中有点无意义,因为它们很快就会突破 32 位障碍:阶乘为 12,斐波那契为 47。

如果您确实需要它们,那么非常短的查找表将为您提供最好的服务。

如果您需要为更大的值完全实现此函数: https://www.nayuki.io/page/fast-fibonacci-algorithms

最后但并非最不重要的一点是,这是上面的汇编函数:

cmp r0, #47     // r0 is n
movhi r0, #-1 // overflow check
bxhi lr
cmp r0, #2
bxlo lr

sub r2, r0, #1 // r2 is the counter now
mov r1, #0 // r1 is first
mov r0, #1 // r0 is second

loop:
subs r2, r2, #1 // n -= 1
add r12, r0, r1 // temp = first + second
mov r1, r0 // first = second
bxeq lr // return second when condition is met
mov r0, r12 // second = temp
b loop

请注意,最后一个 bxeq lr 可以紧接在 subs 之后,这可能看起来更符合逻辑,但考虑到 Cortex 系列的多次发行能力,它是按照这个顺序更好。

这可能不是您正在寻找的答案,但请记住这一点:循环内的单个 if 语句可能会严重削弱性能 - 嵌套的情况更是如此。

而且几乎总有办法避免这些。你只需要寻找它们。

关于loops - 在 ARM 汇编中创建嵌套 If 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20023757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com