Сборка MIPS: как объявить целочисленные значения в разделе .data? - PullRequest
7 голосов
/ 12 апреля 2010

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

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

Например, я хочу инициализировать адреса 0x1001000 - 0x10001003 со значениями 0x99, 0x87, 0x23, 0x45. Я думаю, что это можно сделать в разделе объявления данных (.data) моей программы сборки, но я не уверен в синтаксисе. Это возможно?

В качестве альтернативы, в разделе .data, как мне указать хранение целочисленных значений в некотором месте памяти (мне все равно, где, но я просто хочу сослаться на них где-нибудь). Поэтому я ищу C-эквивалент "int x = 20, y = 30, z = 90;" Я знаю, как это сделать, используя инструкции MIPS, но возможно ли объявить нечто подобное в разделе .data программы сборки MIPS?

Ответы [ 3 ]

8 голосов
/ 12 апреля 2010

Вы обычно не инициализируете определенные области памяти; каждый раздел (включая .data) размещается во время соединения, и перемещения разрешаются тогда

Чтобы переместить запись данных, вы выбираете имя и ставите name: перед ним, чтобы вы могли обратиться к нему по имени позже. Вы указываете блок данных, используя .size value. Например:

.data
    x: .word 20
    y: .word 30
    z: .word 90

Тогда вы можете использовать метки в вашей сборке:

.text
    lw $t0, x
0 голосов
/ 01 июля 2016

так что если я объявил x: .word 701 y: .word 701, то .text bge y, x, endin основной части программы, условие будет принимать целое число переменные x и y, что позволяет завершить метод end?

Я считаю, что это неправильно, указание x или y внутри вашей программы mips вернет вам только базовый адрес x и y. Например, если вы набрали

addi $t0,y,8

даст вам $ t0 = 10000010 (при условии, что адрес y начинается с 10000000)

Правильный способ сравнения 2 значений из 2 слов с метками x и y будет примерно таким:

.data
x: .word 701
y: .word 701

.text
main:
   lw $t0,x              #loads $t0 with 701
   lw $t1,y              #loads $t1 with 701
   bge $t0,$t1,end       #compares $t0 and $t1, if equal, jump to address [end]

end:
   #the code segment for end label
0 голосов
/ 05 апреля 2014

вы можете увидеть больше здесь: Обзор сборки MIPS и здесь: MIPS dataseg

...