gpt4 book ai didi

将 C 交叉编译为 MIPS64 并进行仿真

转载 作者:太空宇宙 更新时间:2023-11-04 01:10:47 28 4
gpt4 key购买 nike

我需要将以下 C 代码转换为 MIPS64:

#include <stdio.h>

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

我使用 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"

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

最佳答案

来自 WINMIPS64 的第 7 页 documentation :

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:

.text
daddui $sp,$0,0x400

现在它运行了。由于您自己运行代码,因此返回寄存器和最终的 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

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

关于将 C 交叉编译为 MIPS64 并进行仿真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12862025/

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