|
|
  |
Странный asm код, после компиляции в Keil |
|
|
|
Apr 25 2010, 07:20
|
Группа: Участник
Сообщений: 14
Регистрация: 21-07-09
Пользователь №: 51 428

|
Си знаю хорошо, а вот с кейлом только начинаю, тем не менее это поставило меня в ступор. простой код Цитата U8 i for(i = 0; i < 255; i++);//задержка который я бы "скомпилировал" бы так Цитата mov r0, 0xFF; LOOP: djnz r0, LOOP; компилируется в бесконечный цикл с непонятным колдовством в теле Цитата 0B: CLR A; 0C: MOV R7, A; 0D: MOV A, R7; //СЮДА ЦИКЛ ПРЫГАТЬ БУДЕТ 0E: MOV R5, A; 0F: RLC A; //какие-то сдвиги 10: SUBB A, 0xE0; //какие-то непонятные константы 12: MOV R4, A; 13: CLR C; 14: MOV A, R5; 15: SUBB A, #0xFE; //какие-то вычитания 17: MOV A, R4; 18: XRL A, #P0 (0x80); // там был адрес указан, а не P0 1A: SUBB A, #P0 (0x80); // он что, ещё и с портом решил поработать зачем-то???? 1C: JNC C:21; // я так понял выход из цикла, зачем??? 1E: INC R7; //R7 я так понял, это счётчик i 1F: SJMP C:0D;//наверх //так и убрали бы всё кроме этих двух команд 21: Мне собственно было бы всё равно, если б цикл выполнялся правильно, но он зависает в бесконечном цикле!!! как в этом может быть ошибка??? Цитата U8 i for(i = 0; i < 255; i++);//задержка ЗЫ Кейл юВижн 3.6
Сообщение отредактировал greatbaobab - Apr 25 2010, 07:27
|
|
|
|
|
Apr 26 2010, 08:19
|

Местный
  
Группа: Участник
Сообщений: 235
Регистрация: 28-01-05
Из: Санкт-Петербург
Пользователь №: 2 276

|
Добрый день. Хе хе  Не злобы ради и не для рекламы OnembeddingДля того что бы получить в коде конструкцию на DJNZ Код unsigned char i;
i=0; do{
}while(--i); В общем в Keil для 8051 идет прямая интерпретация. Типа если хотим DJNZ, то по смыслу нужно ставить именно преддекремент. По этой причине лучше всегда использовать развернутый код (ну не сворачивать в одну строку. Конечно на Си будет компактно, но компилятор наворотит такой код что просто жуть. И никакая оптимизация по размеру не поможет). Проверял на собственном опыте. Просто подизассемблите разные куски кода на Си. И зависимость сразу увидите. PS Ой и совсем забыл. Все зависит от модели памяти. Для однозначности переменную пихаем в регистр. Код [b]register[/b]unsigned char i; А то если ваша переменная окажется в области xdata то без перегрузки в регистр Keil еще круче наворотит. Будет постоянно обращаться к xdata через DPTR. Если переменная будет в PDATA то хоть @R0 будет использовать.
Сообщение отредактировал AndreyS - Apr 26 2010, 08:23
--------------------
Удачи.
|
|
|
|
|
Apr 26 2010, 13:02
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(AndreyS @ Apr 26 2010, 12:19)  По этой причине лучше всегда использовать развернутый код (ну не сворачивать в одну строку. Конечно на Си будет компактно, но компилятор наворотит такой код что просто жуть. И никакая оптимизация по размеру не поможет). Проверял на собственном опыте. Просто подизассемблите разные куски кода на Си. И зависимость сразу увидите. Не замечал, чтобы Keil генерил какой-то невнятный код. Конечно, иногда транслятору нужно подсказать, например, в какую память распределить те или иные данные... А, по поводу оптимизации в Keil: при установке уровня оптимизации нужно смотреть, что Вы заставляете транслятор оптимизировать (неплохо бы почитать об этом в документации), а не ставить тупо, например, "Level 9"...
|
|
|
|
|
Apr 26 2010, 14:05
|

Местный
  
Группа: Участник
Сообщений: 235
Регистрация: 28-01-05
Из: Санкт-Петербург
Пользователь №: 2 276

|
Цитата(Палыч @ Apr 26 2010, 17:02)  Не замечал, чтобы Keil генерил какой-то невнятный код. Конечно, иногда транслятору нужно подсказать, например, в какую память распределить те или иные данные... А, по поводу оптимизации в Keil: при установке уровня оптимизации нужно смотреть, что Вы заставляете транслятор оптимизировать (неплохо бы почитать об этом в документации), а не ставить тупо, например, "Level 9"... День добрый. Офтопик. Я в общем то говорил о том, что Keil использует одни и те же конструкции при одном и том же типе памяти. И оптимизация может помочь немного. Но оптимально получается сразу использовать определенные конструкции на Си. Все это (лично мое мнение) я отношу именно для Си под 8051 и его системе команд. Стандарт Си, на сколько мне известно, не определяет как конкретно реализовывать код в машинных кодах.
--------------------
Удачи.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|