где ошибка в моем коде MIPS? - PullRequest
1 голос
/ 14 сентября 2009

мне нужна помощь. Я написал этот код в MARS. Предполагается получить целое число от пользователя и преобразовать его в HEX. Я шел по нему часами, и, насколько я понимаю, он должен работать нормально. Я включил только часть цикла и вывод программы, так как это единственная часть, которая не работает. Может ли кто-то, пожалуйста, указать, где код идет не так? Спасибо.

P.S. Я думаю, что это портит побитовое И, я использовал это, чтобы замаскировать младшие биты, но по некоторым причинам почти кажется, что это ДОБАВЛЕНИЕ, а не ИДИ. : - (

   li $s1, 8                    # Set up a loop counter

Loop:

   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 ]

4 голосов
/ 15 сентября 2009

Вы по крайней мере маскируете с неправильной константой:

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.

3 голосов
/ 14 сентября 2013

В дополнение к неправильной константе ваши значения ASCII установлены неправильно. «A» в ASCII представлен числом 65. В своем коде вы добавляете 64 к результату вашей скользящей маски. Если последние четыре бита были равны 10 (десятичному), другими словами, $ t0 содержит десятичное число 10, ваш код вычитает 10 из $ t0. Таким образом, $ t0 будет иметь десятичный результат 0. Когда вы добавите 64 к этому, ваш код получит значение ASCII для символа @.

http://www.asciitable.com/

...