ARM 汇编 - 在一个文件中编写多个函数

问题描述 投票:0回答:1

我正在上 ARM 处理器的课程,我们正在做一些汇编代码。我并不是要求为我编写代码,而是要求更多的文件格式问题。作业是在单个文件中创建简单的数学代码函数。

部分作业指出:使用 .global 指令定义函数名称并以以下方式开始代码:

.全球 .节.文本 :

所以我的代码是:

.global _start 
_start:
    
mov r0, #-5
mov r1, #10

.global max
.section .text

max:
    cmp r0, r1        //Compare r0 and r1
    movlt r0, r1      // If r1 > r0, set r0 to r1
    bx lr             //return from function call

.global min
.section .text
min:
    cmp r0, r1        // Compare r0 and r1
    movgt r0, r1      // If r1 < r0, set r0 to r1
    bx lr             // Return from function call

.global abs
.section .text
abs:
    cmp r0, #0          //Compare r0 and 0
    rsblt r0, r0, #0    // if less than 0 then -r0
    bx lr             // Return from function call

这是将多个函数放入一个汇编代码文件中的正确方法吗?

我尝试了不同的方法,例如将函数名称内联 .global _start 并在每个 like 之间使用逗号

.global _start, max, min, abs
并编译。

我也尝试过只使用一个 .section .text 并且它也已编译。

我只是不知道教授的要求是什么,我可能会要求澄清。

谢谢!

assembly arm
1个回答
0
投票

是的,看起来是正确的。 (除了您的

_start
不以
_exit
系统调用结束,因此执行将陷入下一步,在这种情况下
max:

不过,您不需要在每个函数之前一直切换到

.text
部分;当前部分保留您设置的内容,直到下一个
.section
指令或文件末尾。 (
.text
是文件顶部的默认部分,但明确这一点是一种很好的风格。)它没有任何害处,只是会分散读者的注意力,特别是因为没有
 .data
指令位于文件中的任意位置(
.section .data
的简写)。

.text
.data
.bss
.rodata
是编译器放入内容的四个主要部分。更改部分意味着这是输出的一部分,汇编器将从后面的源代码行将字节组装到其中,直到您再次改变。
.text
是只读 + 执行,所以这是放置机器代码的唯一好地方。


汇编器本身不知道也不关心函数边界,但它为您提供了低级构建块来实现函数:

  • 通过标签定义符号
  • 使用
    .globl
    将其标记为导出,以便在链接器可以看到它的
    .o
    的符号表中可见。
  • 从符号所附加的地址开始组装一些机器代码字节,因此如果其他代码跳转到此处,该代码将运行。

是的,您可以将多个操作数导出到一个

.globl
指令,尽管更常见的做法是将与符号相关的内容放在其标签旁边,因此与该函数相关的所有内容都在您可以移动的一行中如果您要重构源代码,请将 a 复制到另一个文件。

© www.soinside.com 2019 - 2024. All rights reserved.