Перейти к содержанию
    

vova7890

Участник
  • Постов

    42
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные vova7890


  1. Всем привет. В общем, озадачился я реализацией сией фукнции на ARMv5. Функция, помимо зеркалирования памяти(ну тут понятно, можно через mmu), должна уметь зеракалировать файлы. Идея в реализации одна - обрабатывать датааборты на чтение виртуально "не существующей" памяти и там уже читать файл, предварительно вернувшись в usr режим и продолжая выполнять чтение уже в контексте программы. Но, чтобы определить, что, как, куда и откуда читает, нужно узнать тип инструкции и адрес чтения/ записи. Вот этот момент меня и интересует. Получается, нужно какбы "эмулировать" инструкцию, тоесть узнать какой тип данных она пишет/читает(byte, hword, word) и номера регистров с которых читают и куда пишут. Я правильно понимаю логику, или есть более простые пути нежели емулировать инструкции? Пытался найти ответ в исходниках линукса, ничего интересного так и не нашёл. Если тут и вправду нужна эмуляция, подскажите где можно посмотреть реализцию. А то в этих опкодах чёрт ногу сломит...

  2. Ни та, ни другая инструкция не позволяет обратиться к произвольному адресу. Обе упомянутые Вами инструкции используют относительную адресацию. Команда ldr использует 12-битное смещение относительно содержимого базового регистра. Команда b использует 24-битное смещение относительно содержимого регистра pc.

     

    ну правильно, а шоб оно создало верный относительный адрес нужна статическая релокация, которую gas не указывает, а матерится.

  3. ...

     

    Прикол в том что я не могу в секции где ldr pc ещё что нибудь обьявить, места нету.

    Иар сгенерил такой вот опкод F4F01FE5

     

    FSWI_PATCH2:A13A5328; ===========================================================================
    FSWI_PATCH2:A13A5328
    FSWI_PATCH2:A13A5328; Segment type: Pure code
    FSWI_PATCH2:A13A5328                 AREA FSWI_PATCH2, CODE, READWRITE, ALIGN=0
    FSWI_PATCH2:A13A5328            ; ORG 0xA13A5328
    FSWI_PATCH2:A13A5328                 CODE32
    FSWI_PATCH2:A13A5328 main_jumper     DCD swi_handler    ; DATA XREF: FSWI_PATCH1:A13A5414r
    FSWI_PATCH2:A13A5328; FSWI_PATCH2   ends
    FSWI_PATCH2:A13A5328
    FSWI_PATCH1:A13A5414; ---------------------------------------------------------------------------
    FSWI_PATCH1:A13A5414; ===========================================================================
    FSWI_PATCH1:A13A5414
    FSWI_PATCH1:A13A5414; Segment type: Pure code
    FSWI_PATCH1:A13A5414                 AREA FSWI_PATCH1, CODE, READWRITE, ALIGN=0
    FSWI_PATCH1:A13A5414            ; ORG 0xA13A5414
    FSWI_PATCH1:A13A5414                 CODE32
    FSWI_PATCH1:A13A5414                 LDR     PC, =swi_handler
    FSWI_PATCH1:A13A5414; FSWI_PATCH1   ends
    FSWI_PATCH1:A13A5414

     

    Если сделать тупо

        .section    FSWI_PATCH1, "ax", %progbits
        .int 0xE51FF0F4

     

    То работает, но не вариант, там адреса могут быть разные :(

  4. Невозможно уместить в 4 байта загрузку произвольно расположенной переменной, так как сам адрес переменной уже занимает 4 байта.

    Если я правильно понял задачу...

     

    > ldr pc, var

    иар создаёт 4х байтовый опкод

     

    > b myfunc

    гцц создаёт 4х байтовый опкод

  5. Что не работает? Не компилируется? или myfunction не работает?

     

    Компилируется но не работает. Там у меня патчится свихендлер, и места под первую секцию ровно на одну комманду. b main вроде как раз и занимает 4 байта, но почему-то не работает свихендлер, из за чего аппарат уходит в аут, точнее даже возможно в вечный цикд или гдето повис, хз.

     

    ReAl, ldr r0, =var не катит, она какого-то фига разворачивается на 8 байт. А именно гцц делает примерно так:

     

    ldr r0, =var

    offset: dcd var

     

    чет типа такого.

  6.           .section    section1, "ax", %progbits
              .arm
              ldr     pc, var
    
               .section    section2, "ax", %progbits
    var:     .int    myfunction

     

    Error: internal_relocation (type: OFFSET_IMM) not fixed up

     

    Собственно чяднт, и как это умудряется делать иар?

  7. я без скрипта собираю. Якобы дефолтный. По -verbose выводит какой-то скрипт, который заставляет падать лоадер... Загрузчик заточен под сборку без скрипта. Можно без него как-то обойтись?

  8. Здраствуйте. В процессе познания мира натыкнулся на необходимость запихнуть все данные "как есть" в отдельную секцию, получить стартовый аддрес этой секции и размер. В общем с секциями я хотел решить проблему так

     

    volatile int __section_begin;
    
    // Сдесь будут находится переменные, которые нужно собрать без оптимизации
    //Например
    volatile const int test = 12;
    volatile SomeStruct data = {2, 3, 4};
    
    volatile int __section_end;

     

    Код собирается, и даже размер секции правильно расчитывает, только фишка в том что нада вычитать не __section_end - __section_begin, а наоборот о_О. С нулевой оптимизацией все нормально, только хотелось бы решить эту проблему внутри файла, без задавания параметров компилятору. Пробовал прагмой задать оптимизацию, в варнинге увидел что она игнорирована, та же ситуация и с аттрибутом. Что посоветуете?

     

    gcc 4.6.0

  9. нашел какую то старую либгсс, попробовал прилинковать - собралось. Но функция vsprintf(исходник нашел в гугле работоспособность проверена) не смогла побороть float и double. На флоате все зависло а дубль не правильно преобразовало :(

     

    1. Как собрать гсс вместе с libgcc.a?

    2. Как можно проверить работоспособность этих либ?

     

  10. Собирая констркции конвертации double в float и наоборот гсс попросил много функций для работы с такими операциями. Почти все функции я нашел гугле, но остались 2 функции которых нигде нету, в libgcc.a их нет. Где их взять?

     

    __aeabi_dcmplt
    __aeabi_dcmpeq

     

    зы. gcc 4.5.2 самозборный

    собирал так

    ./configure --target=arm-eabi --prefix=/usr --enable-interwork --enable-languages="c,c++" --with-float=soft --with-libgcc

  11. Товарисч, arm-none-eabi-gcc-4.5.2.exe(т.е. то, чего советовали) это немного не arm-elf-gcc

     

    а вы товарисч предлагает использовать arm-none-eabi-gcc-4.5.2.elf?(линукс) И че как бы гсс не по стандартам еаби собирает? Де скачать на линукс?

     

    скачал первое что нашел гсс старый arm-unknown-linux-gnueabi-gcc-4.1.1

     

    скомпилял и уррррраааа!!!! Почти :-D

     

    Получил на выходе 55.20001, че 1 в конце? :-D

     

    дайте ссылку пожалуйста, не могу найти (

     

    Нашел arm-none-eabi последней версии, начал компилять, он ругнулся на конструкцию с asm("swi NUMBER"); В чем фишка?

     

    static inline long do_SWI0(const int swi_num )
    {
        long ret_val;
    
        asm volatile (
            "swi %1    \n\t" \
            "mov %0, r0 \n\t" \
            :    "=r" (ret_val)
            :    "n" (swi_num)
    
            :    "r0", "r1", "r2", "r3", "ip", "lr", "memory", "cc"
        );
    
        return ret_val;
    }

     

    include/swiadd.h: In function 'do_SWI0':

    include/swiadd.h:35:2: warning: asm operand 1 probably doesn't match constraints

    include/swiadd.h:35:2: error: impossible constraint in 'asm'

     

     

  12. нет, гсс`ые инклуды я поудалял и не использую, у меня все функции в прошивке которые я вызываю по адресу. Так что у меня свои инклуды. От гсс я требую только компиляции, больше ничего

  13. скорректируйте до полного разжевывания компилятору:

    float  a = 55.2;
    char s[50];
    sprintf(&s[0], "%f", a);

    и проверить, что возвращает sprintf.

    А какая реализация sprintf поддерживается в вашей библиотеке?

     

    гсс разжовывать безтолку, он такой же самый сгенерил код. Оптимизатор то работает :) Реализация спринтфа самая какая ни есть стандартная. Я ж говорю гсс не правильно передал параметры в функцию, поэтому такая лабуда... :crying:

  14. Для ARM существует стандарт на передачу параметров - EABIА ваш GCC поддерживает EABI? Возможно у вас старая версия, которая его не поддерживала? Какая версия компилятора, какая сборка? Компилятор какой командой вызывается - arm-elf-gcc / arm-none-eabi-gcc или еще какой?

     

    P.S. а на безграмотное первое сообщение с понтами могли бы и не дождаться ответа.

     

    И шож там такого безграмотного? Если вы невнимательно читали, то я тут при чем?

    Видимо никто не читал первый пост, я ж написал GCC 4.5.2!

    компиляю так:

    arm-elf-gcc -c -msoft-float -mlittle-endian -mcpu=arm926ej-s -Os -I include -nostdlib -fwide-exec-charset=cp1251 main.c

    ну и там линкер ещё..

     

    Это не имеет значения. Корректно написанный код на языке программирования должен давать верный результат при выполнении.

     

    ага, я догадывался

     

    Можете привести исходный текст, который при компиляции IAR дает один результат, а при компиляции GCC - другой?

     

    приводил уже, первый пост - невидимка.

     

    char s[56]={0};

    sprintf(s, "%f", 55.2);

  15. Забыл сказать, функция sprintf является прошивочной и от компилятора не зависит

     

    да и не только спринф, многие функции работаеют не так, ибо число другое получается

     

    в буфере(gcc): 2D302E303030303030 (-0.000000)

    в буфере(iar): 35352E323030303030 (55.20000)

     

     

  16. Пишу на гсс 4.5.2.Кароче заметил что спринтф не правильно схавал флоат, я отдизасмил и сравнил с дизасмом иара

     

    char s[56]={0};

    sprintf(s, "%f", 55.2);

     

    дизасм гсс:

                    MOV     R0, SP
                    LDR     R1, =unk_4A6
                    LDR     R2, =0x404B9999
                    LDR     R3, =0x9999999A

     

    дизасм иара:

                    LDR     R3, =0x404B9999
                    LDR     R2, =0x9999999A
                    MOV     R0, SP
                    ADR     R1, dword_58

     

    как видно регистры R2 R3 перепутаны.

     

    LDR R2, =0x404B9999

    LDR R3, =0x9999999A

     

    LDR R3, =0x404B9999

    LDR R2, =0x9999999A

     

     

    Че делать?

     

     

     

  17. .text:00000560                 EXPORT start
    .text:00000560 start
    .text:00000560
    .text:00000560 var_10          = -0x10
    .text:00000560
    .text:00000560                 STMFD   SP!, {R4,R5,LR}
    .text:00000564                 MOV     R5, #0x80; 'А'
    .text:00000568                 SUB     SP, SP, #4
    .text:0000056C                 MOV     R0, R5
    .text:00000570                 SWI     0x14
    .text:00000574                 MOV     R4, R0
    .text:00000578                 MOV     R0, R4
    .text:0000057C                 MOV     R1, R5
    .text:00000580                 SWI     0x11D
    .text:00000584                 STR     R4, [SP,#0x10+var_10]
    .text:00000588                 SWI     0x16
    .text:0000058C                 MOV     R5, R0
    .text:00000590                 MOV     R5, #1
    .text:00000594                 MOV     R0, R5
    .text:00000598                 MOV     R1, R4
    .text:0000059C                 SWI     0x148
    .text:000005A0                 MOV     R5, R0
    .text:000005A4                 MOV     R0, R4
    .text:000005A8                 SWI     0x15
    .text:000005AC                 BL      sub_50C
    .text:000005B0                 MOV     R0, #0
    .text:000005B4                 ADD     SP, SP, #4
    .text:000005B8                 LDMFD   SP!, {R4,R5,PC}

    static inline int sprintfa(char *dst, char *mft, ...)
    {
        int ret_val;
        static int const swi_num = 22;
        asm volatile (
            "swi %1    \n\t" \
            "mov %0, r0 \n\t" \
            :    "=r" (ret_val)
            :    "n" (swi_num), "m" (dst)                                    // ругалось на  "memory" что нету "memory"(аргумент)
            :    "r0", "r1", "r2", "r3", "ip", "lr", "memory", "cc"
        );
        return ret_val;
    }

×
×
  • Создать...