提示用户输入汇编 ci20 seg 错误

2024-03-19

我目前正在 ci20 机器上开发一个小程序,提示用户输入整数值,然后将该值打印到屏幕上。

我当前的代码

.data

prompt:
 .asciiz "Please enter an integer: "
message:
 .asciiz "\nValue entered: "

.text
.global main

main:
    addiu $sp, $sp, -4 # push stack
    sw $ra, ($sp)      # save return address

    addi $v0, $0, 4
    la $a0, prompt
    syscall            # printing prompt

    addi $v0, $0, 5
    syscall            # get user input

    move $t0, $v0      # save input in $t0
    move $a0, $v0
    addi $v0, $0, 1    # Not sure if this is right to print message
    la $a0, message    # Not sure if this is right to print message
    syscall

    lw $ra, ($sp)      # restoring $sp
    addiu $sp, $sp, +4 # release the stack space used for $sp

当我尝试运行该程序时,出现段错误,但不知道为什么。任何帮助或建议将不胜感激。


编辑:出于某种原因,我完全忽略了在 ci20 机器上测试的这段代码。

那么这是linux吗?那么你就不能使用 MARS 系统调用,你必须找到 linux 系统调用。那么它可能会在第一次出现段错误syscall指令,因为参数对于 Linux 无效。


要显示“提示”,请使用syscall参数设置为v0 = 4, a0 = prompt...要显示“消息”,您将系统调用的参数设置为v0 = 1, a0 = message.

如果这是在MARS http://courses.missouristate.edu/KenVollmar/mars/Help/SyscallHelp.html, then v0=1 是“打印整数”,所以a0应该是整数,而不是“message”字符串的地址。 ..您可能想调用系统调用两次v0=4 and v0=1(参数a0是“消息”和特定调用的用户整数)。

无论如何,这一切都不应该出现段错误。段错误可能发生在最后,您的代码以addiu $sp, $sp, +4,不返回到ra,或调用系统调用“退出”函数(从保存ra在代码的开头,看起来您想要返回而不是退出,但这取决于您)。因此,执行会继续执行一些随机指令(未初始化的内存内容)。

无论如何 2,你应该弄清楚如何在调试器中加载此代码并逐条指令地跳过它,那么您将能够说出它到底在哪里出现了段错误,以及在发生段错误指令之前寄存器的内容是什么。如果你的代码出现了段错误,而你甚至不知道错误发生在哪里,这表明你缺乏努力。

(免责声明:我从未做过 MIPS 汇编,所以我主要猜测它是如何工作的,并且可能忽略了一些东西)


编辑关于syscall,也许这个提示也会有帮助?

syscall是不是有一些神奇的指令在 CPU 上完成所有这些漂亮的事情。它只是跳转到某个处理程序例程。

该处理程序代码由操作系统设置。 SO 上的大多数 MIPS 程序集列表都是针对 MARS 或 SPIM,它们具有与 Linux 完全不同的处理程序。

因此,您应该研究 MIPS 的 linux ABI,以及其中如何使用 syscall。然后找到linux系统调用表,你可能会发现大量的x86文档,所以你必须将其转换为v0/a0/... ABI。

您仍然可以遵循 MARS 示例,但任何操作系统交互都必须进行调整,并且不要指望为所有内容找到替代方案。例如,在 Linux 中输出数字是不可用的。您必须自己将数字值转换为 ASCII 字符串(对于单位数字添加“0”就足够了,对于 9 以上的数字,您必须计算 10 的每个幂的数字并将其转换为 ASCII 字符并将其存储到某个缓冲区中),然后用 sys_write/etc 输出字符串。 (或链接一些 libc 并调用sprintf-类似 C 库中的函数)。

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

提示用户输入汇编 ci20 seg 错误 的相关文章

  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 两种情况或 if 哪个更快? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我必须制作一个 非常 轻的脚本 它将接受用户的选项并调用脚本中的函数来执行一些任务 现在我可以使用 IF 和 CASE 选项 但我想知道两
  • Linux 内核标识符中前导和尾随下划线的含义是什么?

    我不断遇到一些小约定 比如 KERNEL Are the 在这种情况下 是内核开发人员使用的命名约定 还是以这种方式命名宏的语法特定原因 整个代码中有很多这样的例子 例如 某些函数和变量以 甚至 这有什么具体原因吗 它似乎被广泛使用 我只需
  • CentOS:无法安装 Chromium 浏览器

    我正在尝试在 centOS 6 i 中安装 chromium 以 root 用户身份运行以下命令 cd etc yum repos d wget http repos fedorapeople org repos spot chromium
  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • 汇编器8086将32位数字除以16位数字

    我尝试将 32 位数字除以 16 位数字 例如 10000000h 除以 2000h 根据我尝试做的设计除以 右 4 位数字除以除数 然后左 4 位数字除以除数 这是我的代码 DATA num dd 10000000h divisor dw
  • Linux 中什么处理 ping?

    我想覆盖 更改 linux 处理 ping icmp echo 请求数据包的方式 这意味着我想运行自己的服务器来回复传入的 icmp 回显请求或其他 数据包 但为了使其正常工作 我想我需要禁用 Linux 的默认 ping icmp 数据包
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • SSE:跨页边界的未对齐加载和存储

    我在页面边界旁边执行未对齐加载或存储之前读过某处 例如使用 mm loadu si128 mm storeu si128内在函数 代码应首先检查整个向量 在本例中为 16 个字节 是否属于同一页 如果不属于同一页 则切换到非向量指令 我知道
  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 如何通过ssh检查ubuntu服务器上是否存在php和apache

    如何通过ssh检查Ubuntu服务器上apache是 否安装了php和mysql 另外如果安装的话在哪个目录 如果安装了其他软件包 例如 lighttpd 那么它在哪里 确定程序是否已安装的另一种方法是使用which命令 它将显示您正在搜索
  • 我不明白 execlp() 在 Linux 中如何工作

    过去两天我一直在试图理解execlp 系统调用 但我还在这里 让我直奔主题 The man pageexeclp 将系统调用声明为int execlp const char file const char arg 与描述 execl exe
  • MySQL 中的创建/写入权限

    我的设备遇到一些权限问题SELECT INTO OUTFILE陈述 当我登录数据库并执行简单的导出命令时 例如 mysql gt select from XYZ into outfile home mropa Photos Desktop
  • 如何减去两个 gettimeofday 实例?

    我想减去两个 gettimeofday 实例 并以毫秒为单位给出答案 这个想法是 static struct timeval tv gettimeofday tv NULL static struct timeval tv2 gettime
  • 使用 Grep 查找两个短语之间的文本块(包括短语)

    是否可以使用 grep 来高亮所有以以下内容开头的文本 mutablePath CGPathCreateMutable 并以以下内容结尾 CGPathAddPath skinMutablePath NULL mutablePath 这两个短
  • 监视目录的更改

    很像一个类似的问题 https stackoverflow com questions 112276 directory modification monitoring 我正在尝试监视 Linux 机器上的目录以添加新文件 并希望在这些新文
  • 如果在等待“read -s”时中断,在子进程中运行 bash 会破坏 tty 的标准输出吗?

    正如 Bakuriu 在评论中指出的那样 这基本上与BASH 输入期间按 Ctrl C 会中断当前终端 https stackoverflow com questions 31808863 bash ctrlc during input b
  • 如何在c linux中收听特定接口上的广播?

    我目前可以通过执行以下操作来收听我编写的简单广播服务器 仅广播 hello int fd socket PF INET SOCK DGRAM 0 struct sockaddr in addr memset addr 0 sizeof ad
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost

随机推荐

  • Chronicle 与 Chronicle-queue 包

    我刚刚开始使用历史记录队列 但是我对使用哪个 API 来读取 写入队列有点困惑 具体来说编年史队列 5 https www javadoc io doc net openhft chronicle queue 5 17 17 vs 编年史
  • 如何解释 EL 表达式中方括号 ([]) 运算符的用法

    当我阅读时春天宠物诊所 https github com SpringSource spring petclinic 示例应用程序 我发现他们总是把add and modify功能集成到单个 JSP 文件中 并且它们使用 owner new
  • 在 C# 中将 LDAP AccountExpires 转换为 DateTime

    我想将 LDAP AccountExpires 中的 18 位数字字符串转换为正常日期时间格式 129508380000000000 gt gt 2011年5月26日 我通过使用以下链接获得了上述转换 http www chrisnowel
  • Admob 插页式广告显示为黑色,并带有新的广告单元 ID

    我创建了一个应用程序 并且正在使用 admob 插页式广告 由于我已为该应用程序创建了新的插页式广告单元 ID 但广告显示为黑色并带有关闭按钮 但如果我使用旧的应用程序 广告单元 ID 广告将会显示 我不知道为什么会出现这个问题 谢谢 对于
  • 泛型地狱:hamcrest 匹配器作为方法参数

    因此 让我们有一个字符串列表和一个函数 该函数采用 Hamcrest 匹配器并返回matches 提供的匹配器的方法 public boolean matchIt final Matcher
  • 如何在 Notepad++ 中多行“在文件中替换...”

    如果有免费的源代码编辑器记事本 http notepad plus sourceforge net uk about php具有 在文件中查找 功能 即无需在编辑器中打开文件 它是否也具有 在文件中替换 功能 Notepad 是基于Note
  • 如何从 PhantomJS 或 grover 跳过代码执行

    接下来的问题是 我的应用程序中有 JavaScript 代码 我想跳过 隐藏 PhantomJS 和 grover 检查 执行中的一些代码 So 如何跳过 隐藏 PhantomJS 或 grover 的代码执行 注意 当我编写 JavaSc
  • 无法定义使用动态的类或成员,因为编译器需要类型

    我在 Asp Net 3 5 应用程序中使用 Facebook SDK C 库 当我尝试编译下面的代码时 请给我错误 据我所知 动态类型在 4 0 框架中使用 那么无论如何要重写它才能使其工作吗 我有一个对 System Core 3 5
  • 单值上下文中的多个值

    由于 Go 中的错误处理 我经常会得到多个值函数 到目前为止 我管理此问题的方式非常混乱 我正在寻找最佳实践来编写更清晰的代码 假设我有以下功能 type Item struct Value int Name string func Get
  • awk gzip 输出到多个文件

    我可以像这样 gzip awk 输出 echo col1 col2 awk print 1 gzip gt out 但是是否也可以将两个 awk 输出文件流通过管道传输到 gzip 这不起作用 echo col1 col2 awk prin
  • 有没有办法获取Bitmap的存储大小?

    在我的应用程序中 我正在下载一些图像 我想知道是否有任何方法可以获得我下载的位图的大小 这是一个简单的问题 但我似乎无法通过谷歌找到解决方案 这是下载代码 Bitmap b BitmapFactory decodeStream InputS
  • Python 中的肥皂调用

    我试着打电话给肥皂服务公司 我的调用成功 但返回空值 下面我附上了我的肥皂请求和响应架构 它接受一维数组作为输入并返回该数组 请求架构
  • 如何为 HTTPS 调用指定出站证书别名?

    我正在调用需要客户端证书身份验证的 Web 服务 如果我指定一个包含单个证书 服务期望的客户端证书 的 Java 密钥库 那么一切都会正常工作 但是 如果我使用包含多个证书的密钥库 那么我似乎无法指定客户端应选择哪个证书 客户端似乎会选择第
  • 托管调试助手“FatalExecutionEngineError”0xc0000005

    托管调试助手 FatalExecutionEngineError 运行时 遇到了致命错误 错误的地址是 0x641ad419 在线程 0x5d0c 上 错误代码为0xc0000005 这个错误 可能是 CLR 或不安全或不可验证部分的错误
  • 更新 UI5 中的模型,使用格式化程序时双向数据绑定变为单向数据绑定

    在我的 UI5 应用程序中 我有一个表 其中每行包含一个sap m Switch https sapui5 hana ondemand com api sap m Switch 它通过以下方式绑定到模型formatter https sap
  • HttpUrlConnection getOutputStream 有问题

    我制作了一个android应用程序并用于HttpUrlConnection POST 方法 HoloEverywhere 库 但我有问题 为什么会出现我不知道的问题 我认为 getOutputStream 错误 因为如果用于 getOutp
  • Pandas 稀疏数据导出到 csv - 速度解释

    我正在尝试导出由类型列组成的 Pandas 数据框的子集pd SparseDtype float32 np nan 到 csv 我注意到直接写入 csv 与使用sparse to dense 然后写入csv 谁能向我解释一下这是怎么回事 一
  • Perl/regex 删除字符串的前 3 行和后 3 行

    我正在寻找构建一个正则表达式语句以始终删除前 3 个 字符串的行 以及字符串的最后 3 行 中间部分 可以是任意 n 行内容 任何干净的正则表达式方式来实现 这个输出 即总是删除我们的前 3 行和最后 3 行 字符串 并保留中间部分 这可以
  • dos2unix:找到二进制符号,跳过二进制文件

    我当前遇到一个问题 当尝试对文件执行 dos2unix 命令时 我的脚本失败 这就是我在脚本中的内容 dos2unix n data file data tmp file dos2unix Binary symbol found at li
  • 提示用户输入汇编 ci20 seg 错误

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