MIPS 左加载字 (LWL) 和右加载字 (LWR) 指令的作用是什么?

2024-02-23

最近我一直在研究 MIPS 指令集,当时我遇到了两个在其他指令集中没有见过的不寻常指令。

我环顾四周,想找到一个关于指令到底做什么的合理解释,但我所能弄清楚的是,它们在某种程度上与未对齐的内存访问有关。

例如,维基百科说 https://en.wikipedia.org/wiki/MIPS_architecture#Loads_and_stores:

MIPS I 要求所有内存访问与其自然字边界对齐,否则会发出异常信号。为了支持有效的未对齐存储器访问,存在以“左”或“右”为后缀的加载/存储字指令。

但没有进一步详细说明这实际上意味着什么。

我能找到的最接近正确解释的是约翰·卢米斯博士的网站 https://johnloomis.org/microchip/pic32/memory/mem3.html:

通过使用一对特殊指令,可以仅在两条指令中加载或存储未对齐的字和双字。对于加载,LWL 指令与 LWR 指令配对。加载指令从对齐字中读取左侧或右侧字节(寄存器的左侧或右侧),并将它们合并到目标寄存器的正确字节中。

但这对我来说似乎仍然只是故事的一半,我很难弄清楚确切的细节。 IE。我正在努力理解哪些地址的哪些字节将被移动到哪里。

So what exactly这些指令有什么用呢?


解释应该可以在anyMIPS手册:LWR将加载right值的部分(最低有效部分),LWL 将加载left part

基本上是为了一个地址ALWL 将加载4 - A % 4寄存器左侧的字节,LWR 将加载剩余的字节A % 4它右侧的字节。例如,如果 A = 1,如下表所示

        ├ A             ┤
... ┃ 0 ┆ 1 ┆ 2 ┆ 3 ┃ 4 ┆ 5 ┆ 6 ┆ 7 ┃ ...

那么第一个字包含我们需要的 3 个字节的值,因此 LWL 会将地址 { 1, 2, 3 } 处的 3 个字节加载到寄存器,然后剩余的字节将用 LWR 加载

事实上,谷歌搜索词的第一个结果“MIPS LWL LWR”给我下面的演示

  • lwr $4, 2($0)# 这是一个虚拟指令,它开始一个字节 2 想要读取从该位置开始的 32 位字。

                Memory                                Register 4
                byte 0, byte 1, byte 2, byte 3        byte 0, byte 1, byte 2, byte 3
    address 4:  4       5       6       7             A       B       C       D       before 
    address 0:  0       1       2       3             A       0       1       2       after
    
  • lwl $4, 2($0)# 这是一个虚拟指令,它开始一个字节 2 想要读取从该位置开始的 32 位字。

                Memory                                Register 4
                byte 0, byte 1, byte 2, byte 3        byte 0, byte 1, byte 2, byte 3
    address 4:  4       5       6       7             A       B       C       D       before 
    address 0:  0       1       2       3             2       3       C       D       after
    

http://db.cs.duke.edu/courses/fall02/cps104/homework/lwswlr.html http://db.cs.duke.edu/courses/fall02/cps104/homework/lwswlr.html


简单来说:

您向“向左加载字”指令提供要加载的未对齐字的最高有效字节的有效地址,它会从封闭字中挑选出正确的字节并将它们合并到目标寄存器的高字节中。

“加载字正确”的工作原理类似:您给它要加载的未对齐字的最低有效字节的有效地址,它从封闭的字中挑选出正确的字节并将它们合并到目标的较低字节中登记。

MIPS R4000,第 6 部分:内存访问(未对齐) https://devblogs.microsoft.com/oldnewthing/20180409-00/?p=98465


这是 中的详细信息MIPS32指令集手册 https://s3-eu-west-1.amazonaws.com/downloads-mips/documents/MD00086-2B-MIPS32BIS-AFP-6.06.pdf


另一张插图来自MIPS IV ISA https://www.cs.cmu.edu/afs/cs/academic/class/15740-f97/public/doc/mips-isa.pdf

See also

  • MIPS® 程序员架构第 II-A 卷:MIPS64® 指令集参考手册 https://s3-eu-west-1.amazonaws.com/downloads-mips/documents/MD00087-2B-MIPS64BIS-AFP-6.06.pdf
  • 在 MIPS 中处理未对齐的数据 http://www.cs.iit.edu/~virgil/cs470/Labs/Lab5.pdf

From MIPS 版本 6 https://en.wikipedia.org/wiki/MIPS_architecture#MIPS32/MIPS64_Release_6并且需要上传和存储来支持未对齐访问,因此删除了 LWL/LWR/SWL/SWR

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

MIPS 左加载字 (LWL) 和右加载字 (LWR) 指令的作用是什么? 的相关文章

  • 自定义键盘中断处理程序

    我正在尝试编写一个简单的程序 将标准键盘中断替换为自定义的键盘中断 以减少变量 但是 如果不调用旧处理程序 它就无法工作 这是我的中断处理程序 handler proc push ax push di dec EF pushf when t
  • 内联汇编 - cdecl 和准备堆栈

    我最近一直在尝试通过使用缓冲区和不同汇编运算符的原始十六进制等效项来实现 C 中的动态函数 为了说明一个简单的跳转 byte buffer new buffer 5 buffer 0xE9 Hex for jump uint buffer
  • 在长模式下更改 GDT 并更新 CS

    我正在编写一个简单的自制 64 位操作系统 通过 UEFI 启动它 这意味着当我的代码开始执行时 它已经处于长模式 并且启用了分页 现在 退出 UEFI 引导服务后 我想用我自己的控制结构替换 UEFI 构建的所有控制结构 成功更改 CR3
  • 如何在汇编程序中使用 C 库?

    我想知道如何用汇编语言编写文本编辑器 但现代操作系统需要 C 库 特别是对于它们的窗口系统 我找到了这个page http pengu1n is programmer com posts 8304 html 这对我有很大帮助 但我想知道是否
  • x86 实模式下的段大小

    我对实模式下段的大小有一个疑问 因为它们不能超过 64K 但可以小于那个 http support microsoft com kb 120069 我的问题是这些段大小和基地址是如何初始化的 就像保护模式下有 GDT 和 LDT 一样 实模
  • 当非特权用户运行 C/asm 程序时,会对 Linux 造成什么危害?

    我一直在考虑一种场景 让用户 可以是任何人 可能有恶意 提交在 Linux PC 我们称之为基准节点 上运行的代码 目标是为单线程例程创建一种自动化基准测试环境 假设一个网站向代理发布了一些代码 该代理将此代码交给基准节点 而基准节点仅与代
  • elf .rel.text 部分中 R_386_32/R_386_PC32 的含义

    为了理解重定位的概念 我编写了一个简单的 chk c 程序 如下所示 1 include
  • gcc 编译器开关 (-mavx -mavx2 -mavx512f) 到底有什么作用?

    我在 C C 代码中明确使用了英特尔 SIMD 内在扩展 为了编译代码 我需要在命令行上指定 mavx mavx512 或类似的内容 我对这一切都很满意 然而 从阅读 gcc 手册页来看 并不清楚这些命令行标志是否也告诉 gcc 编译器尝试
  • 缓存行对齐(需要文章澄清)

    我最近在我的应用程序中遇到了我认为是错误共享的问题 我查了一下关于如何将我的数据与缓存行对齐 他建议使用以下 C 代码 C using C 0x alignment syntax template
  • 使用 gdb 调试反汇编库

    在Linux和Mac OS X中可以使用strapi和next来调试应用程序而无需调试信息 在 Mac OS X 上 gdb 显示在库内部调用的函数 尽管有时会在每个 stepi 指令中推进多个汇编程序指令 在 Linux 上 当我进入动态
  • 在汇编中显示两位数? [复制]

    这个问题在这里已经有答案了 我对汇编编程完全陌生 在课堂作业的示例中 需要将两个数字相加并显示总和 我发现神秘的是当其是两位数时显示总和 这是我的代码 mov al num1 mov bl num2 add al bl add ax 303
  • 编写 AMD64 SysV 程序集时使用哪些寄存器作为临时寄存器?

    我正在使用实现一个功能cpuid根据 AMD64 SysV ABI 进行组装 我需要在函数本身中使用 2 个临时寄存器 第一个用于累积返回值 第二个用作计数器 我的功能目前如下所示 zero argument function some c
  • 在 REP MOVSW 之前 PUSH CS / POP DS 的目的是什么?

    为什么在下面的代码中我们压入代码段 PUSH CS 然后将其弹出到数据段 POP DS 我将这些行明确指定为 line1 和 line2 请告诉我 MOVSW 在这里是如何工作的 IF HIGHMEMORY PUSH DS MOV BX D
  • 为什么MIPS中内存地址加4?

    如果某些内容存储在 0x1001 0000 处 则下一个内容将存储在 0x1001 0004 处 如果我是正确的 32 位架构中的内存块每个都是 32 位 那么0x1001 0002会指向32位的后半部分吗 首先 MIPS 架构中的内存地址
  • 什么时候汇编比C更快? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • 如何在汇编语言中换行打印多个字符串

    我试图在汇编中的不同行上打印多个字符串 但使用我的代码 它只打印最后一个字符串 我对汇编语言非常陌生 所以请耐心等待 section text global start start mov edx len mov edx len1 mov
  • 为什么 Visual Studio 使用 xchg ax,ax

    我正在查看程序的反汇编 因为它崩溃了 并注意到很多 xchg ax ax 我用谷歌搜索了一下 发现它本质上是一个 nop 但是为什么 Visual Studio 会执行 xchg 而不是 noop 该应用程序是一个C NET3 5 64位应
  • 减法进位标志

    我正在使用 MASM32 有了这个代码 mov eax 5 sub eax 10 CF 状态标志将被设置 但使用我的铅笔和纸 我实际上看到 MSB 没有任何进位 是的 我知道从较少的数字中减去大的数字集CF 但我想知道为什么 因为使用这段代
  • 两个基本的 ANTLR 问题

    我正在尝试使用 ANTLR 来获取简单的语法并生成汇编输出 我在 ANTLR 中选择的语言是 Python 许多教程看起来非常复杂或详细阐述与我无关的事情 我真的只需要一些非常简单的功能 所以我有两个问题 将值从一个规则 返回 到另一规则
  • 为什么 GCC 不将 a*a*a*a*a*a 优化为 (a*a*a)*(a*a*a)?

    我正在对科学应用程序进行一些数值优化 我注意到的一件事是 GCC 会优化调用pow a 2 通过将其编译成a a 但是调用pow a 6 没有优化 实际会调用库函数pow 这大大降低了性能 相比之下 英特尔 C 编译器 http en wi

随机推荐

  • 如何使用! scala 中的运算符?

    我是 Scala 的新手 正在尝试一些基本操作来掌握这门语言 我正在尝试使用逻辑运算符 例如 val a2 0x01 0xFF println a2 我想对a2的值求负然后打印出来 但它给了我一个错误说 value unary is not
  • XML 命名空间“clr-namespace:YYY”中不存在标记“XXX”

    我已经实现了一个转换器 将 Int32 转换为 String 以便能够将属性绑定到文本框 我在命名空间 MyApp Converters 中实现了这个转换器 它被称为 Int32ToStringConverter 然后 在我的 axml 中
  • R:删除向量的最后一个元素

    如何删除动物园系列的最后 100 个元素 我知道名称 元素 符号 但我无法减去整个部分 我喜欢用head因为这样更容易打字 其他方法可能执行得更快 但我很懒 而我的计算机却不是 x lt head x 100 gt head 1 102 1
  • Pynput 键盘记录器仅返回 Shift、Command、空格和 Capslock 键

    我希望这个问题没有在之前的帖子中讨论过 我的搜索结果没有返回任何相关内容 但请随时启发我 我正在编写一个非常基本的 Python 键盘记录器 作为一个更大项目的一部分 我使用 pynput 来监听击键 并使用日志记录模块将它们写入 txt
  • 如何将数据读入Tensorflow?

    我正在尝试将数据从 CSV 文件读取到张量流 https www tensorflow org versions r0 7 how tos reading data index html filenames shuffling and ep
  • 如何禁用 VS Code“扩展开发主机”中的所有无关扩展而不覆盖我的正常用户配置?

    我正在尝试在 VSCode 扩展上进行调试 开发 为此 我需要在调试 扩展开发主机 中禁用所有 许多 其他扩展 然而 这样做 saves我的用户首选项 然后导致 我所有其他 VScode 实例 停止拥有任何扩展 如何在 扩展开发主机 中禁用
  • 发送简单的文本(不是电子邮件)到 SpamAssassin

    我想知道是否可以向 SpamAssassin 发送简单的文本 我想将评论放入文本文件中并调用 spamc 我相信您可以禁用任何引用标头的 SA 规则 但由于 消息 格式错误 它可能仍然会中断 即使没有 SA 评分也过于依赖标头 因此在不检查
  • Meteor 服务器 Websocket

    我正在寻找在 Meteor 服务器 而不是客户端 上创建一个 websocket 以连接到外部网站 我知道我要访问的 URL 以及期望的数据 但我不清楚如何准确地创建 websocket 本身 我所做的所有搜索都为我提供了客户端解决方案 但
  • HTML5 WebStorage 数据是如何物理存储的?

    在使用 HTML5 WebStorage 功能时 我知道某些浏览器 例如 Chrome 具有开发人员工具 使用户能够浏览其 WebStorage 的内容以进行调试和故障排除 我想知道是否可以查看文件系统中网络存储的内容 此内容是否存储在文件
  • 在 WPF ComboBox 中设置默认值

    我正在使用 ComboBox ItemsSource 属性绑定来显示从列表到组合框的项目 以下是代码
  • 如何获取发送到数据库的准备好的查询

    当使用像这样的数据库库时pyodbc http code google com p pyodbc 实施Python 数据库 API 规范 http www python org dev peps pep 0249 应用参数替换后如何获得完全
  • 从 do 块返回查询

    我想做的就是能够使用do块设置一些变量 然后返回一个查询STDOUT使用这些变量 DO DECLARE book name TEXT DECLARE book slug TEXT BEGIN book name Ise Monogatari
  • Ruby Gem 开发 - 如何使用 ActiveRecord?

    我目前正在尝试开发我的第一个红宝石宝石 但我已经陷入困境 我使用 bundle gem 命令创建基本结构并阅读了一些教程 但我找不到如何集成 ActiveRecord 我在哪里创建迁移 我是在 lib 文件夹中还是在根目录中创建 db mi
  • UIButtons 的 IBOutletCollection - 更改按钮的选定状态

    我在视图中遇到多个 UIButton 的问题 我希望单独选择按钮 一次选择多个按钮 例如 10 个按钮 选择按钮 1 4 5 9 在我的标头中 我有一个 IBOutletCollection 属性 property retain nonat
  • 如果MySQL数据库没有关闭会发生什么?

    如果MySQL数据库没有关闭会发生什么 我们如何知道它是否正确关闭 我确实有一个页面 页面上有 11 个表 所以我所做的是在脚本开始之前在页面顶部打开数据库 并在脚本 PHP 结束的地方关闭 结尾是 mysql close db 这足够公平
  • UIBarButtonItem 如何禁用辅助功能 (iOS)

    SO 我正在尝试禁用已添加到 UINavigationController 的 leftBarButtonItems 中的 UIBarButtonItem 的 VoiceOver 可访问性 虽然我可以为没有标题的按钮禁用它 但我似乎无法为有
  • 如何在 symfony2 的表单类中隐藏标签?

    我知道您可以在树枝中拆分表单并选择不渲染特定字段的标签 但我忍不住认为您必须能够从表单类中执行此操作 选项数组中的 label 键允许您将此值更改为您喜欢的任何值 但传递 false 或空字符串只会返回字段名称 请参阅下面的示例 其中 ro
  • USB 驱动程序 华硕 Nexus 7 Windows 7

    我已经尝试了该网站和其他许多网站上的所有建议 但均无济于事 甚至可以在 Windows 上为 Nexus 7 进行 Android 开发吗 我试过从sdk管理器下载的usb驱动 华硕的那个 我已尝试将 USB 模式更改为 PTP 但仍然收到
  • 当您使用 Javascript 单击或停止悬停时,如何使 CSS 悬停内容保持在原位?

    我有一个想要实现的身体系统功能 当用户将鼠标悬停在身体 部位上时 它会突出显示并显示该特定身体部位的信息 我已经按照我想要的方式编写了 CSS 代码 但是我对 JavaScript 一无所知当单击身体部位或鼠标离开悬停状态时 获取要粘贴的信
  • MIPS 左加载字 (LWL) 和右加载字 (LWR) 指令的作用是什么?

    最近我一直在研究 MIPS 指令集 当时我遇到了两个在其他指令集中没有见过的不寻常指令 我环顾四周 想找到一个关于指令到底做什么的合理解释 但我所能弄清楚的是 它们在某种程度上与未对齐的内存访问有关 例如 维基百科说 https en wi