【发布时间】:2021-04-23 08:40:55
【问题描述】:
本季度我正在学习 ARM 汇编课程,但我无法完全理解它。 明天有一个实验室,我们可以在实验室中抢占先机。本实验的任务是将以下 C 函数转换为汇编:
int32_t Less1(int32_t a)
{
return a - 1 ;
}
int32_t Add(int32_t a, int32_t b)
{
return a + b ;
}
int32_t Square2x(int32_t x)
{
return Square(x + x) ;
}
int32_t Last(int32_t x)
{
return x + SquareRoot(x) ;
}
以下是确切的说明:
您的任务是为这些 C 函数中的每一个创建汇编语言替换...
主程序中提供了 Square 和 SquareRoot 函数。
我们获得了一个主程序,如有必要,我可以提供全部或部分内容。我不理解其中的 90%,并且我不希望它有很多专门用于使功能显示在带有触摸屏的测试板上。它还具有 square 和 squareroot 函数,因为看起来汇编没有这些操作。我不确定我是否正确调用它们,但它们被命名为“Square”和“Squareroot”。
这是我在 ARM 汇编中写的:
Add: PUSH {LR}
MOV r0, a
MOV r1, b
ADD r2, r1, r0
BX r2
Less1: PUSH {LR}
MOV r0, a
MOV r1, 1
SUB r2, r0, r1
BX r2
Square2x: PUSH {LR}
MOV r0, x
MOV r1, r0
ADD r2, r0, r1
Square r3, r2
BX r3
Last: PUSH {LR}
MOV r0, x
Squareroot r1, r0
ADD r2, r0, r1
BX r2
我不知道这是否正确,因为我知道 C++ 并且刚刚开始组装,所以我很感激任何意见。我还没有完全理解寄存器和说明,但这是我根据我的教科书和我可以在网上找到的内容。
谢谢!
【问题讨论】:
-
检查此类事情的一个不错的选择是查看编译器生成的输出。这是一个讨论这个问题的线程:stackoverflow.com/questions/137038/…
-
在 asm 中,
a是一个全局符号名。您的函数 args 到达寄存器 - 检查调用约定文档或查看编译器输出以查看它在哪里找到它的 args。 -
使用
bx lr将流控制返回给调用者。在机器代码中,返回 address 是另一个用于返回控制的参数。它与返回的 value 是分开的。 -
如果你需要推送
{lr}(即当一个函数调用另一个函数并且lr被重新利用)然后将返回地址直接弹出到pc中(而不是弹出到@987654329 @ 和下一个使用bx lr)。 -
我们不通过列出寄存器来调用函数。相反,我们在函数调用之前在寄存器中提供值,然后调用函数以使用先前建立的正确寄存器中的正确值来转移控制。