C 到 MIPS - 函数和数组

2024-04-08

我正在尝试将以下 C 代码转换为 MIPS 程序集。

数组的基地址存储在$a0中。变量索引存储在$a1中。变量 x 存储在 $t0 中。

void ld_array(char array[], int index) {
  x = array[index];
}

当索引是一个定义的整数(例如:5)时,我已经完成了

lbu $t0, 5($a0) 

然而,lbu $t0, $a1($a0)是不正确的语法。


您可以使用指针算术来计算您尝试访问的数据的地址。

array[index]相当于*(array+index)。您可以使用 mips 执行相同的操作addu操作说明。

假设$a0是数组指针并且$a1是您可以使用的索引:

addu $t0, $a0, $a1 # tmp = array+index
lbu  $t0, ($t0)    # x = *tmp

我们正在使用addu因为它是一个无符号操作,因为指针是无符号字。这意味着它不会触发溢出异常。

假设您的数组是单词数组,您将使用相同的方法,但首先将索引乘以 4(因为 32 位中的单词长度为 4 个字节)。

sll  $t0, $a1, 2   # index << 2 = index * 4
addu $t0, $a0, $t0 # tmp = array+index
lw   $t0, ($t0)    # x = array[index]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 到 MIPS - 函数和数组 的相关文章

  • MIPS - 实现二叉搜索树

    作为我们的术语项目 我们正在实现一个二叉搜索树 其背后的想法如下 假设 bst 有 3 个节点 10 8 14 其地址表示如下 值 左节点地址 右节点地址 根节点地址 t 400 8 0 0 620
  • sra(算术右移)与 srl(逻辑右移)

    请看一下这两段伪汇编代码 1 li t0 53 sll t1 t0 2 srl t2 t0 2 sra t3 t0 2 print t1 print t2 print t3 2 li t0 53 sll t1 t0 2 srl t2 t0
  • 加载词和移动之间的区别?

    有什么区别 ldw r8 0 r4 and mov r8 r4 Load word 说 从内存复制 但是当 load word 从 r4 复制时 它是从寄存器复制而不是从内存复制 对吧 The lw instruction I assume
  • 为什么MIPS汇编器有多个寄存器用于返回值?

    我刚刚开始学习MIPS汇编程序并意识到有两个寄存器 http en wikipedia org wiki MIPS architecture Compiler register usage用于返回值 首先 我认为它的实现是因为有些语言可能返
  • MIPS 32位架构:如何在同一时钟周期内读取和写入寄存器文件中的寄存器?

    我的计算机体系结构书籍解释了这一点 由于对寄存器文件的写入是边沿触发的 因此我们的设计可以 在一个时钟周期内合法地读写同一个寄存器 read 将得到在较早的时钟周期写入的值 而 写入的值将可在后续时钟周期中读取 这是有道理的 我有点明白寄存
  • Android SDK 管理器中的 MIPS 系统映像是什么?

    对于每个 SDK 我都有一个安装解决方案MIPS system image 它是什么 它有什么作用以及何时有人使用它 如果我不安装它会发生什么 它是什么 它是一个模拟器映像 可模拟具有 MIPS CPU 而不是 ARM 或 x86 CPU
  • 简单的 MIPS 汇编 - 返回斐波那契数

    我正在尝试创建一个简单的汇编代码 它接受输入 N 并返回第 N 个斐波那契数 例如 如果您输入 2 它应该输出 1 如果您输入 3 它应该输出 2 我的代码不会抛出任何错误 但是在输入数字后它会返回一些奇怪的东西 如果输入 1 则返回 26
  • 如果小于则 MIPS 汇编分支

    我一直在开发一个非常基本的 MIPS 程序 用于计算门票销售的一些内容 我已经实现了所有功能 但是当我执行 IF 语句 blt gt 如果小于则分支 时 我遇到了一些错误 我将以下数据存储在临时寄存器中 t0 of VIP tickets
  • 用 MIPS 汇编语言读取和打印整数

    我的程序应该读取一个整数并将其打印回给用户 但每次它都只打印 268501230 无论输入什么 我该如何修复它 data prompt2 asciiz Please enter value array1 space 40 array2 sp
  • 提示用户输入汇编 ci20 seg 错误

    我目前正在 ci20 机器上开发一个小程序 提示用户输入整数值 然后将该值打印到屏幕上 我当前的代码 data prompt asciiz Please enter an integer message asciiz nValue ente
  • MIPS 汇编:从整数转换为十六进制

    我发现这个代码片段我认为可以将整数转换为十六进制 然而 我根本不遵循它 我添加了一些评论 说明了我认为正在发生的事情 但我不知道为什么要这样做 那么 假设我正确地注意到每行正在做什么 有人可以向我解释为什么要这样做吗 至于它如何以任何方式帮
  • 如何从字符串输入中删除逗号

    我正在开发一个使用 MIPS 本机指令的程序 该程序将允许用户输入三个十进制数字作为空终止字符串 每个数字不能超过六位数字 如果用户输入逗号 例如 123 456 则从内存中删除逗号 第一个数字存储在内存地址 0x10000000 中 第二
  • MIPS 浮点:swc1 与 s.s

    我正在做一些涉及的工作MIPS汇编 我不断遇到这四个浮点加载 存储伪指令 l s l d s s s d 我在网上找到了一些文档 发现有四个 实际 指令似乎可以做同样的事情 lwc1 ldc1 swc1 and sdc1 我唯一的问题是 有
  • 如何在 mips 汇编中迭代字符串

    所以我现在正在做一个项目 我们必须接受一个字符串并将其转换为所有大写字母 然后如果 toUpper 或 toLower 字节不是 0 则转换为小写字母 现在我仍在处理大写字母部分 猜测小写字母几乎相同 但是当我遍历字符串查找大写字母时或者当
  • 提示用户输入汇编 ci20 seg 错误

    我目前正在 ci20 机器上开发一个小程序 提示用户输入整数值 然后将该值打印到屏幕上 我当前的代码 data prompt asciiz Please enter an integer message asciiz nValue ente
  • 结构中的位是否得到保证

    我有一个与结构位字段相关的问题 请参阅下文 因为我对应该使用哪些关键字来最好地描述我的问题有点无能为力 背景 我正在为 MIPS R3000A 汇编指令编写一个反汇编程序 该指令在 2000 年初用于 Playstation 程序 问题 我
  • 如何在 OS161 中添加 open 系统调用的两个变体?

    从手册页OS161 Synopsis include
  • 如何关闭MIPS-GCC自动指令重排序?

    继这个问题之后 使用跳转 和链接 指令的奇怪 MIPS 汇编器行为 https stackoverflow com questions 3807480 weird mips assembler behavior with jump and
  • 计算数字的二进制表示形式中 1 的数量的最佳方法。 (MIPS)

    我需要计算二进制数中 1 的数量 比如说 5 所以 00001001 将是 2 或 n 2 我正在使用 MIPS 最好的方法来做到这一点 最好的方法是count them 您可以检查是否设置了最低有效位 a1 by and用一个来代替它 如
  • MIPS 获取地址未在字边界上对齐,使用了 .align 4,仍然无法执行

    有任何想法吗 为什么我得到 0x00400020 处的运行时异常 获取地址未在字边界 0x00000007 上对齐 问题行是 lw s1 0 a1 copy arg2 数组大小 data align 4 added this didnt w

随机推荐