Копиране на масиви в MIPS32 сборка

Имам сегмент от C++ код, който трябва да конвертирам в mips с помощта на директен превод. Свършил съм повечето от тях, това е do while цикъл. Просто не разбирам този ред в MIPS.

x[i] = y[i];

Не разбирам как да конвертирам това в mips и търся безкрайно онлайн. Мога ли да получа помощ?

РЕДАКТИРАНЕ

Това е, което имах, но ми казаха, че е неправилно:

la $6, y
Li $7, $1
Add $7, $7, $7
Add $7, $7, $7
Add $8, $6, $7
Lw $6, 0($8)
La $7, x
Li $8, $1
Add $8, $8, $8
Add $8, $8, $8
Add $7, $7, $8
Sw $6, 0($7)

Използвах този онлайн сайт като справка:

http://www.cs.pitt.edu/~xujie/cs447/AccessingArray.htm

ВТОРА РЕДАКЦИЯ

C++ кодиране

i=0;
do {
    x[i]=y[i];
    i++;
}
while (i!=j);

MIPS Директен превод

Addi $1, $1, 0
Loop:   la $6, y
    Li $7, $1
    Add $7, $7, $7
    Add $7, $7, $7
    Add $8, $6, $7
    Lw $6, 0($8)
    La $7, x
    Li $8, $1
    Add $8, $8, $8
    Add $8, $8, $8
    Add $7, $7, $8
    Sw $6, 0($7)
    Addi $1, $1, 1
    Bne $1, $2, loop 

И ето всички мои регистри, които мога да използвам, за да избегна объркване за вас:

Variables   i   j   x   y   4 (constant)    Free
Registers   $1  $2   $3   $4    $5               $6, $7, $8

person Jacob Rhodes    schedule 03.11.2012    source източник
comment
Този ред код не сравнява два елемента от масиви. Това е назначение.   -  person sellibitze    schedule 03.11.2012
comment
Опитвате ли се да напишете версия на MIPS Assembly на тест за равенство на масив? Ако не, не разбрах този въпрос.   -  person sellibitze    schedule 03.11.2012
comment
Какво ви пречи да заредите адресите на първите елементи на масивите в регистрите на процесора, да преминете през всички елементи в цикъл чрез увеличаване на адресите, да заредите елементите в други регистри на процесора и след това да ги сравните?   -  person sellibitze    schedule 03.11.2012
comment
Съжалявам, вие сте прави, че не се сравняват двете. Продължавам да използвам този термин неправилно. Опитвам се да присвоя x[i] = y[i]. Моят професор ми даде цял кодов сегмент за конвертиране в MIPS от c++ и имам останалата част от него, с изключение на този един ред. И за sellibitze, не знам как да обходя всички елементи в цикъл чрез увеличаване на адресите.   -  person Jacob Rhodes    schedule 03.11.2012
comment
Вие правите това с инструкции като ADDIU, LW, LH, LB, BNEZ, например. Какво конкретно не разбираш?   -  person sellibitze    schedule 03.11.2012
comment
Командите LH и LB за начало.   -  person Jacob Rhodes    schedule 03.11.2012
comment
Какво ви пречи да прочетете документацията на MIPS за тези инструкции? Съвет: LH = зареждане на половин дума, LB = зареждане на байт   -  person sellibitze    schedule 03.11.2012
comment
Вашият подход към индексирането изглежда сложен. Освен това не виждам цикъл. Защо просто не увеличите $6 и $7 с 4 в рамките на един цикъл?   -  person sellibitze    schedule 03.11.2012
comment
Опитайте да дебъгвате кода си в симулатор като MARS или нещо подобно.   -  person sellibitze    schedule 03.11.2012


Отговори (1)


Това трябва да ви насочи в правилната посока. Тъй като това е въпрос за домашна работа, няма да ви дам пълно решение.

Бърза справка (MIPS инструкции, конвенция за повикване и т.н.):

http://www.mips.com/media/files/MD00565-2B-MIPS32-QRC-01.01.pdf

Примерна асемблираща функция, която изчислява точковия продукт на 32-битов и 16-битов вектор в среда с Little-Endian:

http://code.google.com/p/mips32-asm/source/browse/dot32x16.S

Тук можете да видите как се осъществява достъп до елементите на масивите.

Обърнете внимание, че ".set reorder" кара асемблера да пренареди инструкциите и/или да включи NOP, за да се справи с така наречения слот за забавяне. В случай, че вашият професор иска да види, че сте разбрали проблема със слота за забавяне, трябва сами да поръчате правилно инструкциите и/или да напишете свой собствен NOP след разклоняване/скок.

person sellibitze    schedule 03.11.2012
comment
Вашите връзки помагат толкова много! Благодаря ви, че не ми дадохте отговора, защото това не е това, което исках, и се извинявам, че закъснях толкова много с приетия отговор - person Jacob Rhodes; 09.01.2013