Как загрузить адрес памяти без использования псевдоинструкций? - PullRequest
5 голосов
/ 01 сентября 2011

Я пытаюсь выучить язык ассемблера MIPS самостоятельно, используя MARS simulator .

По дидактическим причинам я ограничиваю себя тем, что не использую псевдоинструкции.

При попытке ввести адрес некоторых данных в регистр я столкнулся с проблемой, поскольку не могу использовать la.

Я пытался использовать lui в сочетании с ori, так же, как если бы я должен был загружать число напрямую, но безрезультатно:

  .data
arr:
  .byte 0xa1
  .byte 0xb2
  .byte 0xc3
  .byte 0xd4
  .byte 0xe5
  .byte 0xf6
  .byte 0x7a
  .byte 0x8b
  .byte 0x9c
  .byte 0xad

.text

  lui $s0, mem # <--- mars just gives me errors here :(
  ori $s0, mem # ?? ... 

Это выполнимо, используя , в частности, MARS, без псевдоинструкций ? Как?

Заранее спасибо!

Ответы [ 3 ]

7 голосов
/ 28 сентября 2011

Чтобы ответить на измененный вопрос « это выполнимо, используя специально MARS, без псевдоинструкций? »: после быстрого сканирования документации MARS это не так.Кажется, что MARS намеренно ограничен в педагогических целях.

Если вы хотите попробовать это на полноценном симуляторе MIPS, который будет имитировать ОС Linux, работающую на MIPS, и запускать код, созданный с помощью цепочки инструментов gnu, взгляните на OVP Simulator .Это бесплатно и работает в Linux и Windows, но, вероятно, на много больше, чем вам нужно.

2 голосов
/ 20 декабря 2015

Вашим ori инструкциям нужен еще один операнд для работы, и, насколько я видел ваш код, "mem" - это не существующий ярлык.Попробуйте:

2 голосов
/ 01 сентября 2011

Вам необходимо обратиться к метке в разделе данных в инструкциях lui и ori.Это работает для ассемблера gnu (as):

    .data
lab1: .byte 0xa1
...
.text
    lui $s0, %hi(lab1)
    ori $s0, %lo(lab1)
    lw  $s2, 0($s1)
...

Директивы% hi и% lo сообщают компоновщику, что происходит, чтобы он мог поместить адрес метки «lab1» в машинный код.

...