对于MIPS-32处理器体系结构,似乎没有明确的标准化堆栈帧和C语言调用约定(寄存器使用等).也就是说,似乎完全取决于汇编器/编译器工具链来定义自己的堆栈帧和调用约定.我很难找到GCC编译器用于MIPS-32指令集的约定的确切参考.我特意在Cygwin上使用GCC交叉编译器,目标是在eCos开源内核的嵌入式环境中使用MIPS-32内核.
任何有关MIPS-32在该领域的GCC权威文件的提及都将受到赞赏.
在C++中,局部变量总是在堆栈上分配.堆栈是应用程序可以占用的允许内存的一部分.该内存保存在RAM中(如果没有换成磁盘).现在,C++编译器是否总是创建在堆栈中存储局部变量的汇编程序代码?
举例来说,以下简单代码:
int foo( int n ) {
return ++n;
}
Run Code Online (Sandbox Code Playgroud)
在MIPS汇编程序代码中,这可能如下所示:
foo:
addi $v0, $a0, 1
jr $ra
Run Code Online (Sandbox Code Playgroud)
如您所见,我根本不需要使用堆栈.C++编译器会识别出来,并直接使用CPU的寄存器吗?
编辑:哇,非常感谢您几乎立即和广泛的答案!foo的功能主体当然应该是return ++n;,而不是return n++;.:)
我正在阅读MIPS汇编语言编程,但现在我想为Nintendo 64构建一个简单的"游戏" .我想Hello, World在屏幕上打印一个,但是有人可以帮忙解决这个问题.因为我没有什么可以开始的.
我选择任天堂64,因为我的朋友告诉我它使用MIPS,我已经有了模拟器.
我知道8086汇编和学习MIPS汇编.另外,我正在学习正则表达式,然后我想知道:
我的最终目标是为我的旧Actiontec调制解调器/路由器编译无线工具,以便将其配置为无线到以太网桥.目前它的无线功能(看似)由管理大部分Web界面的相同二进制文件控制,但看起来他们使用库无线工具在内部使用至少一些功能.
我以前从未为不同的CPU架构交叉编译,也不确定如何完全识别我需要做的事情.我正在尝试使用uClibc,因为它似乎在系统的其余部分使用,但我不知道如何为调制解调器环境配置buildroot.我根据来自下面的proc的信息最好地猜测了配置应该是什么,但有些错误,因为一个简单的C应用程序只返回0编译后它无法正常运行.
# cat /proc/version
Linux version 2.4.17_mvl21-malta-mips_fp_le (root@localhost.localdomain) (gcc version 2.95.3 20010315 (release/MontaVista)) #1 Thu Apr 21 18:04:37 PDT 2005
# cat /proc/cpuinfo
processor : 0
cpu model : MIPS 4KEc V4.8
BogoMIPS : 149.91
wait instruction : no
microsecond timers : yes
extra interrupt vector : yes
hardware watchpoint : yes
VCED exceptions : not available
VCEI exceptions : not available
Run Code Online (Sandbox Code Playgroud) 看起来很简单,但我认为我的程序不会编译,因为我覆盖了$ v0寄存器?提前致谢
更新:没关系得到它,当我打印系统调用打印总和时我的订单错了...修复以防万一需要参考.
.data
prompt1: .asciiz "\n\n Enter the first integer please:"
prompt2: .asciiz "Enter the second integer please:"
result: .asciiz "The result is:"
.text
main:
#t0-to hold first integer
#t1-to hold second integer
#t2- used to hold the sum of t$1 and t$2
#first number
li $v0, 4 #syscall to print string
la $a0, prompt1 #address of string to print
syscall
li $v0, 5 #syscall to read an integer
syscall
move $t0, $v0 #move the number to read into …Run Code Online (Sandbox Code Playgroud) 给定两个寄存器$s0,$s1如何仅使用slt(在小于时设置)beq和bne(如果相等则为分支,如果不相等的分支)指令将以下伪代码转换为MIPS汇编语言.
if ($s0 > $s1) { goto label1 }
if ($s0 >= $s1) { goto label2 }
if ($s0 <= $s1) { go to label3 }
Run Code Online (Sandbox Code Playgroud) 我对MIPS汇编语言很陌生,目前正在上一个关于MIPS编码的计算机体系结构课程.我以前学过其他几种高级编程语言(C,C#,Python),因此在编程方面有一些基础.
我的问题在这里特别问:MIPS如何为堆栈中的数组分配内存?我希望回答这个问题有望让我更好地理解MIPS,因为我仍然在概念化MIPS语言及其架构的概念.我不太明白指针在这方面是如何工作的......
如果有人可以花时间帮助这个迷茫的学生,那将是辉煌的!:)
我正在尝试为我拥有的一个小型嵌入式设备编译几个程序.它是Little-endian MIPS(mipsel)处理器.我通过telnet和内置的ftp客户端从中检索了这个可执行文件:
root@debian-mipsel:/home/user/wansview/devel# readelf -h unzip1
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: MIPS R3000
Version: 0x1
Entry point address: 0x401cc0
Start of program headers: 52 (bytes into file)
Start of section headers: 169960 (bytes into file)
Flags: 0x10001007, noreorder, pic, cpic, o32, mips2
Size …Run Code Online (Sandbox Code Playgroud)