2016-11-27 7 views
0

현재 n 번째 위치에 비트 값 (0x0 또는 0x1)을 삽입하는 숙제를하고 있습니다. 여기 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_intexit 두 개의 다른 작은 매크로

내가 진수로 변환 한 후 00000105이다 나는 261이다 얻을 결과이다 내가 그것을 테스트하기 위해 쓴 매크로입니다 . 디버깅 할 때, 나는 첫 번째 쉬프트에서 00000001과 왼쪽 쉬프트 2가 00000005가된다는 것을 알아 차렸다. 내 매크로의 논리가 잘못되었거나 내 매크로를 테스트하는 방식이 잘못되어 내 결과가 엉망이 되었습니까?

+0

1을 두 번 왼쪽으로 두 번 이동하면 4, 0x101이면 0x105가됩니다. 문제가 무엇입니까? –

+0

@SamKuhmonen 나는 $ t1에 2를 전달하는 대신 $ t1에 4를 전달해야한다고 생각했습니다. 이 매크로의 논리가 옳은지 궁금합니다. – user21478621

답변

1

문맥에 따라 매크로가 정확합니다.

그러나 maskReg에는 하나가 필요합니다. 매크로를 외부로 사전 설정 중입니다. 그리고 la을 사용하여 상수 값을 초기화합니다. li이 더 일반적인 선택 일 것입니다.

la $t3,1을 제거하고 li $maskReg,1을 매크로의 첫 번째 줄에 추가하십시오.

매크로의 전체적인 점은 반복되는 단계의 수를 줄이는 것입니다.

+0

정말 고마워요! – user21478621