使用 MIPS 进行冒泡排序

2023-11-29

我已经制作了正在进行比较和交换的内部循环,但我在实现将根据元素数量运行的外部循环时遇到困难。

.data
Arr: .word 5, 4, 3, 2, 1

.text
.globl main 
 main:
 la   $a0, Arr      # Pass the base address of the array Arr to input   argument register $a0
addi $a1, $zero, 5 # initialze the value of sorting loop ($al=5)
li   $t1, 0        # initialize the value of outer loop (t1=0)


sort:
lw  $s1, 0($a0)     # Load first element in s1 
lw  $s2, 4($a0)     # Load second element in s2
bgt $s1, $s2, swap  # if (s1 > s2) go to swap


sorting_loop:
addiu $a0, $a0, 4  # move pointer to next element
subiu $a1, $a1, 1  # decrement the value of inner loop ($a1)
bgtz  $a1, sort    # loop till value of inner loop is not equal to zero

j end              

swap:
sw   $s1, 4($a0) # put value of [i+1] in s1
sw   $s2, 0($a0) # put value of [i] in s2
j    sorting_loop

end: # End the program
li $v0, 10
syscall

你的内心传球看起来相当不错,但[我认为]它已经过了终点4($a0)(例如,对于 5 个数组,循环计数必须为 4)。我已经解决了这个问题。

我已经添加了外循环。请原谅无端的风格清理,但这是我在添加之前理解你的逻辑的方式。我重命名了你们的一些标签,这样它们对我来说更有意义。

当我添加外部循环时,我将内部循环转换为外部循环调用的函数[这样看起来更干净]。

我添加了两个优化:减少传递计数和“早期逃逸”标志[如果给定的传递不进行交换]。

我还添加了一些注释。该代码可能并不完美,但我认为它会帮助您更接近。

# bubble sort

    .data
Arr:        .word       5,4,3,2,1

    .text
    .globl  main
main:
    li      $t1,5                   # get total number of array elements

# main_loop -- do multiple passes through array
main_loop:
    subi    $a1,$t1,1               # get count for this pass (must be one less)
    blez    $a1,main_done           # are we done? if yes, fly

    la      $a0,Arr                 # get address of array
    li      $t2,0                   # clear the "did swap" flag

    jal     pass_loop               # do a single sort pass

    # NOTES:
    # (1) if we make no swaps on a given pass, everything is in sort and we
    #     can stop
    # (2) after a pass the last element is now highest, so there is no need
    #     to compare it again
    # (3) a standard optimization is that each subsequent pass shortens the
    #     pass count by 1
    # (4) by bumping down the outer loop count here, this serves both _us_ and
    #     the single pass routine [with a single register]

    beqz    $t2,main_done           # if no swaps on current pass, we are done

    subi    $t1,$t1,1               # bump down number of remaining passes
    b       main_loop

# everything is sorted
# do whatever with the sorted data ...
main_done:
    j       end                     # terminate program

# pass_loop -- do single pass through array
#   a0 -- address of array
#   a1 -- number of loops to perform (must be one less than array size because
#         of the 4($a0) below)
pass_loop:
    lw      $s1,0($a0)              # Load first element in s1
    lw      $s2,4($a0)              # Load second element in s2
    bgt     $s1,$s2,pass_swap       # if (s1 > s2) swap elements

pass_next:
    addiu   $a0,$a0,4               # move pointer to next element
    subiu   $a1,$a1,1               # decrement number of loops remaining
    bgtz    $a1,pass_loop           # swap pass done? if no, loop
    jr      $ra                     # yes, return

pass_swap:
    sw      $s1,4($a0)              # put value of [i+1] in s1
    sw      $s2,0($a0)              # put value of [i] in s2
    li      $t2,1                   # tell main loop that we did a swap
    j       pass_next

# End the program
end:
    li      $v0,10
    syscall
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 MIPS 进行冒泡排序 的相关文章

  • 使用 ACPI 在 MS-DOS 中关闭计算机

    我在基于 Pentium 的计算机上运行 MS DOS 6 22 主板支持 ACPI 并且想知道是否有一个可以用来关闭计算机的汇编语言例程 或者它是否比那个更难 即主板 具体的 基本上 我想创建一个小程序来从命令行关闭计算机 这是专门为此编
  • 为什么 LED 保持亮起而不是闪烁?

    这是使用 pic16f676 中的 TIMER0 中断使 LED 闪烁的 MPASM 代码 端口 A 的引脚 0 RA0 未切换至关闭位置 请帮忙 我是图片组装的新手 我想掌握图片 有没有高手帮我学习一下 我需要以 1 秒的间隔眨眼 代码是
  • 错误:无法识别的指令 [ORG]

    我试图编写一个引导加载程序以在 dos box 中使用 我写了下面的代码 BITS 16 tell the assembler that its a 16 bit code ORG 0x7C00 Origin tell the assemb
  • 测试 xmm/ymm 寄存器是否为零的更快方法?

    It s fortunate that PTEST does not affect the carry flag but only sets the rather awkward ZF also affects both CF and ZF
  • 如何在 AVX/AVX2 中递增向量

    我想使用内在函数来增加 SIMD 向量的元素 最简单的方法似乎是为每个元素加 1 如下所示 note vec inc之前已设置为1 vec mm256 add epi16 vec vec inc 但是是否有任何特殊指令来增加向量 类似于in
  • 在共享库中不使用 PLT 的情况下调用另一个目标文件中的函数?

    我有两个汇编代码 code1 s and code2 s我想从这两个构建一个可重定位 使用 fPIC 开关 共享库 I want code2 s调用一个函数 名为myfun1 其定义在code1 s 当我使用call myfun1 PLT
  • 微软怎么能说WinAPI中一个字的大小是16位呢?

    我刚刚开始学习WinAPI 在MSDN中 对WORD数据类型提供了以下解释 WORD16 位无符号整数 范围是十进制 0 到 65535 该类型在 WinDef h 中声明如下 typedef 无符号短 WORD 很简单 而且它与我一直在使
  • 如何阅读英特尔操作码符号

    我正在阅读一些引用的材料Intel vol 2 SDM x86 手册 https www intel com content www us en developer articles technical intel sdm html关于汇编
  • ARM 汇编:从 STDIN 获取字符串

    我目前正在学习 CS 课程 我们刚刚开始在 Raspberry Pi 上使用 ARM Assembly 事实证明这相当困难 想知道是否有人可以提供帮助 我当前的任务是从 stdin 获取一个字符串 使用 scanf 并计算其中的字符数 然后
  • 内联执行生成的汇编程序

    我正在阅读以下演示文稿 http wingolog org pub qc 2012 js slides pdf http wingolog org pub qc 2012 js slides pdf其中讨论了 4 10 19 内联 ASM
  • 电路解码所需的最小输入位数

    我正在学习计算机体系结构 并且正在阅读有关编码器和解码器的内容 在 MIPS 处理器中 操作码有 6 位 我想知道构建解码器来解码操作码需要多少输入位 我知道解码器是一个组合电路 它将二进制信息从 n 个输入线转换为最多 2 n 个唯一的输
  • 在 AT&T x86 程序集中查找转义字符

    问题一 我有以下汇编代码 其目的是循环输入字符串 并计算它遇到的转义字符 的数量 globl sprinter data escape string string num escape long 0 num characters long
  • 将 C 函数与 ARM 汇编结合使用

    我见过人们在代码中使用 C 库中的 printf 的示例 如下所示 data balign 4 hello asciz Hello n text global main func main main ldr r0 hello msg bl
  • 如何在 Linux 中制作一个将文件转换为大写的 x86 汇编程序?

    我找到了一个名为 ProgrammingGroundUp 1 0 booksize pdf 的 pdf 文件 其中一个项目是制作一个汇编程序 该程序接收文件并将其转换为大写 section data CONSTANTS system cal
  • 编写一个新的 jit

    我有兴趣用 C 启动我自己的 JIT 项目 我对汇编或编译器设计等并不熟悉 但是 我对生成的机器代码格式非常不熟悉 比如 当一切都说了和完成后 mov 指令实际上是什么样子 是时候调用它了函数指针 那么 创建这样的东西的最佳资源是什么 编辑
  • 0 和双字 0 有什么区别?

    正如问题所述 有什么区别 例如 mov eax 0 and mov eax dword 0 我一直在使用 cmp 语句 但我无法理解其中的区别 一个是地址 另一个是数值 如前所述 MOV 指令没有区别 对于 CMP 您将有以下区别 qwor
  • C 结构如何返回[重复]

    这个问题在这里已经有答案了 我想知道如何返回一个结构 例如 typedef struct number uint64 t a b c d number number get number number res 0 0 0 0 return
  • 16位汇编:无法取消引用某些寄存器[重复]

    这个问题在这里已经有答案了 我正在尝试以下 Intel 16 位指令 mov si word reg where reg是一些寄存器 它编译得很好 如果reg is bx 但当它是ax cx or dx 我使用 NASM 作为我的汇编器 我
  • 本机代码、机器代码和汇编代码有什么区别?

    我对 NET 语言上下文中的机器代码和本机代码感到困惑 它们之间有什么区别 它们是一样的吗 这些术语确实有点令人困惑 因为它们有时使用不一致 机器代码 这是定义最明确的一种 它是使用字节码指令的代码 您的处理器 执行实际工作的物理金属部件
  • 两个 16 位数字相乘 - 为什么结果是 32 位长? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如果我将两个 16 位数字相乘 结果将是 32 位长 但为什么会这样呢 对此有何明确解释 为了我的正确理解 其计算方法是 n 位数字乘以

随机推荐

  • 如何从文本文件中读取逗号分隔值,然后将结果输出到文本文件? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我需要创建一个程序 添加从文本文件中读取的数字 并用逗号分隔 IE in file txt 1 2 3 4 5 6 7 8 9 到目前为止我有简单的代码 x 1 y 2 z 3 su
  • 获取第一个包含数字的单词

    任何人都可以帮助我如何找到第一个包含数字的完整单词 我有一个地址 例如 procedure TForm1 Button4Click Sender TObject var SourceString String strArray TArray
  • 使用 CASE 和 GROUP BY 进行数据透视的动态替代方案

    我有一个看起来像这样的表 id feh bar 1 10 A 2 20 A 3 3 B 4 4 B 5 5 C 6 6 D 7 7 D 8 8 D 我希望它看起来像这样 bar val1 val2 val3 A 10 20 B 3 4 C
  • .NET 中的 PDF 阅读器

    我想从我的 net 应用程序读取 PDF 文件 有没有免费的库可以做到这一点 如果您正在寻找免费的 PDF 读 写 Net 库 那么您可以访问 https itextpdf com 以前为 itextsharp 注意 正如 Dexters
  • Javascript中什么时候使用addEventListener会累积?

    我已经在SO上看到了这个问题 JavaScript 删除事件监听器 我明白它的作用 但不知道为什么addEventListener有的时候会累积超时 有的时候却不会 我对代码的理解是 只有当 addEventListeners 嵌套在另一个
  • SpringWebMvcTest - 使用 @Valid 和自定义验证测试 Requestbody

    我正在尝试测试我的控制器端点和我的请求体注释 Valid注解 我的测试类如下所示 RunWith SpringRunner class WebMvcTest value BalanceInquiryController class secu
  • AWS Cloudformation 使用 Fn::Join 在文件中输出双引号

    经过大量研究和挫折后 我并没有完全得到我所希望的输出 例如 所需的输出到文件中 accessKeyId UIIUHO SOMEKEY SHPIUIUHIU 但我得到的是 accessKeyId UIIUHO SOMEKEY SHPIUIUH
  • 如何将 google app-engine 应用程序与我的 android 连接?

    我在谷歌应用程序引擎上部署了一个应用程序 它有一个注册表单 现在我已经在我的android应用程序中制作了一个注册表单 我希望单击提交 它应该发送到谷歌应用程序引擎上的应用程序 并且应该保留在特定的数据库中 有人告诉我使用 http 请求和
  • 抑制 matplotlib 中的输出[重复]

    这个问题在这里已经有答案了 这就是我正在策划的方式 from matplotlib import pyplot pyplot figure pyplot scatter x data feat y data target pyplot xl
  • Javascript - 反转句子中的单词

    请参考 https jsfiddle net jy5p509c var a who all are coming to the party and merry around in somewhere res resarr for i 0 i
  • Box2d libgdx,对像素到米的东西有点困惑

    所以我理解这个概念 这个想法是 box2d 或多或少以米为单位 因此您需要进行从像素到它的转换 说得通 我正在关注 box2d 的教程 简介here 它提到进行转换并为您提供了一些可供使用的示例金额 现在 这一切都很好 但我发现当我使用这些
  • Sonar Runner 在处理 Visual Studio 的 MSTest 生成的 .coveragexml 文件期间出错

    我正在尝试处理从命令行使用 MSTest 后获得的 coveragexml 文件 转换 coverage 文件后 但 Sonar Runner 在尝试解析该文件时不断失败 这些错误包括解析错误 例如意外的 以及无法在文件中找到标签 我尝试了
  • += new EventHandler(Method) 与 += Method [重复]

    这个问题在这里已经有答案了 可能的重复 C anEvent 和 new EventHandler anEvent 之间的区别 订阅事件有两种基本方法 SomeEvent new EventHandler
  • 无法弄清楚“警告:不兼容的 Objective-C 类型”

    我有一个 NSObject 的子类 它实现了 id initWithRootElement MyElement e方法 NSXMLDocument 有一个相同的方法 它采用 NSXMLElement 当我编译时 我收到以下警告 warnin
  • 如何对单个文件实施密码保护?

    我正在编写一个小型桌面应用程序 它应该能够加密数据文件并使用密码保护它 即必须输入正确的密码才能解密 我希望加密的数据文件是独立且可移植的 因此身份验证必须嵌入到文件中 或者我是这么认为的 根据我所知 我有一个看起来可行且合乎逻辑的策略 这
  • 如何使用 ngModel 在 angularjs 指令中手动重新运行格式化程序链?

    Angular js ngModel 能够声明一系列parsers and 格式化程序 更多详细信息可以在以下位置找到 如何在 angular js 中进行双向过滤 的很好答案 现在 仅当 ngModel 更新时 格 式化程序链才会运行 因
  • 在嵌套字典中搜索键[重复]

    这个问题在这里已经有答案了 我在 Python 中有一个 JSON 对象 表示为嵌套的字典列表 字典的某些值就是字典本身 等等 我希望能够在此嵌套字典结构的所有分支上搜索键 当我找到密钥时 我希望能够返回通向该密钥的完整密钥路径 例如 我正
  • 尝试添加 CSS 子子菜单

    我想让您知道 在开始之前 我一直在查看所有子菜单问题 但没有看到任何可以帮助我已经布置的代码的内容 我感谢任何人能给我的任何帮助 所以 我试图添加一个子菜单 我想我已经弄清楚了 但我认为我不太明白如何让子组合器工作 如果你能具体看一下这部分
  • Android:标题栏颜色不变

    我想更改我的应用程序标题栏颜色并尝试以下方式 清单文件的一部分
  • 使用 MIPS 进行冒泡排序

    我已经制作了正在进行比较和交换的内部循环 但我在实现将根据元素数量运行的外部循环时遇到困难 data Arr word 5 4 3 2 1 text globl main main la a0 Arr Pass the base addre