- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的代码,我无法获得正确的输出。我哪里错了?我最初将 min 设置为零,然后检查数组是否小于或等于该值,如果是,则跳转到标签并使 min 的值成为数组的值,然后跳回迭代数组。
xyz: .word -8, 16, -32, 64, -128, 256
# int main(void)
#
# local variable register
# int *p $s0
# int *end $s1
# int min $s2
# int total $s3
#
.text
.globl main
main:
la $s0, xyz # p = foo
addi $s1, $s0, 24 # end = p + 6
add $s3, $zero, $zero # total = 0
add $s2, $zero, $zero # min = 0
L1:
beq $s0, $s1, L2 # if (p == end) goto L2
lw $t0, ($s0) # $t0 = *p
lw $t1, ($s2) # $t1 = min
slt $t2, $t1, $t0 # check if min is less than p
add $s3, $s3, $t0 # total += $t0
bne $t2, $zero, L3 # if min is less than p, go to L3
addi $s0, $s0, 4 # p++
j L1
L2:
add $v0, $zero, $zero # return value from main = 0
jr $ra
L3:
move $s2, $t0
j L1
最佳答案
好的,我发现了几个错误。我创建了三个版本,并添加了输出系统调用,以便您可以看到结果[请原谅无偿的风格清理]:
<小时/>这是您的原始代码,其中包含错误注释:
.data
xyz: .word -8,16,-32,64,-128,256
# int main(void)
#
# local variable register
# int *p $s0
# int *end $s1
# int min $s2
# int total $s3
#
.text
.globl main
main:
la $s0,xyz # p = foo
addi $s1,$s0,24 # end = p + 6
add $s3,$zero,$zero # total = 0
# NOTE/BUG: to find minimum, you want to init this to the first array
# element
# also, initializing with a minimum value (e.g. 0), or more correctly, the
# largest possible negative number (e.g. 0x80000000) implies a search for
# maximum
add $s2,$zero,$zero # min = 0
L1:
beq $s0,$s1,L2 # if (p == end) goto L2
lw $t0,($s0) # $t0 = *p
# NOTE/BUG: s2 is a register variable that contains "min" (e.g. int min)
# and is _not_ a pointer to a "min" variable in memory (e.g. int *min)
lw $t1,($s2) # $t1 = min
# NOTE/BUG: the the check should be reversed:
slt $t2,$t1,$t0 # check if min is less than p
add $s3,$s3,$t0 # total += $t0
bne $t2,$zero,L3 # if min is less than p, go to L3
# NOTE/BUG: this pointer increment is out of place (i.e. it does not
# get incremented if there is a jump to L3)
# this won't affect the min value, but it will double count the value in
# the total
addi $s0,$s0,4 # p++
j L1
L2:
add $v0,$zero,$zero # return value from main = 0
jr $ra
L3:
move $s2,$t0
j L1
<小时/>
这是一个固定版本:
.data
xyz: .word -8,16,-32,64,-128,256
msg_min: .asciiz "min: "
msg_tot: .asciiz " total: "
msg_nl: .asciiz "\n"
# int main(void)
#
# local variable register
# int *p $s0
# int *end $s1
# int min $s2
# int total $s3
#
.text
.globl main
main:
la $s0,xyz # p = foo
addi $s1,$s0,24 # end = p + 6
add $s3,$zero,$zero # total = 0
lw $s2,0($s0) # min = xyz[0]
L1:
beq $s0,$s1,L2 # if (p == end) goto L2
lw $t0,0($s0) # $t0 = *p
addi $s0,$s0,4 # p++
add $s3,$s3,$t0 # total += $t0
slt $t2,$t0,$s2 # *p < min?
bne $t2,$zero,L3 # yes, fly
j L1
L2:
li $v0,4
la $a0,msg_min
syscall
li $v0,1
move $a0,$s2 # get min value
syscall
li $v0,4
la $a0,msg_tot
syscall
li $v0,1
move $a0,$s3 # get total value
syscall
li $v0,4
la $a0,msg_nl
syscall
# exit program
li $v0,10
syscall
L3:
move $s2,$t0 # set new/better min value
j L1
<小时/>
这是一个稍微更干净的版本,我颠倒了分支的感觉,并且能够稍微收紧循环。另外,我更改了标签以更好地描述角色/功能:
.data
xyz: .word -8,16,-32,64,-128,256
msg_min: .asciiz "min: "
msg_tot: .asciiz " total: "
msg_nl: .asciiz "\n"
# int main(void)
#
# local variable register
# int *p $s0
# int *end $s1
# int min $s2
# int total $s3
#
.text
.globl main
main:
la $s0,xyz # p = foo
addi $s1,$s0,24 # end = p + 6
add $s3,$zero,$zero # total = 0
lw $s2,0($s0) # min = xyz[0]
main_loop:
beq $s0,$s1,main_done # if (p == end) goto L2
lw $t0,0($s0) # $t0 = *p
addi $s0,$s0,4 # p++
add $s3,$s3,$t0 # total += $t0
slt $t2,$s2,$t0 # *p < min?
bne $t2,$zero,main_loop # no, loop
move $s2,$t0 # set new/better min value
j main_loop
main_done:
li $v0,4
la $a0,msg_min
syscall
li $v0,1
move $a0,$s2 # get min value
syscall
li $v0,4
la $a0,msg_tot
syscall
li $v0,1
move $a0,$s3 # get total value
syscall
li $v0,4
la $a0,msg_nl
syscall
# exit program
li $v0,10
syscall
<小时/>
更新:
thanks that helped a lot, but
lw $t1,($s2)
doesnt work because lw will only work on pointers?
对。请注意您如何使用 s3
来保存 total
。这就是代码如何使用 s2
来保存最小值。我这样做[部分]是因为最上面的评论:
# int min $s2
要使用lw
,最上面的注释应该是:
# int *min $s2
要以原始方式使用 s2
,您需要类似以下内容:
min: .word 0
并且,您需要(在循环开始之前):
la $s2,min
而且,您必须对其进行 lw
和 sw
操作,这只会减慢速度。因此,除了已有的内容之外,您还需要添加一个额外的 lw
和一个额外的 sw
。
mips 有很多寄存器[它的长处]。因此,它可以加快速度以在其中保留自动的函数作用域变量。
但是,为了完整起见,这里有一个允许您使用 lw
的版本。注意额外的内存访问。这很像用 -O0 编译的 C 代码:
.data
min: .word 0
xyz: .word -8,16,-32,64,-128,256
msg_min: .asciiz "min: "
msg_tot: .asciiz " total: "
msg_nl: .asciiz "\n"
# int main(void)
#
# local variable register
# int *p $s0
# int *end $s1
# int *min $s2
# int total $s3
#
.text
.globl main
main:
la $s0,xyz # p = foo
addi $s1,$s0,24 # end = p + 6
add $s3,$zero,$zero # total = 0
la $s2,min # point to min
lw $t4,0($s0) # fetch xyz[0]
sw $t4,0($s2) # store in min
main_loop:
beq $s0,$s1,main_done # if (p == end) goto L2
lw $t0,0($s0) # $t0 = *p
addi $s0,$s0,4 # p++
add $s3,$s3,$t0 # total += $t0
lw $t4,0($s2) # fetch min
slt $t2,$t4,$t0 # *p < min?
bne $t2,$zero,main_loop # no, loop
sw $t0,0($s2) # store new/better min value
j main_loop
main_done:
li $v0,4
la $a0,msg_min
syscall
li $v0,1
lw $a0,0($s2) # get min value
syscall
li $v0,4
la $a0,msg_tot
syscall
li $v0,1
move $a0,$s3 # get total value
syscall
li $v0,4
la $a0,msg_nl
syscall
# exit program
li $v0,10
syscall
关于arrays - 如何在MIPS中找到数组的最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38448771/
我的老师说你可以像这样简单地将一个字符加载到寄存器中: li $s2 "A" li $s1 "0" 除了,当我将我的文件加载到 Qtspim 中时,它一直向我抛出一个语法错误。有谁知道我的老师是否对我
我正在使用二进制 MIPS 指令,我发现 this helpful document .但是,我需要澄清一下:所有分支指令都具有立即值。这是立即值符号扩展吗? 大多数其他立即数是,如果不是,那将意味着
我有一个寄存器($t2),它有一个随机生成的数字,然后我乘以 4。我的问题是,在使用 lw 指令时,是否可以将 $t2 中的值用作偏移量? 最佳答案 在 MIPS 中,您可以使用寄存器、偏移量或两者的
因此,我正在MIPS中构建一个计算器程序,并且试图编写乘法和除法函数。 目前,我像这样在循环中读取整数: li $v0, 5 syscall 然后根据用户要执行的操作最终调用我的函数multi和div
我们目前正在讨论 MIPS 架构。我逐渐了解了计算机体系结构和 MIPS 汇编,这很好。 但是,我尝试用谷歌搜索这个答案,但没有找到合适的答案。我对 ISA 和微架构设计下面的一层感到困惑。 MIPS
我正在研究分支延迟槽。在 spim 上尝试过。 j some j a j b j c j d ori $9, $0, 13 some: a: b: c: d: 令我惊讶的是,它将 9 美元更改
好吧,这个问题更像是一个讨论。我有一个在 VHDL 中实现 pipelined MIPS 处理器的项目。 我完全熟悉流水线的概念,但我从未用 VHDL 实现它。在VHDL 中学习流水线处理器 的实现有
关于带有流水线和转发的 MIPS 架构: add $s0, $t1, $t2 sw $s0, 0($sp) add 指令将在第 3 步(执行操作)准备好结果,但我假设 sw 指令需要第 2 步(指令解
我刚开始学习 MIPS 指令的异常处理程序。 我需要让我的程序有算术溢出异常,以便我可以测试我的异常处理程序。 我有两个数组 A 和 B。数组 A 有十六进制数,数组 B 有整数。 如何通过添加十六进
我正在学习微编程,但对微指令到底是什么感到困惑。我正在使用 MIPS 架构。我的问题如下 例如,我有 ADD 指令,微指令会是什么样子? add指令有多少条微指令。在网上有什么地方可以看到 MIPS
我需要多少档才能正确执行以下指令。我对我所做的事情有点困惑,所以我在这里看到专家的答案。 lw $1,0($2); beq $1,$2,Label; 请注意,检查是否会发生分支将在解码阶段完成。但是源
.data stack: .word 3, 2 .text .globl main main: la $s1, stack #assign stack start
我正在用 MIPS 编写一个回文检查器,我试图让它不区分重音,这样像“ahà”这样的东西也会被认为是一个回文。然而,它看起来并不像小写和大写字母之间有固定值的不区分大小写的场景那么简单。 我问过我的老
我正在尝试向以下内容添加 jal 功能,但我对它的工作原理感到困惑。我知道它将旧的 PC+4 值存储在 $ra 寄存器中,然后将控制权转移到函数,该函数通过 return $ra 传回控制权 但是如何
我正在学习如何执行 MIPS,但我对乘法感到困惑。假设我正在将以下 C 代码转换为 MIPS。 c = b + a*3 a,b,c分别存放在寄存器$s1,$s2,$s3中。我应该如何在 MIPS 中编
我正在为明天的考试而学习,并且我对加载/存储字节主题感到困惑。我有这个例子: 我完全不明白他是怎么得到红色答案的。有人可以帮我解释一下吗? 最佳答案 add $s3, $zero, $zero
我不明白如何翻译标签。任何人都可以给我一个帮助 假设我们有以下代码: loop: add $t2,$t2,$t1 addi $t2,$t2,4 sw $t2,4($s0)
当我阅读 MIPS 架构时,我遇到了影子寄存器,据说它们是通用寄存器的副本。 我无法理解以下内容:何时使用影子寄存器? 最佳答案 MIPS 影子寄存器用于减少处理中断时的寄存器加载/存储开销。分配了影
您好,我想让 hello world 输出用户输入的次数,比如如果他们写了 3 ,那么 hello world 将被打印 3 次。我该怎么做呢?这是我目前正在使用的: .data n:
我正在使用 MARS MIPS 模拟器,我想在我的程序中打印一个换行符。 .data space: .asciiz "\n" .text addi $v0, $zero, 4 # print
我是一名优秀的程序员,十分优秀!