Преобразуване на MIPS32 в C: добавяне на базов адрес на масив към произволна стойност и нейното значение

В момента работя върху домашна работа и ми е дадена следната информация:

$s6 е местоположението на основния адрес на масива A, $s0 е местоположението на стойността на f > (не е посочено).

Иска да преобразувам някои инструкции в оператор C. Ето обаче въпросът ми, защото ако има отговор, мога много лесно да реша останалата част от този проблем:

добавете $t0, $s6, $s0

Това казва ли $t0 = (the base address of array A) + f или казва $t0 = A[0+f]?

Защото, ако базовият адрес на A беше 0x04000000 и използвах addi, за да добавя 4 към този основен адрес, давайки 0x04000004 и присвоявайки тази стойност на t0, това, което казвам, е, че t0 = A[1] (ако приемем, че съхранявам цели числа).

Но тъй като не знам стойността на f, не съм сигурен как да представя това в C, защото знам, че променям индекса, но не знам с колко. Би ли било по-точно да се каже (предвид горната инструкция):

$t0 = A[f/4]

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

Благодаря

OSFTW


person OpenSrcFTW    schedule 07.02.2013    source източник


Отговори (1)


В тази инструкция няма дерефериране:

add $t0, $s6, $s0

Все едно да кажеш

t0 = s6 + s0;

В C-подобен псевдокод. Или за вашия пример:

t0 = (char *)A + f;

За да получите стойност от A, тя ще изглежда нещо като:

lw $t1, 0($t0)

След като сте изпълнили предишната add инструкция, така че $t0 да сочи правилното място в масива.

person Carl Norum    schedule 07.02.2013
comment
О, значи е нещо като кастинг? Защото при s6 няма нищо друго освен адрес на паметта, нали? Така че ние прехвърляме това като (в този сценарий) int? - person OpenSrcFTW; 07.02.2013
comment
Кастингът означава нещо само ако имате типове, а асемблерният език не. Не съм сигурен какво точно имате предвид. - person Carl Norum; 07.02.2013
comment
Ето къде се крие объркването ми: добавяме адрес към някакво неясно цяло число. Резултатът е безсмислен, освен ако не бъде поставен в контекста на този масив и освен ако това цяло число не се дели на четири (в случай на масив от цели числа). За да изясним, това, което проблемът прави по-късно, е следното: lw $s0,0($t0) Така че сега третира t0 като масив, опитвайки се да получи достъп до него от основния му адрес. И ако приемем, че f се дели на 4 и е положително, всичко, което се прави, е препращане към елемент от масива при някакъв увеличен индекс, само по различен начин, нали? Нещо като: s0 = A[f/4] - person OpenSrcFTW; 07.02.2013
comment
ОК страхотно. Така че следните редове код основно означават f = A[f/4] ?: add $t0, $s6, $s0 lw $s0,0($t0) - person OpenSrcFTW; 07.02.2013
comment
Ако приемем, че f е в s0 и указател към първия елемент на A е в s6 (както е описано във вашия въпрос), да. И това A е масив от 4-байтови обекти. - person Carl Norum; 07.02.2013
comment
Това отговаря перфектно на въпроса ми, благодаря! Съжалявам, че ми отне малко време да опиша същината на моя проблем, но оценявам вашето време и усилия. - person OpenSrcFTW; 07.02.2013