2016-11-27 4 views
0

В настоящее время я работаю над домашним заданием, которое вставляет значение бит (0x0 или 0x1) в n-ю позицию.MIPS сборка неправильно сдвигается

.macro insert_to_nth_bit($regD, $regS, $regT, $maskReg) 
    # regD: bit pattern in which to be inserted at nth position 
    # regS: position n (0-31) 
    # regT: the bit to insert (0x0 or 0x1) 
    # maskReg: temporary mask 
            # Let's say regD = 00000101 
    sllv $maskReg, $maskReg, $regS # Let's say regS = 2, the second position at regD(0) 
            # maskReg = 00000010 after shifting 
    not $maskReg, $maskReg   # maskReg = 11111101 
    and $regD, $regD, $maskReg  # regD = 00000101 
    sllv $regT, $regT, $regS  # regT = 00000001, we want to insert 1 into the 2nd position at regD 
            # regT = 00000010 after shifting 
    or $regD, $regD, $regT   # 00000101 OR 00000010 = 00000111. The bit is what i wanted 
.end_macro 

Вот макрос я написал, чтобы проверить его

.text 
.globl main 
la $t0, 0x00000101 #t0 = 00000101 
la $t1, 2  # nth position = 2 
la $t2, 0x1 # insert 0x1 
la $t3, 1  # maskReg = 00000001 
insert_to_nth_bit($t0, $t1, $t2, $t3) 
print_int($t0) 
exit 

print_int и exit два других небольших макросов

В результате я получаю 261, который 00000105 после того как я преобразован в шестнадцатеричную , Когда я отлаживаю его, я заметил, что когда дело доходит до первой смены, 00000001 и сдвиг влево 2 становится 00000005, что испортит все это. Интересно, неправильная ли логика моего макроса или способ проверки моего макроса неправильны, поэтому он испортил мой вывод?

+0

1 сдвинутый два раза влево - 4, или 0x101 - 0x105. В чем проблема? –

+0

@SamiKuhmonen Я думаю, что я только что понял это, вместо того чтобы пропустить 2 в $ t1, я должен пройти 4 в $ t1. Мне просто интересно, правильна ли логика этого макроса? – user21478621

ответ

1

Ваш макрос правильный, основанный на контексте.

Но, maskReg нуждается в одном. Вы устанавливаете этот за пределами макро. И вы используете la для инициализации постоянных значений. li был бы более обычным выбором.

Я бы удалил la $t3,1 и добавил li $maskReg,1 в качестве первой строки макроса.

В этом весь смысл макросов: уменьшить количество повторяющихся шагов.

+0

Большое вам спасибо! – user21478621

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