我正在上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,它也编译了。
我只是不知道教授在问什么,我可能会要求澄清。
谢谢你,谢谢
1条答案
按热度按时间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
作为兼容性别名。