You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何ARM汇编程序需添加.global main才能编译运行?

关于ARM汇编中.global main的疑问

对应的ARM汇编代码

.text
.global main

fib:
    push { r4}
    MOV r1, #1 
    MOV r2, #0  
    MOV r3, #1
    
    loop:
    CMP r3, r0
    BGE exit
    mov r4,r1
    ADD r1, r1,r2
    mov r2, r4
   
    add r3, r3, #1
    B loop
    
    exit:
    pop {r4}
    mov r0, r1
    MOV PC,  lr

main:
    mov r0, #13
    push {lr}
    BL fib
    pop {lr}
    mov r1, r0
    ldr r0, =output_string
    push {lr}
    bl printf
    pop {lr}
    MOV PC, lr

@ The 'data' section contains static data for our program
.data
output_string:
    .asciz "%d\n"

问题解答

  • 为什么单个目标文件也需要.global main?
    汇编器默认会把你定义的符号(比如这里的main)标记为局部符号,只能在当前汇编文件内部访问。链接器不管目标文件数量多少,都需要找到一个全局可见的入口符号——哪怕只有一个目标文件,链接器也无法识别局部的main。.global main的作用就是把main从局部符号提升为全局符号,让链接器能够定位到它。

  • .global main是否用于指定程序入口?缺失它程序为何无法运行?
    是的,链接器默认会把全局符号main当作程序的入口点(你也可以通过链接器参数指定其他入口,但默认规则是找main)。如果没加.global main,main是局部符号,链接器搜遍所有全局符号都找不到入口,就会抛出“找不到入口点”的错误,导致链接失败,程序自然无法生成和运行。你所说的“编译失败”其实是链接阶段出的问题,汇编本身可以通过,但链接环节通不过。

内容的提问来源于stack exchange,提问作者user394334

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 09:10:53