gpt4 book ai didi

assembly - itoa 负数?

转载 作者:行者123 更新时间:2023-12-04 18:43:09 29 4
gpt4 key购买 nike

赏金:对于提供代码以使此子程序与负数一起工作的任何人,+50 信誉点。

我编写了一个 MIPS 程序来将华氏温度转换为摄氏温度。它打开自己的输出窗口(即 UART)并正确显示摄氏值。它在从 C 调用到汇编(反之亦然)的同时完成所有这些工作。整个代码贴在下面。

我正在努力让它与负数一起工作。出于某种原因,现在只是画一个空白。如何更改我的 itoa函数来写这个检查?

任何人都有任何想法如何在 MIPS 中使用负值?

.ent itoa
itoa:
// putting the stack frame together
addiu sp, sp, -16
sw fp, 12(sp)
move fp, sp
sw a0, 16(fp)
sw a1, 20(fp)
sw s0, 4(fp)
sw s1, 0(sp)

// there is no divide immediate, so using s1
li s1, 10

itoa_div_begin:
divu a0, s1
mfhi s0
mflo a0

addiu s0, s0, 0x30
addiu sp, sp, -1
sb s0, 0(sp)

beq a0, zero, itoa_div_done
nop

j itoa_div_begin
nop

itoa_div_done:
itoa_copy_begin:
lb s0, 0(sp)
sb s0, 0(a1)

addiu sp, sp, 1
subu s1, sp, fp
addiu a1, a1, 1

beq s1, zero, itoa_copy_done
nop

j itoa_copy_begin
nop

itoa_copy_done:
li s0, 0
sb s0, 0(a1)

move v0, a1

lw a0, 16(fp)
lw a1, 20(fp)
lw s0, 4(fp)
lw s1, 0(fp)
// stack frame
move sp, fp
lw fp, 12(sp)
addiu sp, sp, 16

jr ra
nop

.end itoa

最佳答案

您可以将其包含在您的代码中,就在 itoa_div_begin 的正上方:

li t0, 0x40000000
and t0, a0, t0
beqz t0, itoa_div_begin
nop
li t0, 45
sb t0, 0(a1)
addi a1, a1, 1
not a0, a0
addi a0, a0, 1

itoa_div_begin:

什么是:
  • 通过检查 MSB 是否为 1 来检查负数
  • 如果是,请插入 -结果,和
  • 对函数的其余部分使用数字的二进制补码
  • 关于assembly - itoa 负数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20133354/

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