2013-10-14 3 views
0

Я нашел этот фрагмент кода, который, как я считаю, преобразует целое число в шестнадцатеричное. Однако я не буду следовать за ним вообще. Я добавил комментарии, которые говорят, что я думаю, что происходит, но я понятия не имею, ПОЧЕМУ это делается. Итак, если я правильно заметил, что делал каждая строка, может кто-нибудь объяснить мне, почему это делается? Как в том, как это каким-либо образом помогает преобразовать в hex?MIPS Assembly: конвертировать из целого в шестнадцатеричный

$ a0 целое значение

$ a1 это адрес, где результат должен быть

 addi $t0, $0, 48  #set $t0 equal to 48 
     sb $t0, 0($a1)   #store $to (48) at location 0 in $a1 
     addi $t0, $0, 120  #set $t0 equal to 120 
     sb $t0, 1($a1)   #store $t0 (120) at location 1 in $a1 
     addi $t1, $a1, 9  #set $t1 = the address + 9 

LOOP: 

     andi $t0, $a0, 0xf #$t0 = 1 if $a0 and 0xf are the same (0xf = beginning of hex)? 

     slti $t2, $t0, 10  #if $t0 is less than 10, $t2 = 1, else 0 
     bne $t2, $0, DIGIT #if $t2 does not equal 0, branch to DIGIT 
     addi $t0, $t0, 48  #set $t0 equal to 48 
     addi $t0, $t0, 39  #set $t0 equal to 39 (why did we just write over the 48?) 
DIGIT: 

     sb $t0, 0($t1)  #set $t0 equal to whatever's in location 0 of $t1 

     srl $a0, $a0, 4  #shift right 4 bits 

     bne $a0, $0, LOOP  #if $a0 does not equal 0, branch to LOOP 
     addi $t1, $t1, -1  #set $t1 = $t1 - 1 

DONE: 

     jr $ra    #set the jump register back to $ra 
     nop 

ответ

1
slti $t2, $t0, 10  #if $t0 is less than 10, $t2 = 1, else 0 
    bne $t2, $0, DIGIT #if $t2 does not equal 0, branch to DIGIT 
    addi $t0, $t0, 48  #set $t0 equal to 48 
    addi $t0, $t0, 39  #set $t0 equal to 39 (why did we just write over the 48?) 

MIPS использует слоты задержки ветви, а это означает, что команда после команды перехода всегда выполняется до того, как ветка берется (или не берется).

Так что это говорит: «Если $ t0 меньше 10 (т. Е. В диапазоне 0..9), перейдите к DIGIT, но сначала добавьте 48 (ASCII '0') независимо от значения $ t0. Если бы ветка не была взята, то значение $ t0 первоначально находилось в диапазоне 10..15 и теперь будет в диапазоне 58..63, поэтому мы добавили еще 39, чтобы получить значение в диапазоне 97..102 (коды ASCII для 'a' .. 'f') ".

+0

ohhh, поэтому он преобразует его в ASCII, а затем код ASCII входит в каждую цифру? – user2869231

+0

Вид. Конечным результатом является строка, которая представляет собой всего лишь массив символов (ASCII). – Michael

+0

А ... Я не понимал, что гекс - это строка. Понял, что это номер, написанный в другом формате. Это определенно помогает .. Спасибо! – user2869231

Смежные вопросы