Hi, All!
Продолжаем. Но ведь интересно же, где они умудрились наколотся? "Закат солнца вручную", смотрим на 1.a90 и 1.hex ========= 1.a90 :020000020000FC Стартовый адрес сегмента 0, за ним явно таблица векторов. :100000000C94EC7F189518951895189518951895D7 :100010001895189518951895189518951895189578 :100020001895189518951895189518951895189568 :100030001895189518951895189518951895189558 :100040001895189518951895189518951895189548 :100050001895189518951895189518951895189538 :100060001895189518951895189518951895189528 :100070001895189518951895189518951895189518 :100080001895189518951895189518950000000062 :100090000000000000000000000000000000000060 это пошёл foo1[]
:10FF70000000000000000000000000000000000081 За ним - стартап и main() :10FF8000000000000000000000000000792F682F32 :10FF900080E090E01AC021E030E0A9010E940480D6 :10FFA000102FECE8F0E0E80FF91F2491E2E3F0E015 :10FFB00031E0E80FF91F3BBF0691020F010F21E06E :10FFC00030E0A9010E941080019680300FEF900769 :10FFD00010F3862F972F08950FE30DBF01E00EBF9A :10FFE000C0E2D1E00E9414800E94C67F0E94168069 :10FFF0000C941680E199FECF08954F5F5F4FFADFB2 немного не влезли в первые 64К, переваливаем
:020000021000EC сегментный адрес 1000, это к последующим адресам добавлять
0x00010000
:100000004EBB5FBBE09A0895FADF0DB308954F5FD2 :100010005F4F4EBB5FBBF894E29AE19A0FBE089522 :100020000FB6E8DF0DBBF5CF01E00895000088951D :10003000FECF0000000000000000000000000000F3 :1000400000000000000000000000000000000000B0 foo2[]
:10FF100000000000000000000000000000000000E1 :10FF200000000000000000000000000000000000D1 :02FF30000000CF :00000001FF Всё, конец. Никаких претензий. Теперь берём постлиноквский.
========= 1.hex :020000040000FA Стартовый линейный адрес 0x00000000
:040000000C94EC7FF1 Это был jmp на запускалку А где же вектора? Впрочем, в hex-файле записи не обязаны быть отсортированными.
:10008C000000000000000000000000000000000064 foo1[]
:10FF7C000000000000000000000000000000000075 запускалка и код
:10FF8C00792F682F80E090E01AC021E030E0A901C1 :10FF9C000E940480102FECE8F0E0E80FF91F249188 :10FFAC00E2E3F0E031E0E80FF91F3BBF0691020FEE :10FFBC00010F21E030E0A9010E94108001968030F1 :10FFCC000FEF900710F3862F972F08950FE30DBFB7 :10FFDC0001E00EBFC0E2D1E00E9414800E94C67FF7 :10FFEC000E9416800C941680E199FECF08954F5F05 :04FFFC005F4FFADF7A Аналогично, не влезло :020000040001F9 Внимание! К адресам ВСЕХ записей после этого приписывается старшие 16 бит как 0x0001 (т.е. добавляется 0x00010000).
:100000004EBB5FBBE09A0895FADF0DB308954F5FD2 :100010005F4F4EBB5FBBF894E29AE19A0FBE089522 :100020000FB6E8DF0DBBF5CF01E00895000088951D :02003000FECF01
:020000040001F9 Опять то же самое, не нужно, но и не мешает. Так было удобно, перед началом новой секции просто поставить запись её стартового адреса (я только за такие байторасточительные подходы :-)
:1000320000000000000000000000000000000000BE :1000420000000000000000000000000000000000AE
foo2[]
:10FF020000000000000000000000000000000000EF :10FF120000000000000000000000000000000000DF :10FF220000000000000000000000000000000000CF
Опаньки! Пошла таблица векторов, но БЕЗ именно ЕЁ стартового адреса. Итого вместо адресов 0x00000004 и далее она легла в
0x00010004 и далее! Именно это показал fc/b с бинарниками и на это выругался avreal.
:100004001895189518951895189518951895189584 :100014001895189518951895189518951895189574 :100024001895189518951895189518951895189564 :100034001895189518951895189518951895189554 :100044001895189518951895189518951895189544 :100054001895189518951895189518951895189534 :100064001895189518951895189518951895189524 :100074001895189518951895189518951895189514 :080084001895189518951895C0 :00000001FF
Перед векторами очень нехватает записи ":020000040000FA", но её там нет.
Остаётся накатать баг-репорт и отправить в IAR.
Atmel winavr тоже (как минимум был) любитель не там, где надо поставить запись расширенной адресации в hex, подобное длинное письмо было от меня пару лет назад.
wbr, p.s.
formatting link