2015-11-22 3 views
4

Долго спрашивайте, извините заранее. Хорошо, поэтому я работаю с несколькими необычными ограничениями, поэтому я пока не нашел много помощи в Интернете. Основное ограничение состоит в том, что я не могу использовать эмулятор, и поэтому я не могу использовать syscalls. Мне нужно сделать несколько вещей с MIPS и C и не знаю достаточно о том, как эти программы выполняются, чтобы понять, как заставить их работать так, как они мне нужны. Во-первых, согласно инструкциям моего преподавателя, мне нужно создать файл под названием «rng.s». Он также указывает, что он должен начинаться со следующим кодом:как запустить программу MIPS без основной и вызывать программу MIPS из программы C

.abicalls 
.option pic0 
.globl rng, seed 
.set nomips16 

Как я понимаю, это означает, что я создаю две функции «ГСЧ» и «семени», и мне не нужно, чтобы создать основной функция. В шаблоне, предусмотренном ранее заданий, был некоторый код, который выглядит следующим образом:

.ent main 
.type main, @function 

И я не уверен, стоит ли или не нужно мне сделать что-то подобное здесь с функциями ГСЧ и семенами. Кроме того, когда я не включаю основной, ассемблер отбрасывает ошибку. Позже в присваивании я должен написать программу на языке C, которая вызывает функцию rng() (ту же, что написана в моей программе MIPS) и передать ей некоторые значения. Я не совсем понимаю, как вызвать rng() из моей программы на C. Сначала я попробовал это так:

#include<stdio.h> 

int main(int argc, char* argv[]) 
{ 
    //int a, b, c are input from command line using atoi(argv) 
    //i've tested it and that part works fine, so it's not important 
    rng(a, b, c); 
    return 0; 
} 

Мой профессор включил Makefile, который должен собрать обе программы в один исполняемый файл, но если я пытаюсь использовать это, я получаю сообщение об ошибке, потому что есть несколько деклараций главный.

Итак, большой вопрос: как я могу запустить свою программу MIPS без основного? И как мне вызвать функцию внутри моей программы MIPS изнутри моей программы на C?

Я уже провел два дня на этом, и я никуда не ушел, поэтому любая помощь будет очень признательна. Спасибо.

+0

Найти документацию для MIPS ABI (возможно, профессор дал некоторые ссылки) или просто посмотреть, какой код сборки gcc генерирует для main(), который вызывает ваши функции (см. Параметры '-c',' -S'). –

+0

У меня есть некоторые проблемы с пониманием, на какой архитектуре вы смешиваете C и MIPS. Существует причина, почему MIPS обычно запускается в эмуляторе на обычном ПК. – grek40

+0

Как я понимаю, когда обе программы превращаются в объектные файлы, на самом деле не имеет никакого значения, как это получилось, теперь файлы могут работать на архитектуре машины, которая выполняла компиляцию/сборку и, следовательно, способна совместной работы. Поэтому я считаю, что Makefile запускает мою программу MIPS через ассемблер и мою программу C через gcc. Я предполагаю, что это в основном упражнение в определении того, как сделать эти программы общими. Мне просто нужно понять нюансы того, как облегчить это общение. –

ответ

0

Хорошо, так что мне понадобилось некоторое время, но я, наконец, вышел с ответом. Я знаю, что многое из этого, наверное, довольно простое, но я просто собираюсь выложить это ради любых бедных душ, которые так же смущены, как и я. Так вот что я выяснил для обоих вопросов:

1: Как запустить свою программу MIPS без главного

Когда программа собран, там должно быть главным где-то. При сборке в одиночку программа должна иметь главную объявленную в заголовке. Вроде так:

.abicalls 
.option pic0 
.globl main 
.set nomips16 
.ent main 
.type main, @function 

Это говорит вашей программе, что main является функцией и что вы вводите ее на главной.

Однако, если вы используете что-то вроде Makefile, чтобы включить разные программы в один готовый продукт, тогда можно не объявить основной в вашей программе MIPS и вместо этого объявить основную в другой программе, которая будет скомпилирована в то же время. В этом случае вам просто нужно сделать то же самое, вы бы для основной, но с функцией, что вы начнете в (функции, которую вы хотите запустить первый при выполнении программы) следующим образом:

.abicalls 
.option pic0 
.globl rng, seed 
.set nomips16 
.ent rng 
.type rng, @function 

Обратите внимание, как я использовал .globl rng, seed. Насколько я понимаю, это позволяет вам вызывать обе функции (rng и seed) из других программ, которые скомпилированы в готовый продукт.

2: Как вызывать функции, написанные в моей программе MIPS из моего C программы

На примере C размещен в вопросе будет делать трюк. Как оказалось, программа MIPS будет принимать эти аргументы (a, b, c) и помещать их в регистры $ a0- $ a2. Затем вам просто нужно отформатировать вашу программу, чтобы поместить возвращаемое значение в $ v0, которое затем можно будет вернуть обратно в программу C. В качестве примера:

// C Program 
//========================= 
#include<stdio.h> 
int main() 
{ 
    printf("%d", rng(0)); 
    return 0; 
} 
//========================= 

// MIPS program 
//========================= 
rng: 
    addi $v0, $a0, 1 
    jr $ra 
//========================= 

Запуск программы C будет просто выход 1, так как он вызывает RNG(), которая добавляет 1 к входу (находится в $ a0, которые программа C, установленной в 0) и помещает его в $ v0 перед выходом. Затем printf печатает возвращаемое значение rng, которое было 1.

Итак, у вас оно есть. Спасибо за вашу помощь в Интернете.

Смежные вопросы