Понимание MIPS пока петли -- mips пол Связанный проблема

Understanding MIPS while Loops


0
vote

проблема

русский

Учитывая традиционный цикл в C:

 <код> while(save[i] == k)      i += 1;   

Ответ в MIPS такое:

Первый шаг - загрузить сохранить [i] во временный регистр. Прежде чем мы сможем загрузить Сохранить [I] во временном регистре, нам нужно иметь свой адрес. До того, как мы Можно добавить I к базе массива, чтобы сформировать адрес, мы должны умножить Индекс I на 4 из-за проблемой адресации байта. К счастью, мы можем использовать Shift Left Logical, поскольку Shift Zear your на 2 бита умножает на 22 или 4 (см. Стр. 88 в предыдущем разделе). Нам нужно добавить петлю метки для него, чтобы мы могли вернуться к этой инструкции в конце цикла:

 <код> Loop: sll $t1,$s3,2 # Temp reg $t1 = i * 4   

Чтобы получить адрес сохранения [I], нам нужно добавить $ T1 и основание сохранения в $ S6:

 <код> add $t1,$t1,$s6 # $t1 = address of save[i]   

Теперь мы можем использовать этот адрес для загрузки Сохранить [i] во временный регистр:

 <код> lw $t0,0($t1) # Temp reg $t0 = save[i]   

Следующая инструкция выполняет тест цикла, выходящий, если сохранить [i] ≠ k:

 <код> bne $t0,$s5, Exit # go to Exit if save[i] ≠ k   

Тогда

 <код> addi $s3, $s3, 1 #i = i+1 j Loop # go to Loop Exit:    

Все еще с этим объяснением я до сих пор не могу его получить.

  1. Я не понимаю, почему мы должны сдвигаться влево на 2 бита. Я не понимаю цели сдвига влево / вправо логично, и я не могу связать объяснения, онлайн для практики проблем и примеров.

  2. Потому что я даже не получаю шаг 1, я не получаю шага 2, который добавляет результат смещения ($ t1) и основание сохранения в $ s6.

в основном мне нужна объяснение этой проблемы, потому что даже с ответами я не могу получить его. Мне действительно нужно простое (тушеное) объяснение, которое ясно объяснило бы каждый шаг и почему это сделано так. Пожалуйста и спасибо!

Английский оригинал

Given the traditional while loop in C:

while(save[i] == k)      i += 1; 

The answer in MIPS is such:

The first step is to load save[i] into a temporary register. Before we can load save[i] into a temporary register, we need to have its address. Before we can add i to the base of array save to form the address, we must multiply the index i by 4 due to the byte addressing problem. Fortunately, we can use shift left logical, since shift ing left by 2 bits multiplies by 22 or 4 (see page 88 in the prior section). We need to add the label Loop to it so that we can branch back to that instruction at the end of the loop:

Loop: sll $t1,$s3,2 # Temp reg $t1 = i * 4 

To get the address of save[i], we need to add $t1 and the base of save in $s6:

add $t1,$t1,$s6 # $t1 = address of save[i] 

Now we can use that address to load save[i] into a temporary register:

lw $t0,0($t1) # Temp reg $t0 = save[i] 

The next instruction performs the loop test, exiting if save[i] ≠ k:

bne $t0,$s5, Exit # go to Exit if save[i] ≠ k 

Then

addi $s3, $s3, 1 #i = i+1 j Loop # go to Loop Exit:  

Still with this explanation, I still can't quite get it.

  1. I don't understand why we have to shift left by 2 bits. I don't understand the purpose of shift left/right logical, and I can't relate the explanations online to practice problems and examples.

  2. Because I don't even get step 1, I don't get step 2, which is adding the result of the shifting ($t1) and the base of save in $s6.

Basically, I need explanation of this problem because even with the answers I can't quite get it. I really need a simple (dumbed down) explanation that would clearly explain every step and why this is done so. PLEASE and thank you!

</div
  
 
 

Список ответов

1
 
vote
vote
Лучший ответ
 
<Р> Представьте, у вас есть данные, начиная с значением температуры адрес:
 <код> temp address V              | ValueA | ValueB | ValuesC  | Byte  offset  0  1 2 3  4 5 6 7  8 9 10 11 Array index   0         1        2   
<Р> Это при условии, что каждый «элемент» представляет собой целое число, 4 байта в длину. <Р> При получении адреса в начале элемента, вы можете увидеть это кратно- <Р> MIPS не волнует, что по адресу (с точки зрения размеров), так что вам нужно, чтобы справиться с этим себя. <Р> Таким образом, адрес 1-го элемента в tempaddress + 0, второй элемент находится в <код> tempaddress+(1*4) и т.д.. <Р> Или, делая его более универсальным, элемент Х в <код> temp address + (X*4) <Р> Х * 4 такое же, как сдвиг влево Х на 2. <Р> То есть: если Х было значение 1 в двоичной системе, что является <код> 0000 0001 <Р> сдвинуты влево на 2, то есть <код> 0000 0100 или в десятичной системе 4. <Р> если Х было значение 3 в двоичной системе, что является <код> 0000 0011 <Р> сдвинуты влево на 2, то есть <код> 0000 1100 или в десятичной системе 6.
 

Imagine you have data starting at an temp address value:

temp address V              | ValueA | ValueB | ValuesC  | Byte  offset  0  1 2 3  4 5 6 7  8 9 10 11 Array index   0         1        2 

This is assuming that each 'element' is a integer that is 4 bytes in length.

When getting the address of the start of an element, you can see it is multiples of 4

MIPS doesn't care what is at the address (in terms of sizes), so you need to to handle that your self.

So the address of the 1st element is at tempaddress+0, the second element is at tempaddress+(1*4) etc.

Or when making it more generic, element X is at temp address + (X*4)

X*4 is the same as shifting X left by 2.

Ie: if X was the value 1 in binary that is 0000 0001

Shifted left by 2, that is 0000 0100 or in decimal 4.

if X was the value 3 in binary that is 0000 0011

Shifted left by 2, that is 0000 1100 or in decimal 6.

</div
 
 

Связанный проблема

-6  C для MIPS Convert [закрыто]  ( C to mips convert ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> <Путь d = "M15 6.38A6.48 6.48 0 007.78. 04H-.02A6.49 6.49 0 002.05 ...

1  Добавление инструкции на многосипедный DataPath и Control (MIPS)  ( Adding an instruction to a multicycle datapath and control mips ) 
У меня есть задание, где я должен добавить инструкцию этой формы: <код> liw <dstreg>,[<src1reg>+<src2reg>] e.g. liw $2,[$3+$4] Где <код> liw похож на...

0  Возвращая строку с помощью символов, удаленных в MIPS  ( Returning a string with characters removed in mips ) 
У меня есть этот код, где, учитывая входную строку, я пытаюсь вернуть выходную строку с удаленными символами. Входная строка должна заканчиваться полной оста...

0  MIPS принимает пустой вход  ( Mips accepting blank input ) 
У меня есть функция в MIPS, которые собирают пользовательский ввод и помещают его в массив целых чисел. Как я не разбиваю на пустой ввод? Есть ли какой-то уло...

1  Инструкции MIPS для установки регистра до 1  ( Mips instructions to set a register to 1 ) 
Это вопрос, который появился в нескольких прошлых работах, но я не могу ничего найти в Интернете. Какие шесть одиночных команд инструкции могут установить $...

1  Как я могу исправить функцию своего принтриста в MIPS?  ( How do i fix my printlist function in mips ) 
Я должен распечатать массив в MIPS, но я должен работать с некоторым данным кодом, который мне не разрешено меняться. Поскольку прямо сейчас он печатает прави...

2  Canadian Cross Binutils на руку  ( Canadian cross binutils to arm ) 
Я использую jlime на моем HP Jornada 720, который использует процессор ARM. У меня уже есть Cross-Compabled GCC для x86 / a> ( arm-linux-gcc ). Идея того...

-2  VHD Xlinix Что-то неверно, одинаковые значения, это должно быть с MUCES  ( Vhd xlinix something is wrong same values it must be with muxes ) 
У меня проблема с моей программой в xilinx vhd. Я должен создать процессор, который поддерживает классические инструкции MIPS32 Добавить, sub, и, или, lw, sw,...

1  Когда данные хранятся для регистрации на инструкции погрузки в трубопроводе MIPS  ( When is data stored to register on load instruction in mips pipeline ) 
Я понимаю, что в трубопроводе MIPS для инструкция нагрузки данные читаются из кэша на 4-й этап обучения , которые это этап доступа к памяти. В случае дру...

0  C для MIPS Source и Dest Указатель  ( C to mips source and dest pointer ) 
<код> #include <stdio.h> int source[] = {3, 1, 4, 1, 5, 9, 0}; int dest[10]; int main ( ) { int k; for (k=0; source[k]!=0; k++) { dest[k] = sour...

1  Беги программы MIPS в командной строке без открытия QTSPIM  ( Run mips program in command line without opening qtspim ) 
Я хочу выполнить программу чисто через терминал, не открывающую QTSPIM и запустить программу через графический интерфейс. Это можно обойти? Я использовал SPIM...

0  Перемещение определенных символов строки до конца IT MIPS  ( Moving specific characters of a string to the end of it mips ) 
Я хотел узнать, как я могу протолкнуть определенные типы символов в строке к концу IT, например: У меня есть <код> .data string: .asciiz "H3LL0 W0RLD" ...

0  MIPS рекурсивная функция Ошибка функции In: Неверное значение счетчика программы: 0x00000001  ( Mips recursive function error in invalid program counter value 0x00000001 ) 
Я в настоящее время пишу C программную программу, которая может перевести мою собственную грамматику языка в код MIPS. <код> int i; int b; int add() { i...

0  Размещение слов в памяти  ( Placing words in memory ) 
Я использую симулятор PCSSPIM, и мой процессор представляет собой Intel X86 (маленький Endian) Как я понимаю, декларация .word -5 должно поместить в память ...

0  Сумма двух 64-битных unsigned целое qtspim  ( Sum of two 64 bit unsigned integer qtspim ) 
Предполагают регистры $ A1 и $ A0 содержат 64-битное целое число без знака <код> A = $a1 × 2^32 + $a0 и регистры $ a3 и $ a2 содержат 64-битное целое чи...