MIPS 汇编:从整数转换为十六进制

2024-01-19

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

$a0 是整数值

$a1 是结果所在的地址

        addi $t0, $0, 48       #set $t0 equal to 48 
        sb $t0, 0($a1)         #store $to (48) at location 0 in $a1
        addi $t0, $0, 120      #set $t0 equal to 120
        sb $t0, 1($a1)         #store $t0 (120) at location 1 in $a1
        addi $t1, $a1, 9       #set $t1 = the address + 9

LOOP:

        andi $t0, $a0, 0xf    #$t0 = 1 if $a0 and 0xf are the same (0xf = beginning of hex)?

        slti $t2, $t0, 10     #if $t0 is less than 10, $t2 = 1, else 0
        bne $t2, $0,  DIGIT   #if $t2 does not equal 0, branch to DIGIT
        addi $t0, $t0, 48     #set $t0 equal to 48
        addi $t0, $t0, 39     #set $t0 equal to 39 (why did we just write over the 48?)
DIGIT:

        sb $t0, 0($t1)        #set $t0 equal to whatever's in location 0 of $t1

        srl $a0, $a0, 4       #shift right 4 bits

        bne $a0, $0, LOOP     #if $a0 does not equal 0, branch to LOOP
        addi $t1, $t1, -1     #set $t1 = $t1 - 1

DONE:

        jr $ra                #set the jump register back to $ra
        nop

    slti $t2, $t0, 10     #if $t0 is less than 10, $t2 = 1, else 0
    bne $t2, $0,  DIGIT   #if $t2 does not equal 0, branch to DIGIT
    addi $t0, $t0, 48     #set $t0 equal to 48
    addi $t0, $t0, 39     #set $t0 equal to 39 (why did we just write over the 48?)

MIPS 使用分支延迟槽,这意味着分支指令后面的指令始终在分支被采用(或不被采用)之前执行。

所以这意味着“如果 $t0 小于 10(即在 0..9 范围内),则转到 DIGIT,但首先添加 48(ASCII '0'),无论 $t0 的值如何。如果分支是采取你现在已经从 0..9 转换为 '0'..'9'。如果没有采取分支,$t0 最初在 10..15 范围内,现在将在 58 范围内..63,所以我们再添加 39 以获得 97..102 范围内的值('a'..'f' 的 ASCII 代码)”。

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

MIPS 汇编:从整数转换为十六进制 的相关文章

  • 如何获取 VESA BIOS 信息

    我正在跟踪Phil Opp 教程 https os phil opp com 关于用 Rust 编写一个操作系统 在稍微尝试了一下之后 我想在屏幕上显示真实的图形 我发现我应该从使用带有 VESA 的线性帧缓冲区开始 我在 osdev or
  • ARM 调用约定是否允许函数不将 LR 存储到堆栈中?

    正如标题所示 我在理解 ARM 架构的调用约定时遇到问题 特别是 我仍然很难知道当你调用子程序时 LR 寄存器会发生什么 我认为 当您进入子程序时 处理 LR 寄存器的最明显 最安全的方法是将其存储到堆栈中 但该行为没有出现在文档中 因此我
  • 使用 gdb 调试反汇编库

    在Linux和Mac OS X中可以使用strapi和next来调试应用程序而无需调试信息 在 Mac OS X 上 gdb 显示在库内部调用的函数 尽管有时会在每个 stepi 指令中推进多个汇编程序指令 在 Linux 上 当我进入动态
  • Swift - 从 UnsafePointer 长度转换为 String

    我考虑了很多similar问题 但仍然无法让编译器接受这一点 Socket Mobile API 在 Objective C 中 将 ISktScanDecodedData 传递到 Swift 中的委托方法中 数据可能是二进制的 我想这就是
  • 在 REP MOVSW 之前 PUSH CS / POP DS 的目的是什么?

    为什么在下面的代码中我们压入代码段 PUSH CS 然后将其弹出到数据段 POP DS 我将这些行明确指定为 line1 和 line2 请告诉我 MOVSW 在这里是如何工作的 IF HIGHMEMORY PUSH DS MOV BX D
  • 汇编指令陷阱有什么作用?

    当程序需要时 程序通常会发出软件陷阱 由操作系统提供服务 通用异常处理程序 操作系统确定陷阱的原因并做出响应 适当地 汇编指令 trap 和 BASIC 中的 TRAP 指令一样吗 答案似乎是肯定的 你能接受还是拒绝我的结论 不中断 的代码
  • 破坏/分解函数的函数

    我以前有过 here https stackoverflow com questions 4920610 c class function in assembly 已经表明 C 函数不容易用汇编表示 现在我有兴趣以一种或另一种方式阅读它们
  • 这段汇编语言代码是什么意思?

    我是一名学生 刚刚开始学习汇编语言 为了更好地理解它 我只是用 C 写了一个简短的代码并将其转换为汇编语言 奇怪的是我有点听不懂 代码是 include
  • 在 x86 程序集中将整数打印到控制台

    当我在 16 位汇编中添加两个值时 将结果打印到控制台的最佳方法是什么 目前我有这个代码 CODE START mov ax 1 put 1 into ax add ax 2 add 2 to ax current value mov ah
  • Visual Studio 2017 上的简单装配程序

    386 model flat c stack 100h printf PROTO arg1 Ptr Byte data msg1 byte Hello World 0Ah 0 code main proc INVOKE printf ADD
  • 为什么 Visual Studio 使用 xchg ax,ax

    我正在查看程序的反汇编 因为它崩溃了 并注意到很多 xchg ax ax 我用谷歌搜索了一下 发现它本质上是一个 nop 但是为什么 Visual Studio 会执行 xchg 而不是 noop 该应用程序是一个C NET3 5 64位应
  • 为什么结构体不能转换为嵌入类型

    package main type Inner struct x int type Outer struct Inner func main x Inner 1 y Outer x cannot convert x type Inner t
  • 使用 stringstreams 将字符串转换为 __uint128_t

    我正在尝试从字符串中提取不同类型的数据 void readHeader char buf BUFFSIZE std istringstream hdr buf uint128 t id client hdr gt gt id client
  • 在 C++ 中从 std::string 转换为 char *

    我正在使用 VS2012 C 我需要将 std string 转换为 char 但我在网上找不到任何材料来提供有关如何执行此操作的任何指导 任何代码示例和建议将不胜感激 Use std string bla bla char blaptr
  • 寄存器寻址模式与直接寻址模式

    我在试卷中遇到过这个问题 它指出 哪种给定的寻址模式更快 为什么 寄存器寻址方式 直接寻址方式 现在根据我的说法 寄存器寻址模式应该更快 因为寄存器是计算机中最快的存储位置 这是正确答案吗 请帮忙 谢谢 两种寻址模式之间的区别是 地址的来源
  • ARMv8 A64 汇编中立即值的范围

    我的理解是 ARMv8 A64 汇编中的立即参数可以是 12 位长 如果是这样的话 为什么这行汇编代码是 AND X12 X10 0xFEF 产生此错误 使用 gcc 编译时 Error immediate out of range at
  • 从 exe 文件中获取汇编级代码?

    我当时正在做linux汇编编程 在过去的几天里我已经转而学习windows汇编编程 我在用ml作为我的汇编器和golink作为我的链接器 我有我的汇编代码并已获得我的exe从中 现在我需要取回它的十六进制 xff xab x55等等 在li
  • “mov (%ebx,%eax,4),%eax”如何工作? [复制]

    这个问题在这里已经有答案了 一直在从事装配作业 并且在很大程度上我对装配非常了解 或者至少对于这项任务来说足够好 但这个 mov 的声明让我很困惑 如果有人能解释这个 mov 语句如何操作寄存器值 我将非常感激 mov ebx eax 4
  • 使用 MIPS 从 Big Endian 到 Little Endian 无需逻辑运算?

    我正在使用 MIPS QtSpim 将 32 位字从 Big Endian 转换为 Little Endian 我下面显示的内容已检查且正确 不过我想知道还有什么其他方法可以让我进行转换 我虽然只使用了旋转和移位 但如果没有逻辑运算 我就无
  • 阴影空间示例

    EDIT 我接受了下面的答案 并添加了我自己的代码的最终修订版 希望它向人们展示影子空间分配的实际示例 而不是更多的文字 编辑 2 我还设法在 YouTube 视频 所有内容 的注释中找到了一个调用约定 PDF 的链接 其中有一些关于 Li

随机推荐

  • 为什么不能在 Ruby 的方法中声明常量?

    考虑以下内容 StubFoo 是 Foo 的存根 我希望将其存根以进行一些测试 class Runner def run Foo StubFoo foo Foo new using Foo end end 这会生成以下错误消息 Dynami
  • 播放实时音频流 - html5

    我有一个桌面应用程序 它通过 websocket 连接将原始 PCM 数据流式传输到我的浏览器 流看起来像这样 x00 x00 x02 x00 x01 x00 x00 x00 x01 x00 xff xff xff xff 问题很简单 我可
  • 依赖参数的上下文类型

    使用联合重载时 是否可以获取函数参数的上下文类型 declare function f args x a y a string gt void x b y a boolean gt void void Parameter x implici
  • 如何使用 YouTube API 将视频观看次数获取到 Google 电子表格中?

    有人找到了一种方法 可以通过 YouTube API 将视频观看次数导入 Google 文档吗 直到最近我才成功地使用了Google 电子表格中的 YouTube 观看次数 http www davidtoy co uk post 2684
  • 实现列表#flatMap

    有没有更好的函数式写法flatMap def flatMap A B list List A f A gt List B List B list map x gt f x flatten 从概念上讲 我理解flatMap按照flatten
  • 如何对以 TemplateRef 作为输入的 Angular 组件进行单元测试?

    我正在尝试为 Angular 组件编写单元测试 该组件可以隐藏 显示作为组件本身的输入传递的一些内容 预期的输入被定义为 TemplateRef 我的组件 组件 ts Component selector my component temp
  • 如何在 Windows 7 上安装 ora2pg?

    我下载了 zip 文件 该文件可以在线免费下载 但我无法安装下载的文件并运行该文件 任何人都可以帮我在我的 Windows 计算机上安装 ora2pg 简介 我必须将一些表从 Oracle 数据库迁移到 PostgreSQL 以便我的本地开
  • VS2012 服务器资源管理器 - 无法访问 Windows Azure 存储

    我有 VS2012 Ultimate SP3 和 Windows Azure 帐户 我已经发布了一个 MVC 3 应用程序 使用 Azure SQL Server DB 没有出现任何问题 我已经安装了Azure SDK v2 1 并且可以通
  • HttpClient.GetAsync(url) 将 504 返回到在浏览器中工作的 URL

    我可以手动访问 URL 但在使用 Net 时出现超时 我创建了一个按钮来更轻松地复制场景 有时我会收到一个异常 提示任务已取消 否则会出现 504 错误 代码片段如下 private async void Button Click 1 ob
  • vim 从 .vimrc 运行时无法打开文件,但从终端运行时可以正常打开

    每当我尝试使用 Vim 打开任何文件时 我都会收到以下错误消息 Error detected while processing home emma vimrc line 138 E484 Can t open file home emma
  • 左倾红黑树的 F# 代码优化

    我一直致力于将 LLRBT 的 C 实现移植到 F 现在它可以正确运行 我的问题是我将如何优化它 我的一些想法 使用 Node 的可区分联合来删除 null 的使用 Remove getters and setters 你不能同时拥有 nu
  • 如何将加载的图像读取到 blob 中? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将图像对象转换为二进制 blob https stackoverflow com questions 13375333 how to convert an image object to a bi
  • Scala 中的理解评估很奇怪(?)

    现在 我花了a while找出为什么我的递归会以某种方式设法破坏堆栈 这是导致此问题的部分 scala gt for i lt List 1 2 3 j println why am I evaluated 10 if false yiel
  • Google App Engine 数据存储区和其他 NoSQL 数据库的无架构设计指南

    我相信许多其他人都有关系数据库背景 因此我正在寻找一些可靠的指南来在 Google App Engine 上设置 设计我的数据存储区 人们对于设置此类无模式数据存储有什么好的经验法则吗 我了解一些基础知识 例如非规范化 因为您无法进行连接
  • 静态库调试符号

    在 VS2010 中 有一个选项可以为 exe dll 生成调试信息linker但下没有这样的选项图书管理员对于库 调试信息是否嵌入静态库中 里面有一个选项C C 属性为程序数据库文件名对于库 exe 和 dll 默认情况下 它进入我的中间
  • 使用flutter打印包,如何从URL打印PDF?

    我在flutter中使用打印包 https pub dev packages printing https pub dev packages printing 该文档展示了如何从头开始创建 PDF 我已经在 URL 上有一个 PDF 有没有
  • os.environ 对 C 扩展模块的可见性

    如果我使用更改环境变量os environ 我之后导入的模块会看到这种变化吗 具体来说 sqlite3 requires https stackoverflow com a 23251896 336527使用环境变量来确定其临时文件位置 但
  • 当 URL 不正确时,curl_easy_perform 崩溃

    我在尝试使用下载文件时遇到问题libcurl 该程序使用多个线程 每个需要下载文件的线程都会创建一个libcurl处理来工作 当 URL 正确时 一切正常 但如果 URL 错误 程序就会崩溃 在调试模式下 如果 URL 不正确curl ea
  • 如何将弹出框 MATERIAL-UI 功能组件转换为基于类的组件?

    我正在尝试将此功能组件转换为基于类的组件 我已经尝试了几个小时但找不到放置这些的位置const组件中的变量 如果有人可以将其写在基于类的组件中 我们将不胜感激 const useStyles makeStyles theme gt typo
  • MIPS 汇编:从整数转换为十六进制

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