标签: mips32

libc如何工作?

我正在编写一个MIPS32仿真器,并希望在使用gcc编译C程序时可以使用整个标准C库(可能使用GNU扩展).

据我所知,I/O由MIPS32架构上的系统调用处理.要使用libc/glibc成功运行程序,如何判断我需要模拟哪些系统调用?(没有反复试验)

编辑:请参阅示例,了解syscalls的含义.

(如果您有兴趣,可以在这里查看项目,欢迎任何反馈.请记住,它处于非常早期的阶段)

c c++ emulation libc mips32

2
推荐指数
1
解决办法
1031
查看次数

.space在mips中有什么作用?

我遇到了一个分配问题,在该分配中,我们已将这些数字放入数组中,并在不使用循环的情况下将它们添加了。我已经解决了这个问题,但是.space使我感到困惑。通过设置.space 20,我可以为5个单词腾出空间还是在做其他事情。

 .data
  array: .space 20
 .text
addi $s0, $zero, 2
addi $s1, $zero, 12
addi $s2, $zero, -5
addi $s3, $zero, 7
addi $s4, $zero, 4
  addi $t0, $zero,0  #index initialized at 0
sw $s0,array($t0) 
addi $t0, $t0, 4
sw $s1,array($t0) 
addi $t0, $t0, 4
sw $s2,array($t0) 
addi $t0, $t0, 4
sw $s3,array($t0) 
addi $t0, $t0, 4
sw $s4,array($t0) 
addi $t0, $t0, 4
Run Code Online (Sandbox Code Playgroud)

arrays assembly mips mips32

1
推荐指数
1
解决办法
2万
查看次数

MIPS 如何存储大于 32 位的数字?

我一直在寻找这个问题的答案,但找不到明确的答案。它是在多个寄存器之间分配数字还是不能简单地处理它?我尝试用 MARS 测试它并使用数字 4294967296,即 0x100000000,但寄存器仅保存了 0x00000000,因此省略了“1”位。有没有办法处理这样的数字?

memory assembly mips bigint mips32

1
推荐指数
1
解决办法
3709
查看次数

关于否定 mips 中的符号整数?

我正在考虑如何否定 mips32 中的有符号整数。我的直觉是使用 2 的补码的定义,例如:(假设$s0是要否定的数字)

nor $t0, $s0, $s0   ; 1's complement
addiu $t0, $t0, 1   ; 2's = 1's + 1
Run Code Online (Sandbox Code Playgroud)

然后我意识到可以这样做:

sub $t0, $zero, $s0
Run Code Online (Sandbox Code Playgroud)

所以……有什么区别?哪个更快?IIRC sub 会尝试检测溢出,但是这个 make 会更慢吗?最后,有没有其他方法可以做到这一点?

assembly mips cpu-architecture micro-optimization mips32

1
推荐指数
1
解决办法
3143
查看次数

MIPS 日航转换

我很难理解如何在 MIPS 中翻译 JAL(J-Type)指令。这是我正在处理的指令集:

0x00400018          add  $a0, $a3, $0 = 00E02020
0x0040001C          jal  L2
0x00400020  L1:     jr   $ra
0x00400024  L2:     sw   $s1, 0($s2)
0x00400028          bne  $a0, $0, ELSE
0x0040002C          j    L1
0x00400030  ELSE:   addi $a0, $a0, A2 
0x00400034          j    L2
Run Code Online (Sandbox Code Playgroud)

第一行没有问题,但对于第二行,我完全不确定如何翻译 jal L2。使用MIPS 参考表,我看到要获取地址,我需要执行 R[31]=PC+8;PC=JumpAddr。

J 型指令是操作码/6 位和地址 26 位,因此前 6 位是 00 0011,但我不知道如何获得剩余的 26 位。任何帮助,将不胜感激。

assembly mips mips32

0
推荐指数
1
解决办法
4511
查看次数

使用 mips 组件检查回文

.data

org_str: .space 256
rev_str: .space 256
str: .asciiz "Enter the Line: "
pal: .asciiz "palindrome"
not_pali: .asciiz "Not palindrome"

.text 
.globl main
main:
    
    
    li $v0, 4
    la $a0, str
    syscall
    
    # Taking String from the user
    li $v0, 8
    la $a0, org_str
    li $a1, 256
    syscall
    
    # Initilize $t0 and $t2
    li  $t0, 0
    li  $t1, 0
    
loop_len:
    add $t1, $a0, $t0
    lb  $t2, 0($t1) # Load the data in the byte in $t2
    beqz    $t2, len_exit   # Loop …
Run Code Online (Sandbox Code Playgroud)

assembly mips mips32

0
推荐指数
1
解决办法
123
查看次数

您能给我一些关于如何有效设计汇编语言程序的指导吗?

我是一名大学计算机科学学生,我应该为考试开发一个 MIPS 汇编语言程序,但我确实很难设计它,特别是在分配寄存器、遵循调用约定、将寄存器保存在堆栈...这一切似乎很快变得非常混乱和难以承受,我迷失了方向!

至少在概念上,我不难找出解决特定问题的算法。它更多地与项目的大局、整体结构和设计有关。

鉴于此,您能否指出一种模式,提供一些技巧或最佳实践,以在实际编写代码之前对所有内容进行排序,以便我不会在这个过程中迷失自己?

software-design mips mips32

0
推荐指数
1
解决办法
264
查看次数

MIPS-32 操作码格式:大写还是小写?

我目前正在学习计算机组织课程,并且一直在研究 MIPS-32 架构。我注意到我们使用的书列出的操作码全部为小写,而教授列出的操作码全部为大写。我在不同的网站上查找了这一点,发现有些网站的操作码全部为大写,而其他网站的操作码全部为小写。我在堆栈溢出上查找了类似的问题,但没有找到。

例如,要添加,我们可以这样:

ADD $s2, $s1, $s0
Run Code Online (Sandbox Code Playgroud)

但是,其他网站和本书将其描述为:

add $s2, $s1, $s0
Run Code Online (Sandbox Code Playgroud)

谁能澄清哪种操作码格式更传统?我还没有构建汇编语言程序,所以我不确定操作码是否区分大小写;他们是吗?

注:我使用的书是David A. Patterson 和 John L. Hennessy 编写的《Computer Organization and Design MIPS Edition: The Hardware/Software Interface》。

assembly mips opcode mips32

-1
推荐指数
1
解决办法
600
查看次数

如何将涉及数组的高级语言语句转换为MIPS 32位?

这是高级函数:J[6] = K[d-e]

d = $t0,e = $t1,J = $s1,K = $s2,最终结果放入$s4

到目前为止我有:

lw $t2, 24($s1) #Load J[6] into $t2
sub $t3, $t0, $t1 #Subtract e from d to $t3
Run Code Online (Sandbox Code Playgroud)

我知道我不能做的是lw $t4, $t3($s2)但我不知道如何翻译 K[$t0 - $t1]。

arrays assembly mips mips32

-2
推荐指数
1
解决办法
227
查看次数