Jump to content

    
Sign in to follow this  
Intel4004

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

Recommended Posts

Quote

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

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

Quote

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

 

Share this post


Link to post
Share on other sites
11 minutes ago, k155la3 said:

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

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

 

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
43 minutes ago, VladislavS said:

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

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

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

 

 

 

 

Share this post


Link to post
Share on other sites
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.

Sign in to follow this