首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C到MIPS64的交叉编译及仿真

C到MIPS64的交叉编译及仿真
EN

Stack Overflow用户
提问于 2012-10-12 23:09:23
回答 1查看 778关注 0票数 1

我需要把下面的C代码翻译成MIPS64:

代码语言:javascript
复制
#include <stdio.h>

int main() {
    int x;
    for (x=0;x<10;x++) {
    }
    return 0;
}

我使用codebench将这段代码交叉编译成MIPS64。创建了以下代码:

代码语言:javascript
复制
    .file   1 "loop.c"
    .section .mdebug.abi32
    .previous
    .gnu_attribute 4, 1
    .abicalls
    .option pic0
    .text
    .align  2
    .globl  main
    .set    nomips16
    .set    nomicromips
    .ent    main
    .type   main, @function
main:
    .frame  $fp,24,$31      # vars= 8, regs= 1/0, args= 0, gp= 8
    .mask   0x40000000,-4
    .fmask  0x00000000,0
    .set    noreorder
    .set    nomacro
    addiu   $sp,$sp,-24
    sw  $fp,20($sp)
    move    $fp,$sp
    sw  $0,8($fp)
    j   $L2
    nop

$L3:
    lw  $2,8($fp)
    addiu   $2,$2,1
    sw  $2,8($fp)
$L2:
    lw  $2,8($fp)
    slt $2,$2,10
    bne $2,$0,$L3
    nop

    move    $2,$0
    move    $sp,$fp
    lw  $fp,20($sp)
    addiu   $sp,$sp,24
    j   $31
    nop

    .set    macro
    .set    reorder
    .end    main
    .size   main, .-main
    .ident  "GCC: (Sourcery CodeBench 2012.03-81) 4.6.3"

为了检查代码是否按预期工作,我通常使用WINMIPS64模拟器。出于某种原因,此模拟器不想接受此代码。似乎每一行代码都是错误的。我已经关注这个问题超过一天了。我希望有人能帮我解决这个问题。这个用于mips64架构的汇编代码有什么问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-13 01:23:52

从WINMIPS64 documentation的第7页开始

代码语言:javascript
复制
The following assembler directives are supported

.data                 - start of data segment
.text                 - start of code segment
.code                 - start of code segment (same as .text)  
.org    <n>           - start address
.space  <n>           - leave n empty bytes
.asciiz <s>           - enters zero terminated ascii string
.ascii  <s>           - enter ascii string
.align  <n>           - align to n-byte boundary
.word   <n1>,<n2>..   - enters word(s) of data (64-bits)
.byte   <n1>,<n2>..   - enter bytes
.word32 <n1>,<n2>..   - enters 32 bit number(s)
.word16 <n1>,<n2>..   - enters 16 bit number(s)
.double <n1>,<n2>..   - enters floating-point number(s)

去掉上面列表中没有的所有东西,因为它不会在模拟器中运行。

您需要将.align移到.text之前

根据文档,WINMIPS64需要daddi/daddui而不是addi/addiu

根据文档,move $a, $b不是受支持的助记符。将它们替换为daddui $a, $b, 0

slt必须为slti

最后,模拟器需要j的绝对地址,但是您给了它一个寄存器。请改用jr

在这一点上我得到一个无限循环。这是因为堆栈指针没有初始化。模拟器只提供0x400字节的内存,因此请继续并将堆栈初始化为0x400:

代码语言:javascript
复制
.text
    daddui  $sp,$0,0x400

现在它可以运行了。由于代码是自己运行的,因此返回寄存器中将没有任何内容,最终的jr $31只会将其返回到开头。

以下是我的版本:

代码语言:javascript
复制
    .align   2
    .text
    daddui   $sp,$0,0x400
main:
    daddui   $sp,$sp,-24
    sw       $fp,20($sp)
    daddui   $fp,$sp,0
    sw       $0,8($fp)
    j        $L2
    nop

$L3:
    lw       $2,8($fp)
    daddui   $2,$2,1
    sw       $2,8($fp)
$L2:
    lw       $2,8($fp)
    slti     $2,$2,10
    bne      $2,$0,$L3
    nop

    daddui   $2,$0,0
    daddui   $sp,$fp,0
    lw       $fp,20($sp)
    daddui   $sp,$sp,24
    jr       $31
    nop

考虑使用另一个编译器或另一个模拟器,因为这两个显然彼此讨厌。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12862025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档