动态分配数组,高级语言汇编 MIPS
Dynamically allocating array, high level language to assembly MIPS
我需要将 C 高级语言转换为 MIPS 的汇编语言。我被这个难住了。感谢您的帮助,谢谢。
array = new int [10] // dynamically allocating size
令我困惑的是 'new int' 部分,翻阅我的书,我找不到任何内容。
那是 C++ 或 C#,不是 C。
如果您使用的是 MARS 或 SPIM,则有一个 sbrk
系统调用,您可以使用它来实现堆分配器。 http://courses.missouristate.edu/kenvollmar/mars/help/syscallhelp.html。如果您不关心稍后释放内存,只需直接使用它:syscall
和 $v0=9
分配 $a0
更多字节的堆 space,以及 return s 指针在 $v0
.
但通常您可以只保留一些堆栈 space,如果可以在函数末尾释放它作为拆除此函数堆栈框架的一部分。
在除 C++ 之外的一些高级语言中,没有等同于 alloca
或 int array[10]
的方法来创建一个本地数组,其存储范围仅限于函数,因此即使是私有临时数组也必须使用与长期对象的完全动态分配相同的语法。
此类语言的编译器会 escape analysis 确定对该存储的引用是否可以在函数结束后继续存在。如果不是,则可以在堆栈上分配存储空间。 (但如果它确实逃逸了,它必须在堆上分配,例如 malloc
或 mmap
。)
当"compiling"手工汇编时,应该自己做逃逸分析。如果你没有 return 一个指向存储的指针,并且你没有将它的地址传递给持有它的任何函数,那么它只是从头开始 space 你可以而且应该保留堆栈 space for,而不是调用分配和释放系统调用。
在 MIPS 上,这是 gcc5.4 为简单函数所做的 (source+asm on Godbolt):
void foo(void) {
volatile int scratch[10]; // volatile so it can't optimize away
scratch[1] = 0;
}
# gcc -O3 -fno-delayed-branch
foo():
addiu $sp,$sp,-48 # allocate space
sw [=11=],12($sp) # store into it from the zero-register
addiu $sp,$sp,48 # restore stack pointer
j # return
nop # branch-delay slot filled with a NOP
所以 gcc 决定 scratch 从 $sp + 8
开始,所以第一个之后的 4 字节元素位于 $sp + 12
。
我需要将 C 高级语言转换为 MIPS 的汇编语言。我被这个难住了。感谢您的帮助,谢谢。
array = new int [10] // dynamically allocating size
令我困惑的是 'new int' 部分,翻阅我的书,我找不到任何内容。
那是 C++ 或 C#,不是 C。
如果您使用的是 MARS 或 SPIM,则有一个 sbrk
系统调用,您可以使用它来实现堆分配器。 http://courses.missouristate.edu/kenvollmar/mars/help/syscallhelp.html。如果您不关心稍后释放内存,只需直接使用它:syscall
和 $v0=9
分配 $a0
更多字节的堆 space,以及 return s 指针在 $v0
.
但通常您可以只保留一些堆栈 space,如果可以在函数末尾释放它作为拆除此函数堆栈框架的一部分。
在除 C++ 之外的一些高级语言中,没有等同于 alloca
或 int array[10]
的方法来创建一个本地数组,其存储范围仅限于函数,因此即使是私有临时数组也必须使用与长期对象的完全动态分配相同的语法。
此类语言的编译器会 escape analysis 确定对该存储的引用是否可以在函数结束后继续存在。如果不是,则可以在堆栈上分配存储空间。 (但如果它确实逃逸了,它必须在堆上分配,例如 malloc
或 mmap
。)
当"compiling"手工汇编时,应该自己做逃逸分析。如果你没有 return 一个指向存储的指针,并且你没有将它的地址传递给持有它的任何函数,那么它只是从头开始 space 你可以而且应该保留堆栈 space for,而不是调用分配和释放系统调用。
在 MIPS 上,这是 gcc5.4 为简单函数所做的 (source+asm on Godbolt):
void foo(void) {
volatile int scratch[10]; // volatile so it can't optimize away
scratch[1] = 0;
}
# gcc -O3 -fno-delayed-branch
foo():
addiu $sp,$sp,-48 # allocate space
sw [=11=],12($sp) # store into it from the zero-register
addiu $sp,$sp,48 # restore stack pointer
j # return
nop # branch-delay slot filled with a NOP
所以 gcc 决定 scratch 从 $sp + 8
开始,所以第一个之后的 4 字节元素位于 $sp + 12
。