我的MIPS代码中的错误在哪里?

时间:2009-09-14 19:13:13

标签: assembly mips mars-simulator

我需要帮助。我在MARS中编写了这段代码。它应该从用户接收一个整数,并将其转换为HEX。我已经花了好几个小时,据我所知,它应该可以正常工作。我只包括程序的循环和输出部分,因为这是唯一不起作用的部分。有人可以指出代码出错的地方吗?谢谢。

P.S。      我认为这是乱七八糟的AND,我用它来掩盖低位,但由于某种原因,它几乎看起来像是ADDing而不是AND。 : - (

   li $s1, 8                    # Set up a loop counter

循环:

   rol $s0, $s0, 4              # Roll the bits left by four bits - wraps highest bits to lowest bits (where we need them!)

   and $t0, $s0, 16           # Mask off low bits (logical AND with 000...01111)
   slti $t1, $t0, 10          # Determine if the bits represent a number less than 10 (slti)
   bne $t1, $zero, MakeLowDigit  # If yes (if lower than 9), go make a low digit

MakeHighDigit:

   subi $t0, $t0, 10            # Subtract 10 from low bits
   addi $t0, $t0, 64             # Add them to the code for 'A' (65), becomes a..f
   j DigitOut

MakeLowDigit:

   addi $t0, $t0, 47             # Combine it with ASCII code for '0', becomes 0..9 

DigitOut:

    move $a0, $t0               # Output the ASCII character
    li $v0, 11
    syscall

    subi $s1, $s1, 1            # Decrement loop counter
    bne $s1, $zero, Loop        # Keep looping if loop counter is not zero

2 个答案:

答案 0 :(得分:4)

你至少掩盖了错误的常数:

and $t0, $s0, 16               # Mask off low bits (logical AND with 000...01111)

整数16具有位模式...010000,即它非常多地以四个结尾。你想要15,即16 - 1。

通常,要创建一个设置了n位的右调整位掩码,您需要进行计算 2 n -1,其中C表示法为(1 << n) - 1

答案 1 :(得分:3)

除了滚动错误的常量外,您的ASCII值设置不正确。 ASCII中的'A'由数字65表示。在您的代码中,您将滚动掩码的结果添加64。如果最后四位等于10(十进制),换句话说$ t0包含十进制10,则代码从$ t0中减去10。因此,$ t0的小数结果为0.当你向它添加64时,你的代码将获得@字符的ASCII值。

http://www.asciitable.com/