2014-02-19 4 views
0

Я очень новичок в MIPS, и у меня есть домашняя проблема.Инициализация индекса массива в MIPS?

Меня спрашивают: Прежде чем начать цикл, вы должны инициализировать $ s0 для хранения базового адреса массива и $ s1 для хранения индекса массива. Индекс должен быть основан на нулевом значении, т. Е. У десятого элемента будет индекс с нулевой основанием 9.

Я честно понятия не имею, что это значит. Я думаю, что я инициализировал базовый адрес, но я не знаю, что такое индекс массива. Вот код, я был дан/работали на:

.data #by default, the "data segment" starts at address 0x10010000 
.word 1 
.word 2 
.word 3 
.word 4 
.word 5 
.word 6 
.word 7 
.word 8 
.word 9 
.word 0 

.text #instructions start below 

lui $s0,0x1001 

я добавил в нижней строке, остальное было дано мне. Любая помощь будет оценена, спасибо.

+0

Первый индекс 0. текущий элемент всегда $ s0 + $ s1 * 4 –

+1

_ «Я честно понятия не имею, что все это значит.» _ Тогда вы должны проконсультироваться материал курса и/или учитель , Продолжая, даже не понимая задания, бессмысленно. – Michael

ответ

0

Хорошо, если «я честно понятия не имею, что это значит» является точным утверждением, тогда давайте перейдем к одному «этому» за раз.

Я очень новичок в MIPS, и у меня есть проблема с домашней работой.

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

Перед началом цикла, вы должны инициализировать $ s0 провести базовый адрес массива

Знаете ли вы, что «инициализировать переменную» означает? Если нет, вам нужно вернуться к «вводному программированию». Предполагая, что это не проблема, мы хотим определить «установить значение в регистре» и «адрес массива».

Ваша команда не установить все 32 бита регистра, и вы, кажется, понял, что он очищает нижние 16 бит, что дает вам 0x10010000:

lui $s0,0x1001 

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

.data # I don't know or care where the data segment starts 
myArray: 
.word 0x00000001 # aka 0x01 or just 1, but this shows what's really happening 
.word 0x00000002 
# etc etc 
.text # Instructions do indeed start below 
la $s0 myArray # magic pseudo-op 

Ассемблер превратит la (адрес загрузки) псевдо-оп в lui с верхней половиной адреса для верхних бит, а затем ori, что с нижней половиной адреса для нижних бит , И это код, который все равно будет работать, когда вы сделаете это:

.data 
somethingElse: 
.word 0xDEADBEEF # I want anyone decompiling my code to see "DEAD BEEF" at the top of the dump 
myArray: 
.word 0x00000001 
.word 0x00000002 
# etc etc 
.text # Instructions do indeed start below 
la $s0 myArray # I still have a pointer to the first word in myArray! 

Хорошо, теперь давайте перейдем к следующему, что вы понятия не имеете о:

$ s1 провести индекс массива. Индекс должен быть основан на нулевом значении, то есть десятый элемент будет иметь индекс массива с нулевым значением 9 ... Я не знаю, что такое индекс массива.

Опять же, если вы не знаете, что A[0] через A[9] будет означать на языке высокого уровня, обратитесь к своему консультанту, как вы попали в этот класс без соответствующих предпосылок.Я собираюсь предположить, что у вас есть эта часть ... потому что первое, что вам нужно сделать, это полностью забыть.

MIPS не имеет массивов. У него просто места памяти, которые могут быть такими, какие вы решаете. Если я отправлю адрес myArray функции, ожидающей строку из символов ASCII, она будет читать ячейки памяти, как если бы они содержали символы ASCII. Нет Тип (только Zuul). Что вам нужно сделать, это «арифметика указателей».

Как указано в @Konrad, первое слово (четыре байта, которое вы собираетесь рассматривать как целое число) в вашем «массиве» (куча мест памяти, которые вы собираетесь рассматривать как последовательность слов), находится по адресу памяти myArray (возможно, но не окончательно расположен на 0x10010000). Так что если вы хотите получить значение, хранящееся в первый «элемент массива», вы могли бы сделать что-то вроде этого:

lw $t0, 0($s0) # load word into $t0, from address pointed to by $s0, offset by 0 

И тогда, вы можете получить следующее слово, как это, который будет захватывать данные в памяти адрес $s0+4. (Почему +4? Потому что каждое слово имеет длину 4 байта.)

lw $t0, 4($s0) # load word into $t0, from address pointed to by $s0, offset by 4 

Ну, это не очень полезно для доступа к случайному элементу массива. В MIPS вы не можете просто заменить 4 на ваш индекс массива $s1. Вам нужно будет сделать дополнение самостоятельно. Но не так!

add $t1, $s0, $s1 # Base address + oops! 

Если $ s1 = 1, что даст вам $s0+1, который не то, что вы хотите. Вам нужно $s0+(4*$s1). В духе не делать все ваша домашняя работа для вас, я собираюсь бросить код операции, который вы не можете знать, и заставьте вас проконсультироваться с духом Google, чтобы узнать, почему это работает.

sll $t2, $s1, 2 # Look it up! 
add $t1, $s0, $s1 # address of "array element" 
lw $t0, 0($t1) # value of "array element" 
+0

Эй. Большое спасибо за ваш комментарий. Я понимаю все основы, которые я просто впал в панику, когда задал вопрос. Извините :) Это то, что мой код выглядит сейчас 'луй $ s0,0x1001 Адди $ s1, $ ноль, 1 цикл: добавить $ t1, $ s0, $ t2 ЛМ $ t0, 0 ($ t1) BEQ $ t0, $ нулю, конец дополни $ t0, $ t0,2 SW $ t0,0 ($ t1) дополни $ s1, $ s1,1 SLL $ t2, $ s1, 2 j loop' Он просто продолжает зацикливаться навсегда, и я не знаю, что делать, чтобы исправить это. Большое спасибо за ваш ответ, хотя! Это действительно помогло. – user3326045

+0

Это не должен быть весь ваш код. Я предполагаю, что у вас есть метка 'end', определенная где-то. Другая вещь, которую я вижу отсутствует, заключается в том, что '$ t2' не инициализируется. Там может быть больше - это именно то, что выпрыгивает. Вы сделали один шаг через код (вы можете сделать это в MARS)? – RobertB

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