将C交叉编译为MIPS64并进行模拟

Ale*_*ijs 1 c assembly mips mips64

我需要将以下C代码翻译成MIPS64:

#include <stdio.h>

int main() {
    int x;
    for (x=0;x<10;x++) {
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我使用codebench将此代码交叉编译为MIPS64.创建了以下代码:

    .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"
Run Code Online (Sandbox Code Playgroud)

要检查代码是否按预期工作,我通常使用WINMIPS64模拟器.由于一个或其他原因,此模拟器不想接受此代码.似乎每行代码都是错误的.我一直在看这个问题超过一天.我希望有人可以帮助我解决这个问题.这个mips64架构的汇编代码有什么问题?

Jef*_*f E 5

从WINMIPS64 文档的第7页开始:

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)
Run Code Online (Sandbox Code Playgroud)

摆脱上面列表中没有的所有内容,因为它不会在模拟器中运行.

你需要先移动.align到之前.text

根据文档,WINMIPS64期望daddi/ daddui而不是addi/ addiu.

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

slt需要slti.

最后,模拟器需要一个绝对地址j,但你给它一个寄存器.请jr改用.

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

.text
    daddui  $sp,$0,0x400
Run Code Online (Sandbox Code Playgroud)

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

这是我的版本:

    .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
Run Code Online (Sandbox Code Playgroud)

考虑使用另一个编译器或另一个模拟器,因为这两个明显相互讨厌.