2013-10-26 3 views
8

Я довольно новичок в языке ассемблера MIPS и в настоящее время занимаюсь классом по компьютерной архитектуре, который имеет большой раздел по кодированию MIPS. В прошлом я изучал несколько других языков программирования высокого уровня (C, C#, Python), поэтому у вас есть некоторые основы программирования.MIPS - Как MIPS выделяет память для массивов в стеке?

Мой вопрос здесь конкретно спрашивает: как MIPS выделяет память для массивов в стеке? Я надеюсь, что ответ на этот вопрос, мы надеемся, даст мне лучшее общее понимание MIPS, поскольку я все еще немного разбираюсь в концептуализации языка MIPS и его архитектуры. Я не совсем понимаю, как работают указатели в этом отношении ...

Было бы замечательно, если бы кто-то мог потратить время, чтобы помочь этому запутанному ученику! :)

+0

http://msdn.microsoft.com/en-us/library/ms253554%28v=vs.80%29.aspx –

+0

Спасибо за то, Ганс! –

ответ

14

Ну .. вы должны знать, что MIPS, как и C, по существу имеет три разных способа выделения памяти.

Рассмотрим следующий код C:

int arr[2]; //global variable, allocated in the data segment 

int main() { 
    int arr2[2]; //local variable, allocated on the stack 
    int *arr3 = malloc(sizeof(int) * 2); //local variable, allocated on the heap 
} 

MIPS сборки поддерживает все эти типы данных.

Чтобы выделить целочисленный массив в сегменте данных вы можете использовать:

.data 

arr: .word 0, 0 #enough space for two words, initialized to 0, arr label points to the first element 

Чтобы выделить целочисленный массив в стеке можно использовать:

#save $ra 
addi $sp $sp -4 #give 4 bytes to the stack to store the frame pointer 
sw $fp 0($sp) #store the old frame pointer 
move $fp $sp  #exchange the frame and stack pointers 
addi $sp $sp -12 #allocate 12 more bytes of storage, 4 for $ra and 8 for our array 
sw $ra -4($fp) 

# at this point we have allocated space for our array at the address -8($fp) 

выделить место в куче, требуется системный вызов. В SPIM тренажере это system call 9:

li $a0 8 #enough space for two integers 
li $v0 9 #syscall 9 (sbrk) 
syscall 
# address of the allocated space is now in $v0 
Смежные вопросы