我可以在simulator中运行此汇编代码,但我收到链接器警告
Linking...
ld: warning: cannot find entry symbol start; defaulting to 80020000
Post build...
Done
为什么我只使用汇编代码而不是使用相同的C代码来获得此错误?如何更改程序集以使链接器满意?我想知道哪些陈述不是必要的,这样我才能有一个最小的程序?
我可以评论这些陈述(我不确定他们做了什么):
#.frame $fp,40,$31 # vars= 16, regs= 2/0, args= 16, extra= 0
#.mask 0xc0000000,-4
#.fmask 0x00000000,0
我的代码(由C翻译)是
.file 1 "minimips.c"
# -G value = 8, Cpu = 3000, ISA = 1
# GNU C version cygnus-2.7.2-970404 (mips-mips-ecoff) compiled by GNU C version cygnus-2.7.2-970404.
# options passed: -msoft-float
# options enabled: -fpeephole -ffunction-cse -fkeep-static-consts
# -fpcc-struct-return -fcommon -fverbose-asm -fgnu-linker -msoft-float
# -meb -mcpu=3000
gcc2_compiled.:
__gnu_compiled_c:
.rdata
.align 2
$LC0:
.ascii "Result %d\000"
.text
.align 2
.globl main
.ent main
main:
#.frame $fp,40,$31 # vars= 16, regs= 2/0, args= 16, extra= 0
#.mask 0xc0000000,-4
#.fmask 0x00000000,0
subu $sp,$sp,40
sw $31,36($sp)
sw $fp,32($sp)
move $fp,$sp
jal __main
li $2,40
sw $2,16($fp)
li $2,40
sw $2,20($fp)
lw $2,16($fp)
lw $3,20($fp)
addu $2,$2,$3
sw $2,24($fp)
la $4,$LC0
lw $5,24($fp)
jal printf
move $2,$0
j $L1
$L1:
move $sp,$fp # sp not trusted here
lw $31,36($sp)
lw $fp,32($sp)
addu $sp,$sp,40
j $31
.end main
首先我只是添加数字。 C代码是a + b = c。
当我翻译一个更简单的程序(没有任何包含)时,我可以创建一个项目类型程序集(而不是组合C / asm)。
它现在编译并运行时没有链接器错误(但它没有使用printf
)
gcc2_compiled.:
__gnu_compiled_c:
.text
.align 2
.globl main
.ent main
main:
.frame $fp,40,$31 # vars= 16, regs= 2/0, args= 16, extra= 0
.mask 0xc0000000,-4
.fmask 0x00000000,0
subu $sp,$sp,40
sw $31,36($sp)
sw $fp,32($sp)
move $fp,$sp
jal __main
li $2,15 # 0x0000000a
sw $2,16($fp)
li $2,20 # 0x00000014
sw $2,20($fp)
lw $2,16($fp)
lw $3,20($fp)
addu $2,$2,$3
sw $2,24($fp)
move $2,$0
j $L1
$L1:
move $sp,$fp # sp not trusted here
lw $31,36($sp)
lw $fp,32($sp)
addu $sp,$sp,40
j $31
.end main
答案 0 :(得分:3)
C库定义了一个名为start
的特殊符号,它是程序开始执行的地方。链接器期望找到此符号,它将用作程序入口点。
您没有定义start
,因此链接器会抱怨并为您提供默认值。默认值可能是代码的第一条指令,这就是程序仍然有效的原因。