gpt4 book ai didi

linux - 在程序集 ci20 段错误中提示用户输入

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:06:20 25 4
gpt4 key购买 nike

我目前正在 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 = 消息

如果这是在MARS , 那么 v0=1 是“print integer”,所以 a0 应该是整数,而不是“message”字符串的地址。 .. 你可能想调用 syscall 两次,v0=4 和 v0=1(参数 a0 是“消息”,用户整数是特定调用)。

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

无论如何 2,你应该弄清楚如何在调试器中加载这段代码并逐条指令执行,然后你将能够说出它到底在哪里发生段错误,以及它的内容是什么在段错误指令之前注册。如果您的代码出现段错误并且您甚至不知道发生在何处,则表明您缺乏努力。

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


编辑系统调用,也许这个提示也有帮助?

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 并从 C 库调用类似 sprintf 的函数)。

关于linux - 在程序集 ci20 段错误中提示用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40038679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com