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

mrzz3bfm  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(144)

我正在上ARM处理器的课,我们正在做一些汇编代码。我不是要求为我写代码,而是一个文件格式问题。任务是在单个文件中创建简单的数学代码函数。
任务的一部分规定:使用.global指令定义函数名,并以以下内容开始代码:
.global .section .text:
所以我的代码是:

.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

这是将多个函数放在一个汇编代码文件中的正确方法吗?
我尝试了不同的方法,比如将函数名放在inline .global _start中,每个函数名之间用逗号隔开,比如
.global _start, max, min, abs,然后编译。
我也试着只写一个.section .text,它也编译了。
我只是不知道教授在问什么,我可能会要求澄清。
谢谢你,谢谢

tv6aics1

tv6aics11#

是的,看起来没错。(除了你的_start没有以_exit系统调用结束,所以执行将落在下一个,在这种情况下max:
不过,您不需要在每个函数之前一直切换到.text部分;当前部分将保持您设置的内容,直到下一个.section指令或文件结束。(.text是文件顶部的默认部分,但明确这一点是很好的风格。)它没有任何害处,只是让读者分心,特别是因为文件中没有.data directive.section .data的简写),因为你的函数只需要代码,没有静态常量或变量。
.text.data.bss.rodata是编译器放入内容的四个主要部分。更改部分意味着这是汇编器将从后面的源代码行中组装字节的输出部分,直到您再次更改。.text是只读的+ exec,所以这是放置机器码的唯一好地方。
汇编器本身并不知道或关心函数边界,但它为您提供了底层构建块来 * 实现 * 函数:

  • 通过标签定义符号
  • .global标记它为导出的,这样它就可以在.o的符号表中看到,链接器可以看到它。
  • 从符号所连接的地址开始,汇编一些字节的机器码,所以如果其他代码跳转到这里,该代码将运行。

是的,你可以把多个操作数导出到一个.global指令中,尽管更常见的是把与符号相关的东西放在它的标签旁边,所以与该函数相关的所有内容都在一个行块中,如果你重构源代码,你可以把它移到另一个文件中。
.global.globl指令的别名。一些老的汇编器,如Unix MIPS,只接受.globl,所以我倾向于认为.globl是正常的方式,.global是兼容性别名,尽管当前GAS manual中的措辞将.global作为主要拼写,.globl作为兼容性别名。

相关问题