【问题标题】:ARM assembler return pointer [closed]ARM汇编程序返回指针[关闭]
【发布时间】:2018-01-03 00:30:58
【问题描述】:

我目前正在从事一个项目,我需要将一个指向双精度的指针从 ARM 汇编函数返回到 C 程序。

我目前通过将双精度压入堆栈然后返回堆栈指针的地址来解决这个问题。

但是我不确定这是否是最好(最安全)的方法,因此我在这里要求确认这是一种好方法还是替代解决方案。

另外一个问题是,根据任务,我不允许在其中传递另一个变量,也不允许使用 C malloc 函数。

编辑:我通过在 .data 中创建一个变量解决了这个问题,然后只是简单地返回该字段的地址。

【问题讨论】:

  • 你不应该返回一个指向本地的指针,这在 C 中也是不合法的。
  • 好的,如果我返回堆栈指针,它将返回一个指向局部变量的指针。还有什么其他选择可以在内存中放入一个 double 并返回该指针而不必使用 C malloc?
  • 如果您不特别关心可重入性,请在数据部分声明一个变量。不过,您确实应该将指针传递给您的函数。
  • 好吧,如果可以的话,问题是任务中声明的函数专门要求指针作为返回值,而没有指针作为输入。
  • 确实是软浮动。我不知道他们为什么以他们的方式制定任务,我也觉得它不是特别优雅。我会联系我的主管,询问是否可以将返回值改为按值。

标签: c assembly arm


【解决方案1】:

你应该想想你会在纯 C 中做些什么!您不能在堆栈上分配double。您可以在调用汇编函数之前保留内存。示例

void my_assembly(double* value) {
    *value = (...);
}

void main(void) {
    double value;

    my_assembly(&value);
}

或者你把它分配到你的汇编函数中:

double* my_assembly(void) {
    double *value = malloc(sizeof(double));
    *value = (...);
    return value;
}

void main() {
    double* value = my_assembly();
}

另一种选择是返回双倍! ARM's Procedure call Standard5.4 Result Return 说:

在 r0 和 r1 中返回双字大小的基本数据类型(例如 long long、double 和 64 位容器化向量)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 2015-02-25
    相关资源
    最近更新 更多