Я пытаюсь создать приложение для контроля температуры для процессора 68000.В настоящее время я использую GCC 8.2.0.Я компилирую с флагом -msoft-float.Тем не менее, подпрограммы библиотеки с плавающей запятой кажутся сломаннымиПример:
'000174f4 <__ltdf2>:'
'174f4: 4e56 0000 linkw %fp,#0'
'174f8: 4878 0001 pea 1 <ADD>'
'174fc: 2f2e 0014 movel %fp@(20),%sp@-'
'17500: 2f2e 0010 movel %fp@(16),%sp@-'
'17504: 2f2e 000c movel %fp@(12),%sp@-'
'17508: 2f2e 0008 movel %fp@(8),%sp@-'
'1750c: 61ff bsrs 1750d <__ltdf2+0x19>'
'1750e: ffff .short 0xffff'
'17510: fd94 .short 0xfd94'
'17512: 4e5e unlk %fp'
'17514: 4e75 rts'
'17516: 4e71 nop'
Может кто-нибудь объяснить, почему генерируется этот код или что здесь происходит?Ни в коем случае 68000 не перейдет на нечетный адрес.
ОБНОВЛЕНИЕ Я копался в этом, и проблема, кажется, вводится во время соединения.Выгрузка кода для этой функции из libgcc.a показывает следующее:
`00000000 <__ltdf2>:`
` 0: 4e56 0000 linkw %fp,#0`
`4: 4878 0001 pea 1 <__ltdf2+0x1>`
` 8: 2f2e 0014 movel %fp@(20),%sp@-`
` c: 2f2e 0010 movel %fp@(16),%sp@-`
`10: 2f2e 000c movel %fp@(12),%sp@-`
`14: 2f2e 0008 movel %fp@(8),%sp@-`
`18: 61ff 0000 0000 bsrl 1a <__ltdf2+0x1a>`
`1e: 4e5e unlk %fp`
` 20: 4e75 rts`
Таким образом, компоновщик должен пытаться заполнить смещение ветви и испортить.Поскольку источником этой функции является строка макросов, я не уверен, куда она действительно хотела перейти.