MIPS汇编将整数转换为二进制并读取1的数量?

2024-02-29

我正在开发一个程序,它从用户那里获取一个整数,然后输出它的二进制等价物中有多少个 1。所以首先我认为我需要将其转换为二进制,然后使用循环检查所有 32 位以找出有多少个 1。

我已经浏览了几个小时并尝试不同的方法来首先将整数转换为二进制。最好的方法是什么?有没有办法直接读取二进制寄存器值,或者我需要先转换它?这是迄今为止我拥有的所有代码。

  .data
EnterInteger: .asciiz "Enter an integer: "


.text
 # Print the first message
 li $v0, 4
 la $a0, EnterInteger
 syscall

 # Prompt the user to enter the first integer
 li $v0, 5
 syscall

 # Store the first integer in $t0
 move $t0, $v0

这是我到目前为止的代码,但它不起作用。当我输入 4673 时,我应该得到“4”,但我只得到“1”

    .data
Msg: .asciiz "Enter an integer: "



.text
 # Print the first message
 li $v0, 4
 la $a0, Msg
 syscall

 # Prompt the user to enter the first integer
 li $v0, 5
 syscall

 # Store the first integer in $t0
 move $t0, $v0

 addi $t3, $zero, 0

main:
 bgt $t3, 32, exit
 andi $t0, $v0, 1
 bne $t0, $zero, count 
 



count:
 addi $t3, $t3, 1
 addi, $t1, $zero, 1
 # Shift to the next bit and then go back to main
 srl $t0, $t0, 1
 j main
 
exit:

# Tell the interpreter to get read to print an integer
 li $v0, 1
 add $a0, $zero, $t1
 
 #Print the integer
 syscall
 
 # End the program
 li $v0, 10
 syscall

正如迈克尔评论的那样,寄存器中的整数已经是二进制的。寄存器是一组 32 位。

至关重要的是,对寄存器的操作 like andi $t1, $v0, 1 and srl $v0, $v0, 1 以二进制方式工作。即结果 0 或 1and是值 mod 2,右移 1 位除以 2。

这是 MIPS 的结果binary计算机,就像您可能学习汇编的现实世界中的每一个 ISA 一样。高级语言包括 C、Java 和 Python& and >>操作也始终保证它们以二进制方式运行。 (在非二进制计算机上,例如三进制,实现这些语义x & y需要转换为以 2 为基数的数字数组并手动执行逻辑,然后再转换回来。)

如果您想使用其他基数(例如基数 10),则需要进行实际除法(MIPSdivu) 或余数以删除或隔离最低的 10 进制数字。或者,如果基数是 2 的幂,例如基数 16,则移位 4 位,或者与0x0f(取低4位,即0b1111)。


其他基数的输入/输出涉及将(二进制)整数从/转换为表示另一个基数的数字的 ASCII 数字字符串。 MARS/SPIM read_int 调用(syscallwith $v0 = 5) 可以为您完成此操作,就像 C 库函数 scanf 或 printf 一样。要手动执行此操作,您可以执行类似的操作total = total * 10 + digit, where digit是这样的ascii_char - '0'。或者对于输出,重复除以 10/模以 10 以获得以 10 为基数的数字,从最低的数字开始。

有一些关于手动与字符串相互转换的 MIPS 问答,但数量并不多,因为大多数使用 MIPS 的学生都使用 MARS 或 SPIM 进行玩具系统调用,这些系统调用通常由 C 库或手动完成。但是 IIRC 如果你搜索一下的话,还是有一些的。

ASCII 十进制或十六进制字符串是序列化格式对于数字,而不是它们在计算机内部的存在方式(除了字符串,而不是整数)。


Popcount

一次循环一个位,提取并添加低位,是一种简单但通常效率低下的计算设置位数量的方法。尽管如此,对于第一次尝试来说,简单还是有好处的。的选择andi and srl前面的例子是一个提示。

一些更快的 Bithacks 显示在如何计算 32 位整数中设置的位数? https://stackoverflow.com/questions/109023/how-to-count-the-number-of-set-bits-in-a-32-bit-integer尽管对于 MIPS 来说,这意味着生成大量单独的 32 位常量,每个常量需要 2 个指令。您可以执行两个 SWAR 扩展步骤,然后循环 4 位和组,作为中间基础。

计算整数上的位 1 的速度与 GCC __builtin__popcount(int) 一样快 https://stackoverflow.com/questions/51387998/count-bits-1-on-an-integer-as-fast-as-gcc-builtin-popcountint显示了计算迭代次数的方法n &= n-1 to 清除最低设置位 https://catonmat.net/low-level-bit-hacks,如果只设置了几个位,即使它们不在寄存器底部附近,速度也会更快。

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

MIPS汇编将整数转换为二进制并读取1的数量? 的相关文章

  • 为什么 RISC-V S-B 和 U-J 指令类型以这种方式编码?

    我正在读一本书 计算机组织与设计RISC V版 我遇到了 S B 和 U J 指令类型的编码 我上面提到的那些类型有奇怪的编码立即字段 S B 类型将直接字段分为两部分 这是有道理的 因为所有指令编码都必须相似 但我无法理解为什么立即字段以
  • 两个基本的 ANTLR 问题

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

    我有与此完全相同的问题 边画边听键盘 https stackoverflow com questions 13970325 8086 listen to keyboard while drawing 但第一个答案 接受的答案 只听键盘一次
  • 使用 Easy 68K (68000) 组装范围内的随机数

    我正在使用 Easy 68K 模拟器创建一个简单的黑杰克游戏 需要使用随机数来分配牌 我的牌必须在 2 到 11 的范围内 我似乎每次都得到相同的数字 但它不在我预期的范围内 我的卡值需要以 D3 结束 因此我有以下随机数代码 CLR L
  • 如何从 wfstream 读取二进制数据?

    我从文件读取数据时遇到一个小问题 我希望能够读取 wstring 以及任意大小的原始数据块 大小以字节为单位 std wfstream stream file c str std wstring comType stream gt gt c
  • 二进制浮点加法算法

    我试图理解二进制级别的 IEEE 754 浮点加法 我遵循了一些在网上找到的示例算法 并且大量测试用例与经过验证的软件实现相匹配 我的算法目前只处理正数 但是 我没有得到与此测试用例的匹配 0000100011110011011001001
  • 使用 (float&)int 进行类型双关可以正常工作,(float const&)int 会像 (float)int 一样转换吗?

    VS2019 发布 x86 template
  • 如何在 Linux x86_64 上模拟 iret

    我正在编写一个基于 Intel VT 的调试器 由于当 NMI Exiting 1 时 iret 指令在 vmx guest 中的性能发生了变化 所以我应该自己处理vmx主机中的NMI 否则 guest会出现nmi可重入错误 我查了英特尔手
  • 从 exe 文件中获取汇编级代码?

    我当时正在做linux汇编编程 在过去的几天里我已经转而学习windows汇编编程 我在用ml作为我的汇编器和golink作为我的链接器 我有我的汇编代码并已获得我的exe从中 现在我需要取回它的十六进制 xff xab x55等等 在li
  • 如何在 Debian 上编译 DOS 程序?

    在我的汇编语言课程中 我们使用 DPMI 编写 DOS 程序 不幸的是 我无法一直使用 32 位 Windows 机器 我在我使用的几乎每台计算机上都安装了 Debian 虚拟机 我已经安装了 DOSBox 和 DOSEMU 有什么办法可以
  • 如何将 x86 GCC 风格的 C 内联汇编转换为 Rust 内联汇编?

    我在 C 中有以下内联汇编 unsigned long long result asm volatile byte 15 byte 49 shlq 32 rdx orq rdx rax a result rdx return result
  • AVX-512 指令编码 - {er} 含义

    在 Intel x86 指令集参考中 有许多 AVX 512 指令在指令中具有可选的 er 例如 VADDPD 的一种形式定义为 EVEX NDS 512 66 0F W1 58 r VADDPD zmm1 k1 z zmm2 zmm3 m
  • 计算数字的二进制表示形式中 1 的数量的最佳方法。 (MIPS)

    我需要计算二进制数中 1 的数量 比如说 5 所以 00001001 将是 2 或 n 2 我正在使用 MIPS 最好的方法来做到这一点 最好的方法是count them 您可以检查是否设置了最低有效位 a1 by and用一个来代替它 如
  • FreePascal x64 上系统单元函数的汇编调用

    我有一些 Delphi 汇编代码 可以在 Win32 Win64 和 OSX 32 上编译并正常工作 XE2 但是 由于我需要它在 Linux 上工作 所以我一直在考虑编译它的 FPC 版本 到目前为止 Win32 64 Linux32 6
  • X86 预取优化:“计算 goto”线程代码

    我有一个相当重要的问题 我的计算图有循环和多个 计算路径 我没有制作一个调度程序循环 其中每个顶点将被一一调用 而是将所有预先分配的 框架对象 放置在堆中 代码 数据 这有点类似于线程代码 甚至更好 CPS 只是在堆中跳转 执行代码 每个代
  • 如何编译GCC生成的asm?

    我正在玩一些汇编代码 有些事情困扰着我 我编译这个 include
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 在 x86 汇编中将 64 位常量移至内存

    我正在使用 Intel x64 程序集 NASM 编译器 尝试将 0x4000000000000000 常量移至内存 该常量在 ieee 754 标准双精度中应等于 2 0 我正在使用的代码是 define two 0x4000000000
  • NASM 中的 equ 和 db 有什么区别?

    len equ 2 len db 2 它们是否相同 产生可以用来代替的标签2 如果不是 那么每种申报表的优点或缺点是什么 它们可以互换使用吗 第一个是equate 与 C 类似 define len 2 因为它实际上并没有在最终代码中分配任
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐

  • 如何从堆栈溢出中获取新问题的通知?

    我想回答新的 javascript react react native 和 Node 问题 那么 我如何知道用户在这些领域提出的新问题呢 打开 Websocket 连接wss qa sockets stackexchange com 然后
  • 具有不同范围模块的 Dagger 2 组件

    Context 我有两个 Dagger 2 模块 NetworkModule with Singleton范围 提供 HTTP 客户端 ApiModule 有一个自定义的 UserScope作用域 它使用 HTTP 客户端为 Github
  • C/C++ HDF5 读取字符串属性

    我的一位同事使用labview在HDF5文件中写入一个ASCII字符串作为属性 我可以看到该属性存在并读取它 但无法打印它 该属性如 HDF Viewer 中所示 日期 2015 07 09 所以 日期 就是它的名字 我正在尝试使用此代码读
  • 如何在 SQL Server 2005 中查找表中多列的总和?

    我有一张桌子Emp其中有这些行 Emp cd Val1 Val2 Val3 Total 1 1 23 2 23 3 43 2 23 03 12 23 2 92 3 7 23 9 05 13 43 4 03 21 78 23 9 43 我想找
  • 如何在Android分页库中为列表、过滤器和搜索维护相同的数据源

    我正在进行显示项目列表的活动 并且还具有过滤器和搜索选项 我正在使用 android 分页库显示项目 当我滚动到底部加载下一组项目时 第一次加载项目列表 其工作正常 但我也想过滤项目并搜索项目 在过滤或搜索项目时 我使现有源无效 如果不使数
  • 从 .txt 文件获取阿拉伯文本?

    嘿 我的 txt 文件中有阿拉伯文本 我想在简单的 EditText 中显示它 虽然当我这样做时我得到的是 http i55 tinypic com 66g09z png http i55 tinypic com 66g09z png 这是
  • 如何用 python 进行类似 sed 的文本替换?

    我想启用此文件中的所有 apt 存储库 cat etc apt sources list Note this file is written by cloud init on first boot of an instance modifi
  • 评估 Python 日志记录 YAML 配置文件中的语句

    考虑以下 Python 代码片段loggingYAML 配置文件 version 1 formatters simple format asctime s name s levelname s message s handlers logf
  • 在我的项目中使用 android.support.v7.widget.CardView (Eclipse)

    我想使用新的 CardView 小部件 该小部件是随新的 Android L 开发人员预览支持库一起引入的 如上所述here https developer android com preview material compatibilit
  • while循环中的Python套接字recv数据没有停止

    当我尝试用 a 接收数据时while loop即使没有数据 循环也不会停止 import socket class Connect connect socket socket socket AF INET socket SOCK STREA
  • acts_as_votable 按赞成票排序

    到目前为止 我还没有找到任何可以使用以下方法按点赞数排序问题的方法 acts as votable gem https github com ryanto acts as votable 这是我的点赞和索引方法 def upvote que
  • Asp net core Blazor Auth0 异常:OpenIdConnectAuthenticationHandler:message.State 为 null 或为空

    我正在使用 Blazor 服务器端和 Auth0 来处理我的应用程序的登录 我可以正常进入登录屏幕 但是当我单击 确定 使用正确的凭据登录时 我得到以下信息 Exception OpenIdConnectAuthenticationHand
  • mongo 哪个更好?将子项放入数组或多个字段中

    我有一个 MongoDB 作为多个独立 SQL 数据库和 API 的整合中间层运行 这些 SQL 数据库共享相似的 Article 表 但结构不同 鉴于一篇文章将属于多个类别和子类别 最多不超过4层 结果我们有两种模式设计 categori
  • MS SQL 中文排序规则

    我在我们的亚洲市场生产数据库中发现了奇怪的行为 在中文字母的情况下 条件并不像人们所期望的那样工作 create table Temp TextContent nvarchar 20 ChineseType varchar 10 inser
  • 相同的命令在不同的设备上输出不同的值

    我有两个树莓派 3 当我做 tfenv pi raspberrypi pip install opencv python 在第一个 Raspberry Pi 上 我得到 Collecting opencv python Could not
  • 增加空指针的定义是否明确?

    在进行指针算术时 有很多未定义 未指定行为的示例 指针必须指向同一数组内部 或超出末尾的一个 或同一对象内部 限制何时可以基于上述内容进行比较 操作 ETC 以下操作定义明确吗 int p 0 p 5 2 6 1 通过添加来修改操作数对象的
  • 切换到 VS 2010 后,编译的程序运行速度变慢了

    我们的关键公司应用程序 C 处理高分辨率图像 我们付出了巨大的努力来优化它 它在约 2 5 秒内执行超过 250 万次操作 我们已经使用 VS 2005 多年 上周 我们将所有内容都转移到了 VS 2010 完全相同的项目代码 现在 当我构
  • 如何在 WP7 中访问播客?

    如何访问手机上的播客列表并在 WP7 中播放它们 Thanks 目前无法查询播客 流派不会告诉您正在使用的内容是否是播客 MediaLibrary 将仅访问常规歌曲 而不是其他内容 希望 Mango 更新能够为媒体访问 API 带来一些扩展
  • 匹配第一个和最后一个字符的正则表达式

    我正在尝试使用正则表达式来检查字符串中的第一个和最后一个字符是否是 a z 之间的字母字符 我知道这与第一个字符匹配 a z i 但是我如何检查最后一个字符呢 This a z a z i 不起作用 我怀疑这两个子句之间应该有一些东西 但我
  • MIPS汇编将整数转换为二进制并读取1的数量?

    我正在开发一个程序 它从用户那里获取一个整数 然后输出它的二进制等价物中有多少个 1 所以首先我认为我需要将其转换为二进制 然后使用循环检查所有 32 位以找出有多少个 1 我已经浏览了几个小时并尝试不同的方法来首先将整数转换为二进制 最好