【基础】.text .global _start和_start

① .text

.text部分是处理器开始执行代码的地方,指定了后续编译出来的内容放在代码段【可执行】

arm-linux-gcc编译器的关键词


② .global

.global关键字用来让一个符号对链接器可见,可以供其他链接对象模块使用;告诉编译器后续跟的是一个全局可见的名字【变量/函数名】
.global _start让_start符号成为可见的标识符,这样链接器就知道跳转到程序中的什么地方并开始执行程序。

③ _start

_start是一个函数的起始地址,也是编译、链接后程序的起始地址。
  • 由于程序是通过加载器来加载的,必然要找到_start名字的函数,因此_start必须定义成全局的,以便存在于编译后的全局符号表中,供其他程序【如:加载器】寻找到。

Linux寻找这个_start标签作为程序的默认进入点。
下面是一个使用 for 循环实现 `r0++` 直到 `r0 = r1` 的 ARM 汇编代码: ``` .text .global _start _start: mov r0, #1 ; 初始化 r0 为 1 mov r1, #10000 ; 初始化 r1 为 10000 loop: add r0, r0, #1 ; r0++,相当于 r0 = r0 + 1 cmp r0, r1 ; 比较 r0 和 r1 的值 bne loop ; 如果 r0 != r1,则跳转到 loop 标签处继续循环 exit: mov r7, #1 ; 设置系统调用号为 1(即退出程序) mov r0, #0 ; 设置返回值为 0 svc 0 ; 调用系统调用,退出程序 .end ``` 在这个示例代码中,我们使用了 `add` 指令来实现 `r0++` 的操作。`add` 指令是一个加法指令,它会将第一个操作数加上第二个操作数,并将结果写回到第一个操作数中。在这里,我们将 `r0` 加上 1,然后将结果写回到 `r0` 中,实现了 `r0++` 的操作。 接着,我们使用 `cmp` 指令来比较 `r0` 和 `r1` 的值。`cmp` 指令是一个比较指令,它会比较两个操作数的值,并设置条件码寄存器。在这里,我们比较 `r0` 和 `r1` 的值,如果它们不相等,则跳转到 `loop` 标签处,继续执行循环体代码。 最后,当 `r0` 的值等于 `r1` 时,程序会跳过 `bne` 指令,执行 `exit` 标签处的代码。在这里,我们使用了系统调用来退出程序,并将返回值设置为 0。 需要注意的是,这里使用了 `bne` 指令来实现循环,这意味着循环体代码至少会被执行一次。如果需要实现类似于 C 语言中的 `while` 循环,可以在循环体代码之前使用 `cmp` 指令进行判断,并使用 `beq` 指令(即条件码为 0 时跳转)来跳出循环。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

种瓜大爷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值