Сборка MIPS. Как сохранить целое число от пользователя в память?

Итак, я понятия не имею, как работает сборка или что я делаю. Я думал, что да, но, конечно же, я ошибался. Итак, вот мой вопрос: я даже не знаю, как разрешить пользователю вводить целое число, чтобы я мог сохранить его в памяти. Я также не знаю, выровнены ли мои переменные, потому что я даже не понимаю, что такое "выравнивание" на самом деле. Ниже приведен мой ассемблерный код вместе с комментариями, демонстрирующими, что мне ХОЧЕТСЯ, чтобы этот код делал. Пожалуйста помоги

.data
                    # variables here

intPrompt:                  .asciiz "\nPlease enter an integer.\n"
stringPrompt:               .asciiz "\nPlease enter a string that is less than 36 (35 or less) characters long.\n"
charPrompt:                 .asciiz "\nPlease enter a single character.\n"
int:                    .space 4
string:                     .space 36
char:                   .byte  1







                    .text
                    .globl main
main:

                    # print the first prompt
                    li $v0, 4
                    la $a0, intPrompt
                    syscall


                    # allow user to enter an integer
                    li $v0, 5
                    syscall

                    # store the input in `int`
                    # don't really know what to do right here, I want to save the user inputed integer into 'int' variable
                    sw $v0, int
                    syscall

person Eric Diviney    schedule 04.03.2015    source источник
comment
Ваш int, вероятно, не выровнен, потому что он идет после строк переменной длины, общая длина которых вряд ли будет кратной 4. Вы должны поместить свой int в начало раздела, тогда вы можете быть уверены, что он выровнен, или использовать выравнивание директивы. sw $v0, int подойдет, хотя это псевдо-операция.   -  person Jester    schedule 04.03.2015
comment
syscall возвращает целое число в $v0. Все, что вам нужно сделать, это сохранить это в int с sw $v0, int. О, вот что ты сделал. (Однако нет необходимости в другом вызове syscall). Я бы не стал использовать такие имена, как int, string и т. д. Здесь они, вероятно, подходят, но вы, вероятно, столкнетесь с зарезервированными словами в других языках.   -  person    schedule 04.03.2015
comment
Это ошибка, которую я получаю: ошибка в [каталоге]/Assignment2PartA.asm, строка 32, столбец 6: sw: слишком мало или неправильно отформатированы операнды. Ожидается: sw $t1,-100($t2) @HoboSapiens   -  person Eric Diviney    schedule 04.03.2015
comment
Тогда ваш ассемблер не понимает эту псевдооперацию. Используйте la $t0, int; sw $v0, ($t0) или аналогичный. Конечно, la — еще одна псевдо-операция, но она наверняка понимает это :)   -  person Jester    schedule 04.03.2015
comment
@Jester - извините за беспокойство - у меня есть еще один вопрос. Когда я запускаю li $v0, 1; la $a0, int; syscall;, я получаю результат 268500992 - есть идеи, почему?   -  person Eric Diviney    schedule 04.03.2015
comment
Да, системный вызов записи целого числа ожидает само целое число, а не его адрес. Вам нужно загрузить его из памяти, то есть сделать li $v0, 1; la $a0, int; lw $a0, ($a0); syscall;   -  person Jester    schedule 04.03.2015


Ответы (1)


Вы должны изменить тип переменной "int" с .space на .word

в итоге должно получиться так:

.data
                    # variables here

    intPrompt:                .asciiz "\nPlease enter an integer.\n"
    stringPrompt:             .asciiz "\nPlease enter a string that is less than 36 (35 or less) characters long.\n"
    charPrompt:               .asciiz "\nPlease enter a single character.\n"
    int:                      .word
    string:                   .space 36
    char:                     .byte  1

main:

    li $v0, 4         #you say to program, that you're going to output string which will be in the $a0 register
    la $a0, intPrompt #here you load your string from intPromt var. to $a0
    syscall           #this command just executes everything that you have written before >> it prints string, which is in $a0

    li $v0, 5         #this command says: "Hey, read an integer from console and put it in $v0!"
    syscall           #this command executes all previous commands ( li $v0, 5 )

    sw $v0, int       #sw -> store word, here you move value from $v0 to "int" variable
    syscall           #executes (sw $v0, int), here you have your input number in "int" variable

Более подробную информацию можно найти здесь

person Danil Parshukov    schedule 18.11.2016