реклама на сайте
подробности

 
 
> setjmp, в каком порядке сохраняются регистры в буфере jmp_buf
sKWO
сообщение May 25 2008, 17:12
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530



Народ, подскажите, в каком порядке сохраняются регистры, текущий pc и указатели стека(SP и Y), в буфере jmp_buf в компиляторе ИАР при использовании макро setjmp?
В Вин АВР всё прозрачно
Код
jmp_buf:
    offset    size    description
     0    16    call-saved registers (r2-r17)
    16     2    frame pointer (r29:r28)
    18     2    stack pointer (SPH:SPL)
    20     1    status register (SREG)
    21     2/3    return address (PC) (2 bytes used for <=128Kw flash)
    23/24 = total size

Чувствую что в ИАРе нужно внимательно изучать мап файл?
Дабы потом не рассказывать для чего оно мне нужно, приведу
пример кода написанного Rst7 , хотя по коду вопрос больше к автору
Код
  ((unsigned int *)rs_task)[10]=((unsigned int)rs_rstack)+7; //SP
  ((unsigned int *)rs_task)[8]=((unsigned int)rs_cstack)+64; //Y
  ((unsigned int *)rs_task)[9]=(unsigned int)RS_TRX; //Адрес перехода

просто, насколько я понимаю, то setjmp сохраняет текущий pc и указатели стека(SP и Y), и так званые localstore-регистры, остальными сохранениями заведует компилятор при переходе,
тогда непонятен размер буфера задачи ну и манипуляции с ним
Понимаю, что ВинАВР за уши притянут к аврам, у него один стек -- может в этом особенность?
всем заранее спасибо


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
meister
сообщение May 25 2008, 18:13
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484



Цитата(sKWO @ May 25 2008, 21:12) *
Народ, подскажите, в каком порядке сохраняются регистры


Прошагать setjmp слабо?

Сообщение отредактировал meister - May 25 2008, 18:14
Go to the top of the page
 
+Quote Post
sKWO
сообщение May 25 2008, 20:13
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530



Цитата(meister @ May 25 2008, 21:13) *
Прошагать setjmp слабо?

Да не особо, но слабо.
вырезка из листинга скомпилированного файла(мега8)
Код
   \   00000000 938A               ST      -Y, R24
   \   00000002   93FA               ST      -Y, R31
   \   00000004   93EA               ST      -Y, R30
   \   00000006   923A               ST      -Y, R3
   \   00000008   922A               ST      -Y, R2
   \   0000000A   921A               ST      -Y, R1
   \   0000000C   920A               ST      -Y, R0
   \   0000000E   937A               ST      -Y, R23
   \   00000010   936A               ST      -Y, R22
   \   00000012   935A               ST      -Y, R21
   \   00000014   934A               ST      -Y, R20
   \   00000016   933A               ST      -Y, R19
   \   00000018   932A               ST      -Y, R18
   \   0000001A   931A               ST      -Y, R17
   \   0000001C   930A               ST      -Y, R16
   \   0000001E   B78F               IN      R24, 0x3F
    122           if (!setjmp(main_task)) //Запомнили контекст осн. задачи
   \   00000020   ....               LDI     R16, LOW((iprx_task + 61))
   \   00000022   ....               LDI     R17, HIGH((iprx_task + 61))
   \   00000024   ....               RCALL   ?setjmp_0

меп файл, сегмент setjmp
Код
?setjmp_0               0000144E        TCP_init (main)
                                                   _sliprx (main)
                                                   _tcp_delay (main)
                                                   _txb (main)
                                                   delayint (main)
                                                   rxint (main)
                                                   txint (main)
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 0000144E, align: 1
  Segment part 1.             Intra module refs:   ?setjmp_0
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           ?setjmp_1               0000144E
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 0000144E, align: 1
  Segment part 2.             Intra module refs:   ?setjmp_1
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           ?setjmp_2               0000144E
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 0000144E, align: 1
  Segment part 3.             Intra module refs:   ?setjmp_2
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           ?setjmp_3               0000144E
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 0000144E, align: 1
  Segment part 4.             Intra module refs:   ?setjmp_3
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           ?setjmp_4               0000144E
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 0000144E, align: 1
  Segment part 5.             Intra module refs:   ?setjmp_4
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           ?setjmp_5               0000144E
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 0000144E, align: 1
  Segment part 6.             Intra module refs:   ?setjmp_5
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           ?setjmp_6               0000144E
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 0000144E, align: 1
  Segment part 7.             Intra module refs:   ?setjmp_6
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           ?setjmp_7               0000144E
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 0000144E, align: 1
  Segment part 8.             Intra module refs:   ?setjmp_7
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           ?setjmp_8               0000144E
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 0000144E, align: 1
  Segment part 9.             Intra module refs:   ?setjmp_8
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           ?setjmp_9               0000144E
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 0000144E, align: 1
  Segment part 10.            Intra module refs:   ?setjmp_9
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           ?setjmp_10              0000144E
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 0000144E, align: 1
  Segment part 11.            Intra module refs:   ?setjmp_10
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           ?setjmp_11              0000144E
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 0000144E - 00001451 (0x4 bytes), align: 1
  Segment part 12.            Intra module refs:   ?setjmp_11
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           ?setjmp_12              0000144E
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 00001452 - 00001453 (0x2 bytes), align: 1
  Segment part 13.            Intra module refs:   ?setjmp_0
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           ?setjmp_save_R15        00001452
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 00001454 - 00001455 (0x2 bytes), align: 1
  Segment part 14.            Intra module refs:   ?setjmp_1
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           ?setjmp_save_R14        00001454
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 00001456 - 00001457 (0x2 bytes), align: 1
  Segment part 15.            Intra module refs:   ?setjmp_2
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           ?setjmp_save_R13        00001456
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 00001458 - 00001459 (0x2 bytes), align: 1
  Segment part 16.            Intra module refs:   ?setjmp_3
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           ?setjmp_save_R12        00001458
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 0000145A - 0000145B (0x2 bytes), align: 1
  Segment part 17.            Intra module refs:   ?setjmp_4
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           ?setjmp_save_R11        0000145A
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 0000145C - 0000145D (0x2 bytes), align: 1
  Segment part 18.            Intra module refs:   ?setjmp_5
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           ?setjmp_save_R10        0000145C
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 0000145E - 0000145F (0x2 bytes), align: 1
  Segment part 19.            Intra module refs:   ?setjmp_6
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           ?setjmp_save_R9         0000145E
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 00001460 - 00001461 (0x2 bytes), align: 1
  Segment part 20.            Intra module refs:   ?setjmp_7
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           ?setjmp_save_R8         00001460
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 00001462 - 00001463 (0x2 bytes), align: 1
  Segment part 21.            Intra module refs:   ?setjmp_8
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           ?setjmp_save_R7         00001462
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 00001464 - 00001465 (0x2 bytes), align: 1
  Segment part 22.            Intra module refs:   ?setjmp_9
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           ?setjmp_save_R6         00001464
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 00001466 - 00001467 (0x2 bytes), align: 1
  Segment part 23.            Intra module refs:   ?setjmp_10
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           ?setjmp_save_R5         00001466
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 00001468 - 00001469 (0x2 bytes), align: 1
  Segment part 24.            Intra module refs:   ?setjmp_11
           ENTRY                   ADDRESS         REF BY
           =====                   =======         ======
           ?setjmp_save_R4         00001468
    -------------------------------------------------------------------------
CODE
  Relative segment, address: CODE 0000146A - 0000148D (0x24 bytes), align: 1
  Segment part 25.            Intra module refs:   ?setjmp_12

подкажите где здесь сохраняется текущий pc и указатели стека? 0x3F - это регистр статуса. Код приведённый в первом посте не из этой оперы


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 17:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.0146 секунд с 7
ELECTRONIX ©2004-2016