Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Препроцессор не хочет сам рассчитать константу .asm  (Прочитано 478 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн gosh.ka

  • Автор темы
  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
/* Memory regions usage */
#define ELINS_ZLIB_SIZE     262140U
#define ELINS_USB_SIZE      65536U
#define ELINS_ETH_SIZE      65536U
#define ELINS_STACK_SIZE    65536U
#define ELINS_SCREEN_SIZE   1048576U

#define ELINS_MEM_TOP       0x8f000000U //(unsigned int)(cpuboard_property->sdram_size)
#define ELINS_RESERVED1_BASE   (ELINS_MEM_TOP-     ELINS_SCREEN_SIZE)
#define ELINS_RESERVED2_BASE   (ELINS_RESERVED1_BASE-     ELINS_SCREEN_SIZE)
#define ELINS_SCREEN_BASE   (ELINS_RESERVED2_BASE-     ELINS_SCREEN_SIZE)
#define ELINS_ZLIB_BASE     (ELINS_SCREEN_BASE- ELINS_ZLIB_SIZE)
#define ELINS_ETH_BASE      (ELINS_ZLIB_BASE -  ELINS_ETH_SIZE)
#define ELINS_USB_BASE      ((ELINS_ETH_BASE -  ELINS_USB_SIZE) | 0xa0000000)    /* в некэшируемом адресном пространстве */
#define ELINS_STACK_BASE    (ELINS_ETH_BASE -   ELINS_USB_SIZE - ELINS_STACK_SIZE) /* grow down */
#define ELINS_STACK   

 move  r0, ELINS_STACK_BASE

Цитировать
gcc -Wp,-MD,,vectors.tmp   -G0 -c -o  vectors.tmp  vectors.S
vectors.S: Assembler messages:
vectors.S:186: Error: missing ')'
vectors.S:186: Error: missing ')'
vectors.S:186: Error: missing ')'
vectors.S:186: Error: missing ')'
vectors.S:186: Error: missing ')'
vectors.S:186: Error: missing ')'
vectors.S:186: Error: missing ')'
vectors.S:186: Error: missing ')'
vectors.S:186: Error: missing ')'
vectors.S:186: Error: missing ')'
vectors.S:186: Error: missing ')'
vectors.S:186: Error: missing ')'
vectors.S:186: Error: missing ')'
vectors.S:186: Error: missing ')'
vectors.S:186: Error: missing ')'
vectors.S:186: Error: missing ')'
vectors.S:186: Error: missing ')'
vectors.S:186: Error: missing ')'
vectors.S:186: Error: Illegal operands `move r0,((((((0x8f000000U-1048576U)-1048576U)-1048576U)-262140U)-65536U)-65536U-65536U)'


Как победить?
« Последнее редактирование: 13 Февраль 2012, 14:49:43 от gosh.ka »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Препроцессор и не должен ни чего считать. Считает в итоге компилятор.
test.c
Код: (C) [Выделить]
/* Memory regions usage */
#define ELINS_ZLIB_SIZE     262140U
#define ELINS_USB_SIZE      65536U
#define ELINS_ETH_SIZE      65536U
#define ELINS_STACK_SIZE    65536U
#define ELINS_SCREEN_SIZE   1048576U

#define ELINS_MEM_TOP       0x8f000000U //(unsigned int)(cpuboard_property->sdram_size)
#define ELINS_RESERVED1_BASE   (ELINS_MEM_TOP-     ELINS_SCREEN_SIZE)
#define ELINS_RESERVED2_BASE   (ELINS_RESERVED1_BASE-     ELINS_SCREEN_SIZE)
#define ELINS_SCREEN_BASE   (ELINS_RESERVED2_BASE-     ELINS_SCREEN_SIZE)
#define ELINS_ZLIB_BASE     (ELINS_SCREEN_BASE- ELINS_ZLIB_SIZE)
#define ELINS_ETH_BASE      (ELINS_ZLIB_BASE -  ELINS_ETH_SIZE)
#define ELINS_USB_BASE      ((ELINS_ETH_BASE -  ELINS_USB_SIZE) | 0xa0000000)    /* в некэшируемом адресном пространстве */
#define ELINS_STACK_BASE    (ELINS_ETH_BASE -   ELINS_USB_SIZE - ELINS_STACK_SIZE) /* grow down */

unsigned long test_test()
{
return ELINS_STACK_BASE;
}

gcc -E test.c
# 1 "test.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "test.c"
# 17 "test.c"
unsigned long test_test()
{
 return ((((((0x8f000000U - 1048576U)- 1048576U)- 1048576U)- 262140U) - 65536U) - 65536U - 65536U);
}
Как можно заметить препроцессор ничего не считает
Скомпилируем исходник
gcc -s test.c
test_test:
.LFB0:
        .cfi_startproc
        pushl   %ebp
        .cfi_def_cfa_offset 8
        .cfi_offset 5, -8
        movl    %esp, %ebp
        .cfi_def_cfa_register 5
        movl    $-1899429884, %eax
        popl    %ebp
        .cfi_def_cfa 4, 4
        .cfi_restore 5
        ret
        .cfi_endproc
смотрим на строчку 8 и видим итоговое значение которое записывается в регистр, константу посчитал компилятор

Оффлайн gosh.ka

  • Автор темы
  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Спасибо.
Разобрался.
Если в константах убрать завершающую букву U (unsigned), подключенные в .h  #define, начали компилироватся как из C так и из asm.

Почму это так- не понял.

 

Страница сгенерирована за 0.072 секунд. Запросов: 25.