Jump to content

    

Keil C51 внезапно начал генерить странный код.

Recommended Posts

Intel4004
Quote

Ну, теоретически - можетбыть. Софт сунулся в сеть, получил инф "стоп-лафа" и все лечение пропало.

Если бы "лечение" пропало - было бы проще. Это видно сразу. Оно бы просто компиляться перестало. А тут именно тихий саботаж, который легко можно и не заметить. Хорошо, что у меня в прошивке есть цикл в котором переменная уменьшается на остаток от деления. И этот цикл стал вечным. Такое не заметить трудно.

Quote

Может быть просто несовместимость с конкретной ОС. Я компилировал на Win7/32. "Исправный-старый" код-листинг на какой ОС компилировался ?

Система та-же самая, что год назад, что сейчас. Не переставлялась. Win7/64.

Share this post


Link to post
Share on other sites

Intel4004

Короче сейчас буду экспериментировать в виртуалке с русской/английской виндой, с доступом в инет и без доступа, с отматываением даты на год назад, и т.д.

Share this post


Link to post
Share on other sites

k155la3

Я пока вижу завязку на опцию NOAREGS. Ну, еще подкорректировал бы соответствие типов-размерностей переменных.

Странно то, что компилятор не выдает warning на присваивание char = long.

 

Share this post


Link to post
Share on other sites

Intel4004
11 minutes ago, k155la3 said:

Я пока вижу завязку на опцию NOAREGS. Ну, еще подкорректировал бы соответствие типов-размерностей переменных.

Странно то, что компилятор не выдает warning на присваивание char = long.

 

Полгода назад тот-же самый компилятор, тот-же самый исходник, с теми-же самыми настройками (NOAREGS в частности) компилировал правильно.

Сейчас неправильно.

Т.е. за эти полгода произошло что-то, сделавшее компилятор нерабочим и не имеющее отношения к компилятору или исходникам - к версии компилятора, настройкам(NOAREGS в частности), типам-размерностям переменных, и т.д.

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

Share this post


Link to post
Share on other sites

VladislavS

Я вообще не понямаю какого рожна там происходит. Ну загрузили два 32-битных беззнаковых аргумента, вызвали функцию. От результа надо взять один байт. Что там за хрень вместо этого происходит?

Share this post


Link to post
Share on other sites

k155la3
43 minutes ago, VladislavS said:

Я вообще не понямаю какого рожна там происходит. Ну загрузили два 32-битных беззнаковых аргумента, вызвали функцию. От результа надо взять один байт. Что там за хрень вместо этого происходит?

В этом посте  В первом листинге, после вызова ф-ии LCALL  ?C?ULDIV, непонятно, как происходит возврат результата из нее.

ТС утверждает, что опции проекта, версия компилятора и ОС не изменялись.

 

 

 

 

Share this post


Link to post
Share on other sites

Intel4004
1 hour ago, VladislavS said:

Я вообще не понямаю какого рожна там происходит. Ну загрузили два 32-битных беззнаковых аргумента, вызвали функцию. От результа надо взять один байт. Что там за хрень вместо этого происходит?

По спецификации вызовов функция возвращает результат в регистрах R4-R7.

Функция ?C?ULDIV в регистрах R4-R7 возвращает результат деления, а в регистрах R0-R3 - остаток от деления.

Поэтому когда нам нужен остаток - компилятор сначала приводит возврат функции к спецификации, т.е. перекладывает R0-R3 в R4-R7, а дальше действует по накатанной - забирает один байт R7.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.