我需要将C高级语言转换为MIPS的汇编语言。我对此很困惑。任何帮助表示赞赏,谢谢。
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("password").child("passcodes");
ref.orderByChild("passcode").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.exists())
// passcode is present, so go to activity for checking the passcode
else
// no passcode is present so go for activity to set up new passcode
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
让我感到困惑的是“新诠释”部分,看着我的书,却找不到任何东西。
答案 0 :(得分:1)
那是C ++或C#,而不是C。
如果使用的是MARS或SPIM,则有一个sbrk
的系统调用,可用于实现堆分配器。 http://courses.missouristate.edu/kenvollmar/mars/help/syscallhelp.html。如果您以后不希望释放内存,则直接使用它即可:syscall
与$v0=9
分配$a0
堆空间的更多字节,并在$v0
中返回指针
但是,通常可以保留一些堆栈空间,如果可以的话,可以在函数末尾取消分配它,这是拆除该函数的堆栈框架的一部分。
在C ++以外的某些高级语言中,没有等效于alloca
或int array[10]
的方法来创建存储范围仅限于函数的本地数组,因此,即使是临时暂存数组也必须使用语法与持久对象的全面动态分配相同。
针对此类语言的编译器执行escape analysis来确定对该存储的引用是否可以在函数结束后继续存在。如果没有,则可以在堆栈上分配存储空间。 (但是,如果它确实转义了,则必须在堆上进行分配,例如使用malloc
或mmap
。)
当用手“编译”为asm时,您应该自己进行转义分析。如果您不返回指向存储的指针,并且不将其地址传递给持有该存储的任何函数,那么它只是暂存空间,您可以并且应该为其保留堆栈空间,而不是调用allocate和free系统调用。
在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 $0,12($sp) # store into it from the zero-register
addiu $sp,$sp,48 # restore stack pointer
j $31 # return
nop # branch-delay slot filled with a NOP
因此,gcc决定从头开始$sp + 8
,因此第一个之后的4个字节元素位于$sp + 12
。