запустить код MIPS в mars4_5 - PullRequest
0 голосов
/ 16 мая 2018

У меня есть программа, чтобы найти максимальное простое число в данном массиве, закодированном в C: https://pastebin.com/1HrerxsH

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i, N = 1000, l = 0;
    int a[N], primeArr[l];

    printf("Array of numbers: \n");
    for (i = 0; i < N; i++)
    {
        a[i] = rand();
        printf("%d ", a[i]);
    }

    printf("\n\n");

    printf("Array of prime numbers: \n");
    for (i = 0; i < N; i++)
    {
        int k, numDivisor = 0;
        for (k = 1; k <= a[i]; k++)
            if (a[i] % k == 0)
                numDivisor++;
        if (numDivisor == 2)
        {
            primeArr[l] = a[i];
            printf("%d ", primeArr[l]);
            l++;
        }
    }

    printf("\n\n");

    if(l > 0)
    {
        printf("Max prime numbers: \n");
        int max = primeArr[0];
        for (i = 1; i < l; i++)
        {
            if (primeArr[i] >= max)
                max = primeArr[i];
        }
        printf("%d", max);
        return 0;
    }
    else
        return -1;
}

После компиляции его в сборку MIPS с помощью MIPS CROSS COMPILER, я получаю код в .sрасширение файла: https://pastebin.com/NTMHY9Jw

    .file   1 "test3.c"
    .rdata
    .align  2
    $LC0:
    .ascii  "Array of numbers: \n\000"
    .align  2
$LC1:
    .ascii  "%d \000"
    .align  2
$LC2:
    .ascii  "\n\n\000"
    .align  2
$LC3:
    .ascii  "Array of prime numbers: \n\000"
    .align  2
$LC4:
    .ascii  "Max prime numbers: \n\000"
    .align  2
$LC5:
    .ascii  "%d\000"
    .text
    .align  2
    .globl  main
    .ent    main
main:
    .frame  $fp,72,$31      # vars= 40, regs= 3/0, args= 16, gp= 0
    .mask   0xc0010000,-8
    .fmask  0x00000000,0
    addiu   $sp,$sp,-72
    sw  $31,64($sp)
    sw  $fp,60($sp)
    sw  $16,56($sp)
    move    $fp,$sp
    sw  $sp,40($fp)
    li  $2,1000         # 0x3e8
    sw  $2,20($fp)
    sw  $0,24($fp)
    lw  $2,20($fp)
    sll $2,$2,2
    addiu   $2,$2,7
    addiu   $2,$2,7
    srl $2,$2,3
    sll $2,$2,3
    subu    $sp,$sp,$2
    addiu   $2,$sp,16
    addiu   $2,$2,7
    srl $2,$2,3
    sll $2,$2,3
    sw  $2,44($fp)
    lw  $2,24($fp)
    sll $2,$2,2
    addiu   $2,$2,7
    addiu   $2,$2,7
    srl $2,$2,3
    sll $2,$2,3
    subu    $sp,$sp,$2
    addiu   $2,$sp,16
    addiu   $2,$2,7
    srl $2,$2,3
    sll $2,$2,3
    sw  $2,48($fp)
    la  $4,$LC0
    jal printf
    sw  $0,16($fp)
$L2:
    lw  $2,16($fp)
    lw  $3,20($fp)
    slt $2,$2,$3
    beq $2,$0,$L3
    lw  $2,16($fp)
    sll $2,$2,2
    lw  $3,44($fp)
    addu    $16,$2,$3
    jal rand
    sw  $2,0($16)
    lw  $2,16($fp)
    sll $2,$2,2
    lw  $4,44($fp)
    addu    $2,$2,$4
    la  $4,$LC1
    lw  $5,0($2)
    jal printf
    lw  $2,16($fp)
    addiu   $2,$2,1
    sw  $2,16($fp)
    j   $L2
$L3:
    la  $4,$LC2
    jal printf
    la  $4,$LC3
    jal printf
    sw  $0,16($fp)
$L5:
    lw  $2,16($fp)
    lw  $3,20($fp)
    slt $2,$2,$3
    beq $2,$0,$L6
    sw  $0,32($fp)
    li  $2,1            # 0x1
    sw  $2,28($fp)
$L8:
    lw  $2,16($fp)
    sll $2,$2,2
    lw  $3,44($fp)
    addu    $2,$2,$3
    lw  $3,0($2)
    lw  $2,28($fp)
    slt $2,$3,$2
    bne $2,$0,$L9
    lw  $2,16($fp)
    sll $2,$2,2
    lw  $4,44($fp)
    addu    $2,$2,$4
    lw  $3,0($2)
    lw  $2,28($fp)
    div $0,$3,$2
    bne $2,$0,1f
    break   7
1:
    mfhi    $2
    bne $2,$0,$L10
    lw  $2,32($fp)
    addiu   $2,$2,1
    sw  $2,32($fp)
$L10:
    lw  $2,28($fp)
    addiu   $2,$2,1
    sw  $2,28($fp)
    j   $L8
$L9:
    lw  $3,32($fp)
    li  $2,2            # 0x2
    bne $3,$2,$L7
    lw  $2,24($fp)
    sll $2,$2,2
    lw  $4,48($fp)
    addu    $3,$2,$4
    lw  $2,16($fp)
    sll $2,$2,2
    lw  $4,44($fp)
    addu    $2,$2,$4
    lw  $2,0($2)
    sw  $2,0($3)
    lw  $2,24($fp)
    sll $2,$2,2
    lw  $3,48($fp)
    addu    $2,$2,$3
    la  $4,$LC1
    lw  $5,0($2)
    jal printf
    lw  $2,24($fp)
    addiu   $2,$2,1
    sw  $2,24($fp)
$L7:
    lw  $2,16($fp)
    addiu   $2,$2,1
    sw  $2,16($fp)
    j   $L5
$L6:
    la  $4,$LC2
    jal printf
    lw  $2,24($fp)
    blez    $2,$L13
    la  $4,$LC4
    jal printf
    lw  $4,48($fp)
    lw  $2,0($4)
    sw  $2,32($fp)
    li  $2,1            # 0x1
    sw  $2,16($fp)
$L14:
    lw  $2,16($fp)
    lw  $3,24($fp)
    slt $2,$2,$3
    beq $2,$0,$L15
    lw  $2,16($fp)
    sll $2,$2,2
    lw  $3,48($fp)
    addu    $2,$2,$3
    lw  $3,0($2)
    lw  $2,32($fp)
    slt $2,$3,$2
    bne $2,$0,$L16
    lw  $2,16($fp)
    sll $2,$2,2
    lw  $4,48($fp)
    addu    $2,$2,$4
    lw  $2,0($2)
    sw  $2,32($fp)
$L16:
    lw  $2,16($fp)
    addiu   $2,$2,1
    sw  $2,16($fp)
    j   $L14
$L15:
    la  $4,$LC5
    lw  $5,32($fp)
    jal printf
    lw  $sp,40($fp)
    sw  $0,36($fp)
    j   $L1
$L13:
    lw  $sp,40($fp)
    li  $2,-1           # 0xffffffffffffffff
    sw  $2,36($fp)
$L1:
    lw  $2,36($fp)
    move    $sp,$fp
    lw  $31,64($sp)
    lw  $fp,60($sp)
    lw  $16,56($sp)
    addiu   $sp,$sp,72
    j   $31
    .end    main

Но когда я запускаю файл .s в MARS4_5, появляются следующие ошибки: директива .align не может появляться в текстовом сегменте

". ascii«директива не может появиться в текстовом сегменте

« 1 »не является распознанным оператором

« 1f »: операнд неверного типа

« $ 31 »: операнд неверныйвведите

Как это исправить?

1 Ответ

0 голосов
/ 17 мая 2018

MARS не распознает сегмент rdata; измените это просто данные. Для хорошей цели удалите все директивы .align, так как они были вставлены в компилятор для повышения производительности, но в этом нет необходимости, если вы просто запускаете это в MARS. Наконец, чтобы избавиться от «операнда неправильного типа», вам нужно выяснить, где компьютер на самом деле предназначен для того, чтобы эти метки указывали и исправляли его вручную.

...