gpt4 book ai didi

c - 从 C 语言到 ARM 程序集的翻译——不断出现段错误,与 ldr 和 str 混淆?

转载 作者:太空宇宙 更新时间:2023-11-04 02:24:25 25 4
gpt4 key购买 nike

我是 ARM 汇编的新手,正在尝试将一些简单的代码片段从 C 语言转换为汇编语言。我不确定我是否正确使用了 ldr 和 str(尽管我觉得我已经尝试了所有方法)并且当我尝试运行它时我总是遇到段错误。

C代码是

int main() {
int x = 10;
int y = 5;
int z = 20;

int min = y;

if (x < min) {min = x;}
if (z < min) {min = z;}

return min;
}

我的汇编代码:

.global main
.text

main:
push {ip, lr}

mov r0, #10
mov r1, #5
mov r2, #20

str r3, [r1]

cmp r0, r3
bge done
str r0, [r3]

cmp r2, r3
bge done
str r2, [r3]

done:
ldr r0, [r3]
pop {ip, pc}

最佳答案

好的,对于每个变量,您必须决定将其存储在何处:

  • 可以存到寄存器中,只要有足够的备用寄存器就可以;
  • 你可以把它存储在一个固定的地址,这对全局和静态变量没问题,但对局部变量不好;
  • 你可以把它存储在栈上,如果没有足够的寄存器来循环,局部变量通常存储在栈上。这需要更多工作,因为您必须在每次要访问它时加载并存储它。

您的函数正在灾难性地混合这些。您将 x,y,z 存储在寄存器 r0,r1,r2 中,但随后您将 y 视为存储在该地址5,而实际上它存储在寄存器r1中。你不想在这里使用内存访问指令str r3, [r1],因为内存中什么都没有;只需 mov r3,r1 就足够了。

其余代码同样功能失调,但我不会详细介绍。你的函数很简单,你有足够多的寄存器来运行,所以我建议你重新编写它以对所有变量使用寄存器。根本没有 ldr/str 指令,只有 mov 指令。

并查看您的 C 编译器生成的汇编代码,以了解一些或所有变量必须存储在堆栈中的更复杂情况。

祝你好运!

关于c - 从 C 语言到 ARM 程序集的翻译——不断出现段错误,与 ldr 和 str 混淆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53345705/

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