itoa为负数?

时间:2013-11-21 22:33:57

标签: assembly mips

Bounty:为提供代码的任何人提供+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

1 个答案:

答案 0 :(得分: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:

做什么:

  • 通过检查MSB是否为1
  • 来检查负数
  • 如果是,请在结果中插入-,然后
  • 使用函数其余部分的二进制补码