itoa为负数?

MrP*_*le5 5 assembly mips

赏金:为提供代码的任何人提供+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
Run Code Online (Sandbox Code Playgroud)

Pat*_*rik 6

您可以在上面的代码中包含此内容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:
Run Code Online (Sandbox Code Playgroud)

什么是:

  • 通过检查MSB是否为1来检查负数
  • 如果是这样,插入-结果,和
  • 对函数的其余部分使用数字的二进制补码