ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
16 августа
44370 Топик полностью
ShiphT (18.11.2005 15:22, просмотров: 1) ответил Ruslan на Вот код
Мда... Есть такой моментик.... Причем даже с полностью выключенной оптимизацией во второй функции код внутри оператора условия
    in_data = Y - 1;
  else if (in_data < -Y)
    in_data = -Y;
даже не компилируется и в листиге вместо этого оператора вообще какая-то лажа... Причем если изменить константу 0x10000000 на единицу в любую сторону, либо делать какое-то действие с in_data в условии (например корректное if(in_data+1 > Y)), либо изменить константу на 1 и использовать условие "строго больше", то все ок. Мда.. Глючокс... Приводимый листинг
     22          signed int scale2 (signed long in_data)
     23          {
     24            in_data += (1L << 12);
   \                     scale2:
   \   00000000   8021               MOV         R1,#+0x80
   \   00000002   4901               LSL         R1,R1,#+0x5        ;; #+0x1000
   \   00000004   4018               ADD         R0,R0,R1
     25          
     26            if (in_data >= Y)
   \   00000006   0101               LSL         R1,R0,#+0x4        ;; SignExt     R1,R0,#+0x4,#+0x4
   \   00000008   0911               ASR         R1,R1,#+0x4
   \   0000000A   8842               CMP         R0,R1
   \   0000000C   04D0               BEQ         ??scale2_0
   \   0000000E   C017               ASR         R0,R0,#+0x1F
   \   00000010   C143               MVN         R1,R0
   \   00000012   0007               LSL         R0,R0,#+0x1C
   \   00000014   0909               LSR         R1,R1,#+0x4
   \   00000016   0843               ORR         R0,R1
     27              in_data = Y - 1;
     28            else if (in_data < Z)
     29              in_data = Z;
     30          
     31            return (in_data >> 13);
   \                     ??scale2_0:
   \   00000018   4013               ASR         R0,R0,#+0xD
   \   0000001A   7047               BX          LR                 ;; return
     32          }
О каком знаковом расширении полученной константы он хочет сказать в сторчке с адресом 00000006 и что он делает в строчках 0000000E-00000016???