gpt4 book ai didi

c - 我怎样才能组装一个最小的工作 MIPS 程序?

转载 作者:太空宇宙 更新时间:2023-11-04 07:15:14 25 4
gpt4 key购买 nike

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

最佳答案

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

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

关于c - 我怎样才能组装一个最小的工作 MIPS 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25368916/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com