Сверточный кодер на ассемблере
05.10.2015, 18:49. Показов 1177. Ответов 0
здравствуйте. необходимо объяснить, каким образом реализуется сверточное кодирование без использования операции xor.
1)Этот листинг я подробно прокомментировал и все разобрал(взято из ida pro,ассемблер для проца TMS320C54x).
Но я честно не понимаю как здесь реализуется кодирование без xor. Скорость кодера 1/2, порождающие полиномы G0 = 1+ D2 + D3 + D5 + D6, G1 = 1+ D + D2 + D3 + D6, ограниченная длина 8 бит(7бит -память кодера + 1 входной бит)
Может у кого-нибудь есть советы, в какую сторону копать?
Буду благодарен за любую помощь.
Assembler | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| [RIGHT][LEFT]ROM:5B0D sub_5B0D:
ROM:5B0D ld #0, DP //загрузить в DP(Data pointer) 0. Дает возможность использовать для хранения данных адреса от 0x60 to 0x7F
ROM:5B0E stm #7Fh, @loc_60 //сохранить в переменную @loc_60 маску 0x7F
ROM:5B10 stm #1, @loc_61 //сохранить в переменной @loc_61 флаг 1
ROM:5B12 mvmm AR4, AR1 //сохранить в регистре AR1 значение регистра AR4
ROM:5B13 ld #-4, ASM // в (accumulator shift mode bits)ASM загрузить значении -4
ROM:5B14
ROM:5B14 loc_5B14:
ROM:5B14 sftl A, 1 //сдвиг влево регистра A на 1 бит(сдвиговый регистр готов для приема входного бита)
ROM:5B15 and @loc_60, A //обнулить биты 7-31(память нашего кодера должна быть постоянна и равна 7 бит)
ROM:5B16 or *AR2+, A //загрузить входной бит из *AR2+ (кодируемая строка) в регистр A
ROM:5B17 stl A, ASM, AR0 //загрузить в регистр AR0 биты с 3-6 сдвигового регистра, (7-31 биты сброшены в ноль)
ROM:5B18 and #0Fh, A, B //загрузить в регистр B биты 0-3 сдвигового регистра
ROM:5B1A neg B //дополнение до двух значения регистра B(т.е. получаем дополнительный код , или отрицательной значение)
//процедура, выполняемая в следующем цикле эквивалентна значению xor, т.к сдесь мы на 1 входной бит получаем 2 выходных за 2 итерации
ROM:5B1B rptbd loc_5B24 //внутренний цикл выполняется пока значение BRC>=0
ROM:5B1D pshm BRC //сохраняем значение BRC в стеке
ROM:5B1E ld BL, T //загрузить в регистр T значение регистра B(T= -B)
ROM:5B1F mvdk *AR4+, AR5 //загрузить в регистр AR5 значение из ячейки *AR4(когда brc=1, то AR5=0x6D92; когда brc=0, то AR5=0x6D72)
ROM:5B21 mar *AR5+0 //сумма регистра AR5 и AR0: AR5=AR5+AR0
ROM:5B22 ld *AR5, TS, B //сдвинуть значение в AR5 на T бит вправо, загрузить результат в регистр B
ROM:5B23 and @loc_61, B //сбросить все биты кроме нулевого в ноль(получаем результат работы кодера)
ROM:5B24
ROM:5B24 loc_5B24:
ROM:5B24 stl B, *AR3+ //сохранить выходной бит в буфере для результата кодирования
ROM:5B25 banzd loc_5B14, *AR7- //пока AR7 не ноль переход на метку loc_5B14
ROM:5B27 mvmm AR1, AR4 //восстановить указатель AR4
ROM:5B28 popm BRC //достать из стека значение BRC[/LEFT][/RIGHT] |
|
2)это листинг сверточного кодера со скоростью 1/2, образующими полиномами G0 = 33, G1 = 27 и
с ограниченной длиной 5 бит (4 бита -память кодера + 1 входной бит). Просто для примера, как выглядит код с применением xor
Assembler | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| start
stm #input,AR2 ;set AR2 –> input buffer
stm #output,AR3 ;set AR3 –> output buffer
stm #nwords–1,BRC ;set loop counter to [(number of bits)/16]–1
rptb endloop–1 ;repeat for each 16–bit input
ld *ar2+,16,a ;load X(n) thru X(n–15) into A upper accumulator
or *ar2–,a ;load X(n–16) thru X(n–31) into A lower accumulator
ld *ar2+,16,b ;load X(n) thru X(n–15) into B upper accumulator
or *ar2,b ;load X(n–16) thru X(n–31) into B lower accumulator
xor b,3,a ;A = X(n) XOR X(n–3)
xor b,4,a ;A = X(n) XOR X(n–3) XOR X(n–4)
xor b,1,a ;A = X(n) XOR X(n–1) XOR X(n–3) XOR X(n–4)
sth a,*ar3+ ;save as G0, point AR3 to next output word
xor b,1,a ;A = X(n) XOR X(n–3) XOR X(n–4)
;(removes previous X(n–1) term)
xor b,2,a ;A = X(n) XOR X(n–2)
sth a,*ar3+ ;save as G1, point AR3 to next output word
endloop |
|
0
|