Добавил:
владимир Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
24.09.2025
Размер:
4.18 Кб
Скачать
// Найти и вывести в out_o количество вхождений a[2:0] в sw_i без пересечений.
// Пример: a[2:0] = 010, sw_i = 0...01101_0101.
// Результат вычислений: out_o = 0...01.

// -1 это все единицы, так как это инверсия нуля
// в инструкции только 23 бита под константу, фактически же можно хранить 32-битные числа

//J B WS ALUop RA1 RA2 const WA
0 0 00 00000000000000000000010 00001 // загрузить константу a (a[2:0]) регистр 1
//0 0 00 00000000000010010001010 00010 // загрузить константу sw_i=1162 в регистр 2
0 0 10 00000000000000000000000 00010 // загрузить значение с входа sw_i в регистр 2 (если хочу проверить, надо бы здесь задать константу)
0 0 00 00000000000000000000111 00011 // загрузить константу 7 в регистр 3: это будет маска
0 0 00 00000000000000000011101 00110 // загрузить константу 29 в регистр 6 (здесь хранится то, сколько раз нужно сделать битовый сдвиг маски)
0 0 01 00001 00011 00110 00000000 00011// битовый сдвиг влево 29 раз, чтобы из 0...0111 сделать 1110...0
0 0 00 00000000000000000000000 01010 // загрузить константу 0 в регистр 10 (здесь будет храниться ответ)
0 0 00 00000000000000000000000 00101 // загрузить константу 0 в регистр 5 (здесь будет храниться результат операции "И" над маской и операцией)
0 0 00 00000000000000000000000 00111 // загрузить константу 0 в регистр 7 (здесь будет храниться результат битового сдвига числа из регистра 5)
0 0 00 00000000000000000000001 01000 // загрузить константу 1 в регистр 8 (она нужна для счетчика и для изменения числа битовых сдвигов в регистре 6)
0 0 00 00000000000000000000011 01001 // загрузить константу 3 в регистр 9 (она нужна чтобы хранить 3 - на столько изменится битовый сдвиг, если мы получили совпадение)
0 0 00 00000000000000000100000 01011 // загрузить константу 32 в регистр 11 (здесь храним условие выхода из цикла)

0 0 00 00000000000000000000000 00100 // загрузить константу 0 в регистр 4 (тут будет храниться счетчик цикла)
1 0 00 00000 01010 00000 00001010 00000 // jump loop (jump 10)

//L_equal:
0 0 01 00101 00011 01001 00000000 00011 //srl x3 x3 x9
0 0 01 00000 01010 01000 00000000 01010 //add x10 x10 x8
0 0 01 01000 00110 01001 00000000 00110 //sub x6 x6 x9
0 0 01 00000 00100 01001 00000000 00100 //add x4 x4 x9
1 0 00 00000 01010 00000 00000101 00000 // jump loop (jump 5)

//L_not_equal:
0 0 01 00101 00011 01000 00000000 00011 //srl x3 x3 x8
0 0 01 01000 00110 01000 00000000 00110 //sub x6 x6 x8
0 0 01 00000 00100 01000 00000000 00100 //add x4 x4 x8
1 0 00 00000 01010 00000 00000001 00000 // jump loop (jump 1)

//loop:
0 1 00 11111 00100 01011 00000111 00000 //bge x4 x11 exit (if x4 >= x11 then jump 7)
0 1 00 11101 00000 00110 00000110 00000 //bge x0 x6 exit (if x0 >= x6 then jump 6)
0 0 01 00111 00010 00011 00000000 00101 //and x5 x2 x3
0 0 01 00101 00101 00110 00000000 00111 //srl x7 x5 x6
0 1 00 11000 00001 00111 11110011 00000 //beq x1 x7 L_equal (jump -13)
0 1 00 11001 00001 00111 11110111 00000 //bne x1 x7 L_not_equal (jump -9)
1 0 00 00000 01010 00000 11111010 00000 //jump loop (jump -6)

//exit:
1 0 00 00000 01010 00000 00000000 00000 //print x10
Соседние файлы в папке cybercobra из