我遇到了一个分配问题,在该分配中,我们已将这些数字放入数组中,并在不使用循环的情况下将它们添加了。我已经解决了这个问题,但是.space使我感到困惑。通过设置.space 20,我可以为5个单词腾出空间还是在做其他事情。
Run Code Online (Sandbox Code Playgroud).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
我一直在寻找这个问题的答案,但找不到明确的答案。它是在多个寄存器之间分配数字还是不能简单地处理它?我尝试用 MARS 测试它并使用数字 4294967296,即 0x100000000,但寄存器仅保存了 0x00000000,因此省略了“1”位。有没有办法处理这样的数字?
我正在考虑如何否定 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 会更慢吗?最后,有没有其他方法可以做到这一点?
我很难理解如何在 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 位。任何帮助,将不胜感激。
.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) 我是一名大学计算机科学学生,我应该为考试开发一个 MIPS 汇编语言程序,但我确实很难设计它,特别是在分配寄存器、遵循调用约定、将寄存器保存在堆栈...这一切似乎很快变得非常混乱和难以承受,我迷失了方向!
至少在概念上,我不难找出解决特定问题的算法。它更多地与项目的大局、整体结构和设计有关。
鉴于此,您能否指出一种模式,提供一些技巧或最佳实践,以在实际编写代码之前对所有内容进行排序,以便我不会在这个过程中迷失自己?
我目前正在学习计算机组织课程,并且一直在研究 MIPS-32 架构。我注意到我们使用的书列出的操作码全部为小写,而教授列出的操作码全部为大写。我在不同的网站上查找了这一点,发现有些网站的操作码全部为大写,而其他网站的操作码全部为小写。我在堆栈溢出上查找了类似的问题,但没有找到。
例如,要添加,我们可以这样:
ADD $s2, $s1, $s0
Run Code Online (Sandbox Code Playgroud)
但是,其他网站和本书将其描述为:
add $s2, $s1, $s0
Run Code Online (Sandbox Code Playgroud)
谁能澄清哪种操作码格式更传统?我还没有构建汇编语言程序,所以我不确定操作码是否区分大小写;他们是吗?
这是高级函数: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]。