我需要帮助。我在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
答案 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值。