[an error occurred while processing this directive]
|
Работавший код вдруг перестал работать - перестал записывать данные в массив. после получаса нетрадиционного секса полез в асм, что наплодил сабж.
Исходник:
for (i=0;i<44;i++) {
s1 = irq_buf[i*2];
s2 = irq_buf[i*2+1];
s3 = ((s1>>10)&0xF)|((s2>>6)&0xF0);
irq_buf[i] = s3;
}
Вот что сохранил компилер:
.line 62
MOV #0, *(#_i) ; |156|
MOV #44, AR2 ; |156|
MOV *(#_i), AR1 ; |156|
CMP AR1 >= AR2, TC1 ; |156|
|| NOP ; avoids Silicon Exception CPU_24
BCC L4,TC1 ; |156|
; branch occurs ; |156|
L3:
.line 63
MOV AR1, T0 ; |157|
SFTL T0, #1 ; |157|
AMOV #_irq_buf, XAR3 ; |157|
MOV *AR3(T0), AR1 ; |157|
MOV AR1, *(#_s1) ; |157|
.line 64
MOV *(#_i), T0 ; |158|
SFTL T0, #1 ; |158|
ADD #1, T0 ; |158|
MOV *AR3(T0), AR1 ; |158|
MOV AR1, *(#_s2) ; |158|
.line 65
Здесь видно, что в Т0 вычисляется индекс для каждой итерации и считывается память в MOV *AR3(T0), AR1
Вот что показывает окно дизассемблера (и View -> Mixed Source/ASM)
0150BA e631000148c9 MOV #0,*(#148c9h)
0150C0 76002ca8 MOV #44,AR2
0150C4 a9310148c9 MOV *(#148c9h),AR1
0150C9 1298a0_21 CMP AR1 >= AR2, TC1 || NOP
0150CD 04645d BCC L4,TC1
0150D0 L3:
0150D0 2294 MOV AR1,T0
0150D2 5040 SFTL T0,#1
0150D4 ec31be01270b AMAR *(#1270bh),XAR3
0150DA a96b MOV *AR3(AR0),AR1
0150DC c9310148cb MOV AR1,*(#148cbh)
0150E1 a4310148c9 MOV *(#148c9h),T0
0150E6 5040 SFTL T0,#1
0150E8 4014 ADD #1,T0
0150EA a96b MOV *AR3(AR0),AR1
0150EC c9310148cc MOV AR1,*(#148cch)
0150F1 a0310148cb MOV *(#148cbh),AC0
Здесь тоже Т0 выполняет туже функцию, но считывается MOV *AR3(AR0),AR1. При этом AR0 при трассировании имеет значение далеко отличное от Т0 - естественно считывается не пойми что....
Не буду резюмировать - пусть гуру скажут, может я не прав?
Почему код в окне дизасемблера отличается от сгенерированного компилером? Который реально грузится в проц?
Спасибо
E-mail: info@telesys.ru