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

2024-01-17

我目前正在 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 错误 的相关文章

  • Linux中如何避免sleep调用因信号而中断?

    我在 Linux 中使用实时信号来通知串行端口中新数据的到达 不幸的是 这会导致睡眠呼叫在有信号时被中断 有人知道避免这种行为的方法吗 我尝试使用常规信号 SIGUSR1 但我不断得到相同的行为 来自 nanosleep 联机帮助页 nan
  • Linux 内核使用的设备树文件 (dtb) 可视化工具? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以图形化表示Linux内核中使用的硬件设备树的工具 我正在尝试了解特定 Arm 芯片组
  • 任何退出 bash 脚本但不退出终端的方法

    当我使用exitshell 脚本中的命令 该脚本将终止终端 提示符 有什么方法可以终止脚本然后停留在终端中吗 我的剧本run sh预计通过直接获取或从另一个脚本获取来执行 编辑 更具体地说 有两个脚本run2 sh as run sh ec
  • 在 scapy 中通过物理环回发送数据包

    我最近发现了 Scapy 它看起来很棒 我正在尝试查看 NIC 上物理环回模块 存根上的简单流量 但是 Scapy sniff 没有给出任何结果 我正在做的发送数据包是 payload data 10 snf sniff filter ic
  • GCC 从 C++ 程序生成的汇编代码中的 .cfi 和 .LFE 是什么?

    我有以下 C 代码 int factorial int n if n 0 return 1 return n factorial n 1 int main void factorial 5 return 0 当我使用 g S Factori
  • 如何在 MOS 6502 的 asm 中创建延迟

    我是 ASM 新手 我正在尝试研究如何为以下代码创建延迟 org 1000 loop inc d021 jmp loop 我想评论已经足够清楚了 每帧更改颜色的代码示例 1 50 秒 sei enable interrupts loop1
  • MySQL 与 PHP 的连接无法正常工作

    这是我的情况 我正在尝试使用 Apache 服务器上的 PHP 文件连接到 MySQL 数据库 现在 当我从终端运行 PHP 时 我的 PHP 可以连接到 MySQL 数据库 使用 php f file php 但是当我从网页执行它时 它只
  • Bash:将字符串添加到文件末尾而不换行

    如何将字符串添加到文件末尾而不换行 例如 如果我使用 gt gt 它将添加到文件末尾并换行 cat list txt yourText1 root host 37 echo yourText2 gt gt list txt root hos
  • bash while 循环的布尔表达式中的 -lt 意味着什么?

    我猜测它代表小于基于输出 但是我在哪里可以找到有关此语法的文档 bin bash COUNTER 0 while COUNTER lt 10 do echo The counter is COUNTER let COUNTER COUNTE
  • 链接错误:命令行中缺少 DSO

    我对 Linux 使用 Ubuntu 14 04 LTS 64 位 相当陌生 来自 Windows 并且正在尝试移植我现有的 CUDA 项目 当通过链接时 usr local cuda bin nvcc arch compute 30 co
  • 该程序如何知道该字符串存储的确切位置?

    我用 Radare2 反汇编了一个 C 程序 在这个程序中有很多调用scanf像下面这样 0x000011fe 488d4594 lea rax var 6ch 0x00001202 4889c6 mov rsi rax 0x0000120
  • 如何并行执行4个shell脚本,我不能使用GNU并行?

    我有4个shell脚本dog sh bird sh cow sh和fox sh 每个文件使用 xargs 并行执行 4 个 wget 来派生一个单独的进程 现在我希望这些脚本本身能够并行执行 由于某些我不知道的可移植性原因 我无法使用 GN
  • LINUX:如何锁定内存中进程的页面

    我有一个 LINUX 服务器 运行一个具有大量内存占用的进程 某种数据库引擎 该进程分配的内存太大 需要将其中一部分换出 换出 我想做的是将所有其他进程 或正在运行的进程的子集 的内存页面锁定在内存中 以便只有数据库进程的页面被换出 例如
  • 内存映射图形输出

    我正在探索使用内存映射图形绘制像素和线条 我在 Windows 的 Textpad 中使用 TASM 当我单击 运行 时 整个屏幕变成蓝色 就是这样 没有绘制像素 model small stack data saveMode db xVa
  • Linux无法删除文件

    当我找到文件时 我在删除它们时遇到问题 任务 必须找到带有空格的文件并将其删除 我的尝试 rm find L root grep i 但我有错误 rm cannot remove root test No such file or dire
  • Python 3.4.3 subprocess.Popen 在没有管道的情况下获取命令的输出?

    我试图将命令的输出分配给变量 而不让命令认为它正在通过管道传输 原因是 如果正在通过管道传输 则相关命令会给出未格式化的文本作为输出 但如果从终端运行 则会给出颜色格式化的文本 我需要获取这种颜色格式的文本 到目前为止我已经尝试了一些事情
  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • 为什么 Linux 原始套接字的 RX 环大小限制为 4GB?

    背景 我试图mmap 我的原始套接字的 RX 环形缓冲区64 bitLinux 应用程序 我的环由 4096 个块组成 每个块大小为 1MB 总共 4GB 请注意 每个 1MB 块中可以有许多帧 如果您好奇 请参阅此文档了解背景信息 htt
  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • 汇编程序中的过程调用如何工作?

    我刚刚开始摆弄 ASM 我不确定我对过程调用的理解是否正确 假设代码中的某个时刻有一个过程调用 call dword ptr 123 该过程仅包含一个命令 ret ret 0004 该过程调用的效果是什么 返回值将存储在哪里 我在某处读到

随机推荐

  • 在 Lucene 中处理相对较小索引文档的大型搜索查询

    我正在开发一个项目 其中我们索引相对较小的文档 句子 并且我们希望使用大型文档作为查询来搜索这些索引 这是一个相对简单的例子 我正在索引文档 docId 1 text back to black 我想使用以下输入进行查询 Released
  • 为什么我不能直接访问对象文字的属性?

    为什么使用下面的语法 a 1 b 2 constructor 是无效的 而 1 2 constructor 已验证 a 1 b 2 constructor不是无效的语法 但它是不明确的 因为 表示一个块 还是一个对象 所以你必须用括号来消除
  • 如何进行嵌套查询?

    有一个表 users 并且有一个字段 informed by id 显示邀请该用户的人的用户 ID 需要创建一个 MySQL 查询 返回包含用户所有字段的行以及显示每个用户邀请了多少人的 informs count 字段 像这样的事情 SE
  • 如何在 Android 中切换方向锁定?

    我想在我的首选项活动中创建复选框 允许用户切换方向更改 在类似的问题中 人们只写关于完整方向锁定 通过重写 onConfigurationChanged 方法或在 AndroidManifest xml 中添加 configChanges
  • Team Build Extensions 2010 中的使用 ANT 构建 Java

    我有一个基本的 C 项目 但我想启动 ANT 构建 编译一些非常基本的 java 代码 并触发 junit 测试 如果 junit 测试失败 我如何从 Team Build 2010 基本上是 TFS 2010 中得知 如果是这样 我的 T
  • 如何在 C++ 标头中声明数组?

    这与其他一些问题有关 例如 this https stackoverflow com questions 34987 how to declare an array of strings in c 以及我的其他一些问题 In 这个问题 ht
  • 验证请求源是来自Internet还是Intranet

    我有在互联网上运行的应用程序 其中也包含一些管理模块 我不想让用户在互联网上访问我的管理模块 我希望来自内联网的请求可以访问管理模块 有没有办法在不开发服务管理组件的新应用程序的情况下控制这个问题 如果您使用 servlet 您可以添加过滤
  • 如何使用 Pyrtd/pythoncom 解决“pywintypes.com_error”?

    我正在尝试使用pyrtd https code google com p pyrtd Python模块用于获取可以通过RTD在Excel中获取的信息 但是 当我尝试运行示例 python 脚本 http code google com p
  • Ionic 无限滚动不适用于所有 Android 设备

    我目前正在开发一个离子应用程序并成功实现了无限滚动功能 它在桌面浏览器和较新的 Android 设备上运行良好 但是 我在运行 Android 4 1 或更低版本的手机上遇到问题 问题 我打开页面 它加载并显示前 20 个项目 效果很好 我
  • Firefox 中的 Slidedown 和 SlideUp 循环错误

    http www queness com post 1047 easy to style jquery drop down menu tutorial comment 7912 http www queness com post 1047
  • hibernate - HQL 连接许多子句

    我一直在阅读 Hibernate 文档 但没有找到任何可以解释如何执行以下操作的内容 我尝试将以下 SQL 代码转换为 HQL SELECT msg cmd FROM Schema Messages AS msg LEFT OUTER JO
  • 使用多个 JSON 对象设置单元格的文本

    我有一个简单的网络服务 可以将一些数据传递到表视图中 并且工作正常 这是我目前拥有的代码 cell detailTextLabel setText item objectForKey Ball 1 正如我所说 这完美地工作并显示球号 例如
  • 我可以将 vjslib.dll 放入应用程序的 /bin 目录中吗?

    我正在进行生产部署 不幸的是 我正在部署到一个严格控制的环境 今晚我不太可能获得运行完整 Visual J 可再发行 EXE 的许可 我们的应用程序当前抛出错误 表示找不到程序集 vjslib dll 我可以将其放入应用程序的垃圾箱中 然后
  • QML TableView从特定单元格获取数据(选定行+特定列)

    我有QMLTableView with QSqlQueryModel 我需要选择任何行并从表的每一列中获取数据以分隔TextField 这是 abonentstable h pragma once include
  • 如何从 URL 中删除网页扩展名? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想从 URL 中删除网页扩展名 有人给了我 htaccess 的代码 但当我打开重写模块时 它在本地主机上工作 但是当我在 Godaddy 上使用它
  • 多方peer.js应用程序

    我对 PeerJs 和 WebRTC 是全新的 我有一个 1 1 NodeJS PeerJS 应用程序在我的远程服务器上运行 效果很好 然而现在我想探索将其扩展到 1 N 模型 其中主机 ID 可以有多个对等点连接到它们 并且每个对等点都可
  • 如果任何源列为 true,则将布尔值聚合为 true

    假设我有下表 id column a column b column c 1 t f t 2 t f f 3 f t f 从上表中 我想 select rows from id 1 2 结果应该是 column a column b col
  • 除了最后一项之外,如何在所有项上设置边框底部

    如果我有一个ul 我如何设置所有的边框底部li除了最后一项之外的项目 我也在尝试使宽度border180 像素 这是我的代码 HTML ul class sideNav li a href history asp History a li
  • 长按注释时,注释图像会被 RedPushPin 替换

    我使用以下内容创建了自定义注释 MKAnnotationView mapView MKMapView mapView viewForAnnotation id
  • 提示用户输入汇编 ci20 seg 错误

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