MIPS 函数和数组

发布于 2024-11-08 06:50:52 字数 683 浏览 4 评论 0原文

我可以在很大程度上理解和使用 Java/c++,但在我的一生中,汇编让我感到困惑,有 2 个函数我遇到了麻烦。第一个:

一个函数接收字符串并将其打印在终端上

,另一个函数接收字符串并将其转换为整数(字符串全部由数字组成)。

知道从哪里开始吗?

更新

在第二个函数上,到目前为止我得到了这个:

main:   
atoi:
    li      $v0, 8
    la      $a0, tstr
    li      $a1, 64
    syscall
    sub $sp, $sp,4
    sw $ra, 0($sp)
    move $t0, $a0
    li $v0, 0
next:
    lb $t1, ($t0)
    beqz  $t1, endloop
    mul $v0, $v0, 10
    add $v0, $v0, $t1
    sub $v0, $v0, 48
    add $t0, $t0, 1
    b next

endloop:
    lw $ra, 0($sp)
    add $sp, $sp, 4

更新了代码,仍然收到 10 是无效操作数的错误。关于 sub $v0, $v0, 48 我应该像 sub $t1, $t1, 48 那样做吗?

I can understand and use Java/c++ to a good extent, but for the life of me assembly just confuses me there are 2 functions I'm having trouble with. First:

One function that receives a string and prints it on the terminal

And another one that receives a string and converts it to integers (Strings given all made of numbers).

Any idea on where to start?

Update

On the second function, so far I got this:

main:   
atoi:
    li      $v0, 8
    la      $a0, tstr
    li      $a1, 64
    syscall
    sub $sp, $sp,4
    sw $ra, 0($sp)
    move $t0, $a0
    li $v0, 0
next:
    lb $t1, ($t0)
    beqz  $t1, endloop
    mul $v0, $v0, 10
    add $v0, $v0, $t1
    sub $v0, $v0, 48
    add $t0, $t0, 1
    b next

endloop:
    lw $ra, 0($sp)
    add $sp, $sp, 4

Updated code, still getting the error on 10 being an invalid operand. And about sub $v0, $v0, 48 should I just do it as sub $t1, $t1, 48?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦在夏天 2024-11-15 06:50:52

对于输入输出的东西,你必须使用系统调用。为了写入(以零结尾的)字符串,您将使用系统调用 #4,它需要 $a0 中的缓冲区地址。现在只需将系统调用的编号放入 $v0 中并执行它即可。例如,此代码片段读取一个字符串:

li      $v0, 8                # syscall number
la      $a0, theString        # buffer
li      $a1, 64               # length of buffer
syscall                       # read!

在这里您可以找到一些系统调用编号。
对于第二个练习,这是 C++ 代码,尝试翻译它:P

int result = 0;

while (*digit >= '0' && *digit <='9') {            // digit is char *
    result = (result * 10) + (*digit - '0');
    digit++;
}

编辑:
好吧,有几个错误。首先,您没有检查是否已到达字符串末尾(只需将 $t1 与开头的 0 进行比较)。您应该首先从 $t1 中减去“0”,然后将其添加到 $v0。

next:
    lb $t1, ($t0)
    # are there other character or this is the last one?

    mul $v0, $v0, 10
    add $v0, $v0, $t1
    sub $v0, $v0, 48         # subtract 48 only from $t1, not from whole result
    add $t0, $t0, 1
    b next

For input-output stuff, you have to use system calls. For writing (zero-terminated) strings you'll use syscall #4, which wants the address of the buffer in $a0. Now just place the umber of the syscall in $v0 and execute it. For example, this snippet reads a string:

li      $v0, 8                # syscall number
la      $a0, theString        # buffer
li      $a1, 64               # length of buffer
syscall                       # read!

Here you can find some syscalls numbers.
For the second exercise, here's the C++ code, try to translate it :P

int result = 0;

while (*digit >= '0' && *digit <='9') {            // digit is char *
    result = (result * 10) + (*digit - '0');
    digit++;
}

EDIT:
Ok, there are a couple of errors. First, you're not checking whether you've reached the end of the string (simply compare $t1 with 0 at the beginning). And you should first subtract '0' from $t1, then add it to $v0.

next:
    lb $t1, ($t0)
    # are there other character or this is the last one?

    mul $v0, $v0, 10
    add $v0, $v0, $t1
    sub $v0, $v0, 48         # subtract 48 only from $t1, not from whole result
    add $t0, $t0, 1
    b next
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文