如何组装最小工作MIPS程序?

时间:2014-08-18 17:33:49

标签: c assembly mips simulator

我可以在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

1 个答案:

答案 0 :(得分:3)

C库定义了一个名为start的特殊符号,它是程序开始执行的地方。链接器期望找到此符号,它将用作程序入口点。

您没有定义start,因此链接器会抱怨并为您提供默认值。默认值可能是代码的第一条指令,这就是程序仍然有效的原因。