Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 19.03.2008, 11:24   #1
el_eng
Senior Member
 
Регистрация: 07.03.2008
Адрес: Украина, Донецк
Сообщений: 108
Вес репутации: 292/45
el_eng is a jewel in the roughel_eng is a jewel in the roughel_eng is a jewel in the rough
По умолчанию MPLAB IDE v8.02 - ошибка дизассемблирования кода

Здравствуйте, уважаемые коллеги!

Для приведенного примера в расширенном режиме PIC18F4525 MPLAB IDE v8.02 генерирует неверный дизассемблированный код, заменяя
операции взятия адреса и разыменования указателя NOP-инструкциями.
В то же время MPLAB SIM и реальный PIC работают, то есть скомпилировано правильно. Для традиционного режима этой ошибки нет.
И этой проблемы нет для MPLAB IDE v8. Использовался MCC18 v3.xx

Код:
 
#include <p18F4525.h>
 #ifdef __EXTENDED18__ //Служебная макрокоманда MCC18v3x
#pragma config XINST = ON // Extended CPU mode
 #else
#pragma config XINST = OFF // Traditional CPU mode
 #endif
typedef struct _QTID{
 unsigned char StkSize;
 rom struct _TaskId *pTID; //Указатель на структуру в ROM
};
#pragma udata TASK_QUEUE
ram far struct _QTID QTID[20]; // Массив структур
#pragma udata
char AddTaskToQEnd(rom struct _TaskId *pTID, unsigned char StkSize, unsigned char pQEnd)
{
struct _QTID *pQTID; // Указатель на структуру
unsigned char *pchar; // Указатель на байт
 pchar = &StkSize; // Инициализация указателя адресом параметра функции
 /*...*/
 pQTID = &QTID[20 - pQEnd]; // Определение адреса очередного элемента массива
 /* Копирование параметров функции в структуру по указателю */
/* Способ 1, нерациональный:
   приведение указателя на байт к типу указателя на структуру
   и его разыменование */
 *pQTID = *(struct _QTID *) pchar;
/* Способ 2, оптимальный:
   взятие адреса параметра функции, приведения к типу указателя на структуру
   и его разыменования */
 *pQTID = *(struct _QTID *) &StkSize;
 /*...*/
}
void main(void){}
Копия дизассемблированного кода для обоих режимов:
Код:
1:                 #include <p18F4525.h>
2:                  #ifdef __EXTENDED18__ //Служебная макрокоманда MCC18v3x
3:                 #pragma config XINST = ON // Extended CPU mode
4:                  #else
5:                 #pragma config XINST = OFF // Traditional CPU mode
6:                  #endif
7:                 
8:                 typedef struct _QTID{
9:                  unsigned char StkSize;
10:                 rom struct _TaskId *pTID; //Указатель на структуру в ROM
11:                };
12:                
13:                #pragma udata TASK_QUEUE
14:                ram far struct _QTID QTID[20]; // Массив структур
15:                #pragma udata
16:                
17:                char AddTaskToQEnd(rom struct _TaskId *pTID, unsigned char StkSize, unsigned char pQEnd)
  002C    CFD9     MOVFF 0xfd9, 0xfe6
  002E    FFE6     NOP
  0030    CFDA     MOVFF 0xfda, 0xfe6
  0032    FFE6     NOP
  0034    CFE1     MOVFF 0xfe1, 0xfd9
  0036    FFD9     NOP
  0038    CFE2     MOVFF 0xfe2, 0xfda
  003A    FFDA     NOP
  003C    52E6     MOVF 0xfe6, F, ACCESS
  003E    52E6     MOVF 0xfe6, F, ACCESS
  0040    52E6     MOVF 0xfe6, F, ACCESS
  0042    52E6     MOVF 0xfe6, F, ACCESS
18:                {
19:                struct _QTID *pQTID; // Указатель на структуру
20:                unsigned char *pchar; // Указатель на байт
21:                
22:                 pchar = &StkSize; // Инициализация указателя адресом параметра функции
  0044    50D9     MOVF 0xfd9, W, ACCESS
  0046    0FFB     ADDLW 0xfb
  0048    6E00     MOVWF 0, ACCESS
  004A    0EFF     MOVLW 0xff
  004C    20DA     ADDWFC 0xfda, W, ACCESS
  004E    6E01     MOVWF 0x1, ACCESS
  0050    0E02     MOVLW 0x2
  0052    C000     MOVFF 0, 0xfdb
  0054    FFDB     NOP
  0056    0E03     MOVLW 0x3
  0058    C001     MOVFF 0x1, 0xfdb
  005A    FFDB     NOP
23:                 /*...*/
24:                 pQTID = &QTID[20 - pQEnd]; // Определение адреса очередного элемента массива
  005C    0EFA     MOVLW 0xfa
  005E    CFDB     MOVFF 0xfdb, 0xfe6
  0060    FFE6     NOP
  0062    0E14     MOVLW 0x14
  0064    52E5     MOVF 0xfe5, F, ACCESS
  0066    80D8     BSF 0xfd8, 0, ACCESS
  0068    54E7     SUBFWB 0xfe7, W, ACCESS
  006A    0D03     MULLW 0x3
  006C    CFF3     MOVFF 0xff3, 0
  006E    F000     NOP
  0070    CFF4     MOVFF 0xff4, 0x1
  0072    F001     NOP
  0074    0E80     MOVLW 0x80
  0076    2600     ADDWF 0, F, ACCESS
  0078    0E00     MOVLW 0
  007A    2201     ADDWFC 0x1, F, ACCESS
  007C    C000     MOVFF 0, 0xfde
  007E    FFDE     NOP
  0080    C001     MOVFF 0x1, 0xfdd
  0082    FFDD     NOP
25:                 /* Копирование параметров функции в структуру по указателю */
26:                /* Способ 1, нерациональный:
27:                   приведение указателя на байт к типу указателя на структуру
28:                   и его разыменование */
29:                 *pQTID = *(struct _QTID *) pchar;
  0084    0E02     MOVLW 0x2
  0086    CFDB     MOVFF 0xfdb, 0xfe9
  0088    FFE9     NOP
  008A    0E03     MOVLW 0x3
  008C    CFDB     MOVFF 0xfdb, 0xfea
  008E    FFEA     NOP
  0090    CFEE     MOVFF 0xfee, 0
  0092    F000     NOP
  0094    CFEE     MOVFF 0xfee, 0x1
  0096    F001     NOP
  0098    CFEF     MOVFF 0xfef, 0x2
  009A    F002     NOP
  009C    CFDE     MOVFF 0xfde, 0xfe9
  009E    FFE9     NOP
  00A0    CFDD     MOVFF 0xfdd, 0xfea
  00A2    FFEA     NOP
  00A4    C000     MOVFF 0, 0xfee
  00A6    FFEE     NOP
  00A8    C001     MOVFF 0x1, 0xfee
  00AA    FFEE     NOP
  00AC    C002     MOVFF 0x2, 0xfee
  00AE    FFEE     NOP
30:                /* Способ 2, оптимальный:
31:                   взятие адреса параметра функции, приведения к типу указателя на структуру
32:                   и его разыменования */
33:                 *pQTID = *(struct _QTID *) &StkSize;
  00B0    CFDE     MOVFF 0xfde, 0xfe9
  00B2    FFE9     NOP
  00B4    CFDD     MOVFF 0xfdd, 0xfea
  00B6    FFEA     NOP
  00B8    0EFB     MOVLW 0xfb
  00BA    CFDB     MOVFF 0xfdb, 0xfee
  00BC    FFEE     NOP
  00BE    0EFC     MOVLW 0xfc
  00C0    CFDB     MOVFF 0xfdb, 0xfee
  00C2    FFEE     NOP
  00C4    0EFD     MOVLW 0xfd
  00C6    CFDB     MOVFF 0xfdb, 0xfee
  00C8    FFEE     NOP
34:                 /*...*/
35:                }
  00CA    6E00     MOVWF 0, ACCESS
  00CC    0E04     MOVLW 0x4
  00CE    5CE1     SUBWF 0xfe1, W, ACCESS
  00D0    E202     BC 0xd6
  00D2    6AE1     CLRF 0xfe1, ACCESS
  00D4    52E5     MOVF 0xfe5, F, ACCESS
  00D6    6EE1     MOVWF 0xfe1, ACCESS
  00D8    5000     MOVF 0, W, ACCESS
  00DA    52E5     MOVF 0xfe5, F, ACCESS
  00DC    CFE5     MOVFF 0xfe5, 0xfda
  00DE    FFDA     NOP
  00E0    CFE7     MOVFF 0xfe7, 0xfd9
  00E2    FFD9     NOP
  00E4    0012     RETURN 0
36:                
37:                void main(void){}
  00E6    0012     RETURN 0
************************************************************************************
                   Теперь то же, но EXTENDED
************************************************************************************ 
1:                 #include <p18F4525.h>
2:                  #ifdef __EXTENDED18__ //Служебная макрокоманда MCC18v3x
3:                 #pragma config XINST = ON // Extended CPU mode
4:                  #else
5:                 #pragma config XINST = OFF // Traditional CPU mode
6:                  #endif
7:                 
8:                 typedef struct _QTID{
9:                  unsigned char StkSize;
10:                 rom struct _TaskId *pTID; //Указатель на структуру в ROM
11:                };
12:                
13:                #pragma udata TASK_QUEUE
14:                ram far struct _QTID QTID[20]; // Массив структур
15:                #pragma udata
16:                
17:                char AddTaskToQEnd(rom struct _TaskId *pTID, unsigned char StkSize, unsigned char pQEnd)
  00CA    CFD9     MOVFF 0xfd9, 0xfe6
  00CC    FFE6     NOP
  00CE    CFDA     MOVFF 0xfda, 0xfe6
  00D0    FFE6     NOP
  00D2    CFE1     MOVFF 0xfe1, 0xfd9
  00D4    FFD9     NOP
  00D6    CFE2     MOVFF 0xfe2, 0xfda
  00D8    FFDA     NOP
18:                {
19:                struct _QTID *pQTID; // Указатель на структуру
20:                unsigned char *pchar; // Указатель на байт
21:                
22:                 pchar = &StkSize; // Инициализация указателя адресом параметра функции
  00DE    50D9     MOVF 0xfd9, W, ACCESS
  00E0    0F01     ADDLW 0x1
  00E2    6EE6     MOVWF 0xfe6, ACCESS
  00E4    0E00     MOVLW 0
  00E6    20DA     ADDWFC 0xfda, W, ACCESS
  00E8    6EE6     MOVWF 0xfe6, ACCESS
  00EA    52E5     MOVF 0xfe5, F, ACCESS
  00EC    50E5     MOVF 0xfe5, W, ACCESS
  00EE    6E09     MOVWF [0x9]
  00F0    50E7     MOVF 0xfe7, W, ACCESS
  00F2    6E08     MOVWF [0x8]
23:                 /*...*/
24:                 pQTID = &QTID[20 - pQEnd]; // Определение адреса очередного элемента массива
  00F4    0E14     MOVLW 0x14
  00F6    80D8     BSF 0xfd8, 0, ACCESS
  00F8    5400     SUBFWB [0], W
  00FA    0D03     MULLW 0x3
  00FC    0E00     MOVLW 0
  00FE    24F3     ADDWF 0xff3, W, ACCESS
  0100    6E06     MOVWF [0x6]
  0102    0E00     MOVLW 0
  0104    20F4     ADDWFC 0xff4, W, ACCESS
  0106    6E07     MOVWF [0x7]
25:                 /* Копирование параметров функции в структуру по указателю */
26:                /* Способ 1, нерациональный:
27:                   приведение указателя на байт к типу указателя на структуру
28:                   и его разыменование */
29:                 *pQTID = *(struct _QTID *) pchar;
  010A    FFE9     NOP
  010E    FFEA     NOP
  0110    CFEE     MOVFF 0xfee, 0x46
  0112    F046     NOP
  0114    CFEE     MOVFF 0xfee, 0x47
  0116    F047     NOP
  0118    CFEF     MOVFF 0xfef, 0x48
  011A    F048     NOP
  011E    FFE9     NOP
  0122    FFEA     NOP
  0124    C046     MOVFF 0x46, 0xfee
  0126    FFEE     NOP
  0128    C047     MOVFF 0x47, 0xfee
  012A    FFEE     NOP
  012C    C048     MOVFF 0x48, 0xfee
  012E    FFEE     NOP
30:                /* Способ 2, оптимальный:
31:                   взятие адреса параметра функции, приведения к типу указателя на структуру
32:                   и его разыменования */
33:                 *pQTID = *(struct _QTID *) &StkSize;
  0132    FFE9     NOP
  0136    FFEA     NOP
  013A    FFEE     NOP
  013E    FFEE     NOP
  0142    FFEF     NOP
34:                 /*...*/
35:                }
  0146    CFE5     MOVFF 0xfe5, 0xfda
  0148    FFDA     NOP
  014A    CFE7     MOVFF 0xfe7, 0xfd9
  014C    FFD9     NOP
  014E    0012     RETURN 0
36:                
37:                void main(void){}
  0150    0012     RETURN 0
__________________
"Всё нужное не трудно, а всё трудное не нужно." Г.Сковорода
el_eng вне форума   Ответить с цитированием
Старый 19.03.2008, 13:24   #2
MBedder
Banned
 
Регистрация: 17.03.2008
Адрес: Москва
Сообщений: 222
Вес репутации: 202/0
MBedder has a spectacular aura aboutMBedder has a spectacular aura aboutMBedder has a spectacular aura about
По умолчанию Re: MPLAB IDE v8.02 - ошибка дизассемблирования кода

Ассемблер/компилятор все делает правильно, и может это делать не только в расширенном, но и в обычном режиме - лишь бы не в абсолютном. Просто многие переменные/метки в relocatable режиме НЕ определены на этапе ассемблирования, и конкретные значения им присваиваются ТОЛЬКО на этапе линковки. А чтобы ЛИНКЕРУ это было сделать проще, вместо таких неинициализированных переменных в объектном файле ассемблер/компилятор ставит нули, т.е. NOP
MBedder вне форума   Ответить с цитированием
Старый 20.03.2008, 13:41   #3
Bill
Senior Member
 
Аватар для Bill
 
Регистрация: 26.02.2007
Адрес: Челябинск
Возраст: 69
Сообщений: 2,215
Вес репутации: 1898/85
Bill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant future
По умолчанию Для начала лучше прочитать DS.

Там все прекрасно написано. Посмотрите раздел TWO-WORD INSTRUCTIONS. Глюк у Вас в голове. Или нет?
Bill вне форума   Ответить с цитированием
Старый 20.03.2008, 13:47   #4
MBedder
Banned
 
Регистрация: 17.03.2008
Адрес: Москва
Сообщений: 222
Вес репутации: 202/0
MBedder has a spectacular aura aboutMBedder has a spectacular aura aboutMBedder has a spectacular aura about
По умолчанию Re: Для начала лучше прочитать DS.

Тьфу ты, значит, и у меня тоже
MBedder вне форума   Ответить с цитированием
Старый 20.03.2008, 14:07   #5
Bill
Senior Member
 
Аватар для Bill
 
Регистрация: 26.02.2007
Адрес: Челябинск
Возраст: 69
Сообщений: 2,215
Вес репутации: 1898/85
Bill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant future
По умолчанию Ну, так ты же с PIC18 не работал.

Цитата:
Сообщение от MBedder Посмотреть сообщение
Тьфу ты, значит, и у меня тоже
Впрочем, я тоже. Просто, раньше здесь эта тема поднималась. DS у меня под рукой, я и глянул. Теперь буду знать.
Bill вне форума   Ответить с цитированием
Старый 20.03.2008, 18:30   #6
el_eng
Senior Member
 
Регистрация: 07.03.2008
Адрес: Украина, Донецк
Сообщений: 108
Вес репутации: 292/45
el_eng is a jewel in the roughel_eng is a jewel in the roughel_eng is a jewel in the rough
По умолчанию Re: MPLAB IDE v8.02 - ошибка дизассемблирования кода

Уважаемые форумчане!
Вы недостаточно внимательно прочли исходное сообщение. Против того, как в листинге выглядят TWO-WORD INSTRUCTIONS я ничего не имею.
Обращаю Ваше внимание на то, что для данного примера и _о_б_о_и_х_ режимов ядра PIC18F4525 при равных условиях MPLAB IDE v8.00 в противовес v8.02 генерирует Disassembly Listing, полностью соответствующий исходному тексту и компилированному коду.
Замеченная проблемка есть почему-то _т_о_л_ь_к_о_ при использовании EXTENDED режима ядра. И видна только при просмотре листинга, поскольку неправильна только визуализация. А просматривать листинг мне приходится в целях оптимизации кода ещё на этапе исходных текстов.
Поскольку мне пришлось восстановить v8.00, привожу соответствующую копию листинга для того же примера, которая меня устраивает.
Спасибо за внимание.
Код:
1:                 #include <p18F4525.h>
2:                  #ifdef __EXTENDED18__ //Служебная макрокоманда MCC18v3x
3:                 #pragma config XINST = ON // Extended CPU mode
4:                  #else
5:                 #pragma config XINST = OFF // Traditional CPU mode
6:                  #endif
7:                 
8:                 typedef struct _QTID{
9:                  unsigned char StkSize;
10:                 rom struct _TaskId *pTID; //Указатель на структуру в ROM
11:                };
12:                
13:                #pragma udata TASK_QUEUE
14:                ram far struct _QTID QTID[20]; // Массив структур
15:                #pragma udata
16:                
17:                char AddTaskToQEnd(rom struct _TaskId *pTID, unsigned char StkSize, unsigned char pQEnd)
  002C    CFD9     MOVFF 0xfd9, 0xfe6
  002E    FFE6     NOP
  0030    CFE1     MOVFF 0xfe1, 0xfd9
  0032    FFD9     NOP
  0034    0E04     MOVLW 0x4
  0036    26E1     ADDWF 0xfe1, F, ACCESS
18:                {
19:                struct _QTID *pQTID; // Указатель на структуру
20:                unsigned char *pchar; // Указатель на байт
21:                
22:                 pchar = &StkSize; // Инициализация указателя адресом параметра функции
  0038    50D9     MOVF 0xfd9, W, ACCESS
  003A    0FFC     ADDLW 0xfc
  003C    6E00     MOVWF 0, ACCESS
  003E    0EFF     MOVLW 0xff
  0040    20DA     ADDWFC 0xfda, W, ACCESS
  0042    6E01     MOVWF 0x1, ACCESS
  0044    0E02     MOVLW 0x2
  0046    C000     MOVFF 0, 0xfdb
  0048    FFDB     NOP
  004A    0E03     MOVLW 0x3
  004C    C001     MOVFF 0x1, 0xfdb
  004E    FFDB     NOP
23:                 /*...*/
24:                 pQTID = &QTID[20 - pQEnd]; // Определение адреса очередного элемента массива
  0050    0EFB     MOVLW 0xfb
  0052    CFDB     MOVFF 0xfdb, 0xfe6
  0054    FFE6     NOP
  0056    0E14     MOVLW 0x14
  0058    52E5     MOVF 0xfe5, F, ACCESS
  005A    80D8     BSF 0xfd8, 0, ACCESS
  005C    54E7     SUBFWB 0xfe7, W, ACCESS
  005E    0D03     MULLW 0x3
  0060    CFF3     MOVFF 0xff3, 0
  0062    F000     NOP
  0064    CFF4     MOVFF 0xff4, 0x1
  0066    F001     NOP
  0068    0E80     MOVLW 0x80
  006A    2600     ADDWF 0, F, ACCESS
  006C    0E00     MOVLW 0
  006E    2201     ADDWFC 0x1, F, ACCESS
  0070    C000     MOVFF 0, 0xfde
  0072    FFDE     NOP
  0074    C001     MOVFF 0x1, 0xfdd
  0076    FFDD     NOP
25:                 /* Копирование параметров функции в структуру по указателю */
26:                /* Способ 1, нерациональный:
27:                   приведение указателя на байт к типу указателя на структуру
28:                   и его разыменование */
29:                 *pQTID = *(struct _QTID *) pchar;
  0078    0E02     MOVLW 0x2
  007A    CFDB     MOVFF 0xfdb, 0xfe9
  007C    FFE9     NOP
  007E    0E03     MOVLW 0x3
  0080    CFDB     MOVFF 0xfdb, 0xfea
  0082    FFEA     NOP
  0084    CFEE     MOVFF 0xfee, 0
  0086    F000     NOP
  0088    CFEE     MOVFF 0xfee, 0x1
  008A    F001     NOP
  008C    CFEF     MOVFF 0xfef, 0x2
  008E    F002     NOP
  0090    CFDE     MOVFF 0xfde, 0xfe9
  0092    FFE9     NOP
  0094    CFDD     MOVFF 0xfdd, 0xfea
  0096    FFEA     NOP
  0098    C000     MOVFF 0, 0xfee
  009A    FFEE     NOP
  009C    C001     MOVFF 0x1, 0xfee
  009E    FFEE     NOP
  00A0    C002     MOVFF 0x2, 0xfee
  00A2    FFEE     NOP
30:                /* Способ 2, оптимальный:
31:                   взятие адреса параметра функции, приведения к типу указателя на структуру
32:                   и его разыменования */
33:                 *pQTID = *(struct _QTID *) &StkSize;
  00A4    CFDE     MOVFF 0xfde, 0xfe9
  00A6    FFE9     NOP
  00A8    CFDD     MOVFF 0xfdd, 0xfea
  00AA    FFEA     NOP
  00AC    0EFC     MOVLW 0xfc
  00AE    CFDB     MOVFF 0xfdb, 0xfee
  00B0    FFEE     NOP
  00B2    0EFD     MOVLW 0xfd
  00B4    CFDB     MOVFF 0xfdb, 0xfee
  00B6    FFEE     NOP
  00B8    0EFE     MOVLW 0xfe
  00BA    CFDB     MOVFF 0xfdb, 0xfee
  00BC    FFEE     NOP
34:                 /*...*/
35:                }
  00BE    6E00     MOVWF 0, ACCESS
  00C0    0E04     MOVLW 0x4
  00C2    5CE1     SUBWF 0xfe1, W, ACCESS
  00C4    E202     BC 0xca
  00C6    6AE1     CLRF 0xfe1, ACCESS
  00C8    52E5     MOVF 0xfe5, F, ACCESS
  00CA    6EE1     MOVWF 0xfe1, ACCESS
  00CC    5000     MOVF 0, W, ACCESS
  00CE    52E5     MOVF 0xfe5, F, ACCESS
  00D0    CFE7     MOVFF 0xfe7, 0xfd9
  00D2    FFD9     NOP
  00D4    0012     RETURN 0
36:                
37:                void main(void){}
  00D6    0012     RETURN 0
************************************************************************************
                   Теперь то же, но EXTENDED
************************************************************************************ 
1:                 #include <p18F4525.h>
2:                  #ifdef __EXTENDED18__ //Служебная макрокоманда MCC18v3x
3:                 #pragma config XINST = ON // Extended CPU mode
4:                  #else
5:                 #pragma config XINST = OFF // Traditional CPU mode
6:                  #endif
7:                 
8:                 typedef struct _QTID{
9:                  unsigned char StkSize;
10:                 rom struct _TaskId *pTID; //Указатель на структуру в ROM
11:                };
12:                
13:                #pragma udata TASK_QUEUE
14:                ram far struct _QTID QTID[20]; // Массив структур
15:                #pragma udata
16:                
17:                char AddTaskToQEnd(rom struct _TaskId *pTID, unsigned char StkSize, unsigned char pQEnd)
  00CA    CFD9     MOVFF 0xfd9, 0xfe6
  00CC    FFE6     NOP
  00CE    CFE1     MOVFF 0xfe1, 0xfd9
  00D0    FFD9     NOP
  00D2    E985     SUBFSR 0x2, 0x5
  00D4    E844     ADDFSR 0x1, 0x4
18:                {
19:                struct _QTID *pQTID; // Указатель на структуру
20:                unsigned char *pchar; // Указатель на байт
21:                
22:                 pchar = &StkSize; // Инициализация указателя адресом параметра функции
  00D6    50D9     MOVF 0xfd9, W, ACCESS
  00D8    0F01     ADDLW 0x1
  00DA    6EE6     MOVWF 0xfe6, ACCESS
  00DC    CFDA     MOVFF 0xfda, 0xfe6
  00DE    FFE6     NOP
  00E0    52E5     MOVF 0xfe5, F, ACCESS
  00E2    50E5     MOVF 0xfe5, W, ACCESS
  00E4    6E08     MOVWF [0x8]
  00E6    50E7     MOVF 0xfe7, W, ACCESS
  00E8    6E07     MOVWF [0x7]
23:                 /*...*/
24:                 pQTID = &QTID[20 - pQEnd]; // Определение адреса очередного элемента массива
  00EA    0E14     MOVLW 0x14
  00EC    80D8     BSF 0xfd8, 0, ACCESS
  00EE    5400     SUBFWB [0], W
  00F0    0D03     MULLW 0x3
  00F2    0E00     MOVLW 0
  00F4    24F3     ADDWF 0xff3, W, ACCESS
  00F6    6E05     MOVWF [0x5]
  00F8    0E00     MOVLW 0
  00FA    20F4     ADDWFC 0xff4, W, ACCESS
  00FC    6E06     MOVWF [0x6]
25:                 /* Копирование параметров функции в структуру по указателю */
26:                /* Способ 1, нерациональный:
27:                   приведение указателя на байт к типу указателя на структуру
28:                   и его разыменование */
29:                 *pQTID = *(struct _QTID *) pchar;
  00FE    EB07     MOVSF [0x7], 0xfe9
  0100    FFE9     NOP
  0102    EB08     MOVSF [0x8], 0xfea
  0104    FFEA     NOP
  0106    CFEE     MOVFF 0xfee, 0x46
  0108    F046     NOP
  010A    CFEE     MOVFF 0xfee, 0x47
  010C    F047     NOP
  010E    CFEF     MOVFF 0xfef, 0x48
  0110    F048     NOP
  0112    EB05     MOVSF [0x5], 0xfe9
  0114    FFE9     NOP
  0116    EB06     MOVSF [0x6], 0xfea
  0118    FFEA     NOP
  011A    C046     MOVFF 0x46, 0xfee
  011C    FFEE     NOP
  011E    C047     MOVFF 0x47, 0xfee
  0120    FFEE     NOP
  0122    C048     MOVFF 0x48, 0xfee
  0124    FFEE     NOP
30:                /* Способ 2, оптимальный:
31:                   взятие адреса параметра функции, приведения к типу указателя на структуру
32:                   и его разыменования */
33:                 *pQTID = *(struct _QTID *) &StkSize;
  0126    EB05     MOVSF [0x5], 0xfe9
  0128    FFE9     NOP
  012A    EB06     MOVSF [0x6], 0xfea
  012C    FFEA     NOP
  012E    EB01     MOVSF [0x1], 0xfee
  0130    FFEE     NOP
  0132    EB02     MOVSF [0x2], 0xfee
  0134    FFEE     NOP
  0136    EB03     MOVSF [0x3], 0xfef
  0138    FFEF     NOP
34:                 /*...*/
35:                }
  013A    E945     SUBFSR 0x1, 0x5
  013C    CFE7     MOVFF 0xfe7, 0xfd9
  013E    FFD9     NOP
  0140    0012     RETURN 0
36:                
37:                void main(void){}
  0142    0012     RETURN 0
__________________
"Всё нужное не трудно, а всё трудное не нужно." Г.Сковорода

Последний раз редактировалось el_eng; 20.03.2008 в 18:36.
el_eng вне форума   Ответить с цитированием
Старый 20.03.2008, 19:08   #7
MBedder
Banned
 
Регистрация: 17.03.2008
Адрес: Москва
Сообщений: 222
Вес репутации: 202/0
MBedder has a spectacular aura aboutMBedder has a spectacular aura aboutMBedder has a spectacular aura about
По умолчанию Re: MPLAB IDE v8.02 - ошибка дизассемблирования кода

Тогда укажи, команды по каким АДРЕСАМ тебе не нравятся, т.к. теперь уж точно вряд ли кто поймет, что ты имел в виду. "Если хочешь сказать мне слово - попытайся использовать рот"(с)БГ
MBedder вне форума   Ответить с цитированием
Старый 20.03.2008, 19:48   #8
el_eng
Senior Member
 
Регистрация: 07.03.2008
Адрес: Украина, Донецк
Сообщений: 108
Вес репутации: 292/45
el_eng is a jewel in the roughel_eng is a jewel in the roughel_eng is a jewel in the rough
По умолчанию Re: MPLAB IDE v8.02 - ошибка дизассемблирования кода

Извините за громоздкие вставки, теперь я цитирую только небольшие фрагменты тех же листингов и указываю адреса строк.
Не нравится, MPLAB 8.02:
Адреса, где хотел бы видеть дизассемблированный код:
010А-010E,
011E-0122
0132-0142
Код:
25:                 /* Копирование параметров функции в структуру по указателю */
26:                /* Способ 1, нерациональный:
27:                   приведение указателя на байт к типу указателя на структуру
28:                   и его разыменование */
29:                 *pQTID = *(struct _QTID *) pchar;
  010A    FFE9     NOP
  010E    FFEA     NOP
  0110    CFEE     MOVFF 0xfee, 0x46
  0112    F046     NOP
  0114    CFEE     MOVFF 0xfee, 0x47
  0116    F047     NOP
  0118    CFEF     MOVFF 0xfef, 0x48
  011A    F048     NOP
  011E    FFE9     NOP
  0122    FFEA     NOP
  0124    C046     MOVFF 0x46, 0xfee
  0126    FFEE     NOP
  0128    C047     MOVFF 0x47, 0xfee
  012A    FFEE     NOP
  012C    C048     MOVFF 0x48, 0xfee
  012E    FFEE     NOP
30:                /* Способ 2, оптимальный:
31:                   взятие адреса параметра функции, приведения к типу указателя на структуру
32:                   и его разыменования */
33:                 *pQTID = *(struct _QTID *) &StkSize;
  0132    FFE9     NOP
  0136    FFEA     NOP
  013A    FFEE     NOP
  013E    FFEE     NOP
  0142    FFEF     NOP
34:                 /*...*/
35:                }
Нравится, MPLAB 8.00:
Адреса, которые здесь "исправились":
00FE-0104
0112-0118
0126-0138
Код:
25:                 /* Копирование параметров функции в структуру по указателю */
26:                /* Способ 1, нерациональный:
27:                   приведение указателя на байт к типу указателя на структуру
28:                   и его разыменование */
29:                 *pQTID = *(struct _QTID *) pchar;
  00FE    EB07     MOVSF [0x7], 0xfe9
  0100    FFE9     NOP
  0102    EB08     MOVSF [0x8], 0xfea
  0104    FFEA     NOP
  0106    CFEE     MOVFF 0xfee, 0x46
  0108    F046     NOP
  010A    CFEE     MOVFF 0xfee, 0x47
  010C    F047     NOP
  010E    CFEF     MOVFF 0xfef, 0x48
  0110    F048     NOP
  0112    EB05     MOVSF [0x5], 0xfe9
  0114    FFE9     NOP
  0116    EB06     MOVSF [0x6], 0xfea
  0118    FFEA     NOP
  011A    C046     MOVFF 0x46, 0xfee
  011C    FFEE     NOP
  011E    C047     MOVFF 0x47, 0xfee
  0120    FFEE     NOP
  0122    C048     MOVFF 0x48, 0xfee
  0124    FFEE     NOP
30:                /* Способ 2, оптимальный:
31:                   взятие адреса параметра функции, приведения к типу указателя на структуру
32:                   и его разыменования */
33:                 *pQTID = *(struct _QTID *) &StkSize;
  0126    EB05     MOVSF [0x5], 0xfe9
  0128    FFE9     NOP
  012A    EB06     MOVSF [0x6], 0xfea
  012C    FFEA     NOP
  012E    EB01     MOVSF [0x1], 0xfee
  0130    FFEE     NOP
  0132    EB02     MOVSF [0x2], 0xfee
  0134    FFEE     NOP
  0136    EB03     MOVSF [0x3], 0xfef
  0138    FFEF     NOP
34:                 /*...*/
35:                }
Хотелось бы, чтобы Microchip увидел.
__________________
"Всё нужное не трудно, а всё трудное не нужно." Г.Сковорода
el_eng вне форума   Ответить с цитированием
Старый 20.03.2008, 23:53   #9
Bill
Senior Member
 
Аватар для Bill
 
Регистрация: 26.02.2007
Адрес: Челябинск
Возраст: 69
Сообщений: 2,215
Вес репутации: 1898/85
Bill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant future
По умолчанию Может глюк, а может и нет.

Во всяком случае, советую почитать DS. Там есть раздел SPECIAL CONSIDERATIONS WITH MICROCHIP MPLAB® IDE TOOLS. Вполне возможно, что в новой версии есть дополнительные опции, которых в 8.0 нет.
PS: Хорошая новая вещь должна "отлежаться" некоторый срок, прежде чем начать ее использование. Поэтому я предпочитаю пользоваться старыми, хорошо проверенными, инструментами и не спешу переходить на новые.
Bill вне форума   Ответить с цитированием
Старый 21.03.2008, 00:33   #10
lard
Senior Member
 
Регистрация: 17.10.2007
Сообщений: 578
Вес репутации: 170/49
lard has a spectacular aura aboutlard has a spectacular aura about
По умолчанию Re: MPLAB IDE v8.02 - ошибка дизассемблирования кода

Да и хрен с ним, работает ведь правильно
мне вот интересно какой смысл в инициализации адресом параметра функции в не расширенном режиме?
lard вне форума   Ответить с цитированием
Старый 21.03.2008, 09:07   #11
vanner
Junior Member
 
Регистрация: 26.02.2007
Сообщений: 23
Вес репутации: 102/46
vanner will become famous soon enoughvanner will become famous soon enough
По умолчанию Re: MPLAB IDE v8.02 - ошибка дизассемблирования кода

Уже много раз на этом форуме говорилось, что для просмотра дизасемблированого кода лучше использовать окно Program Memory.
vanner вне форума   Ответить с цитированием
Старый 21.03.2008, 11:13   #12
el_eng
Senior Member
 
Регистрация: 07.03.2008
Адрес: Украина, Донецк
Сообщений: 108
Вес репутации: 292/45
el_eng is a jewel in the roughel_eng is a jewel in the roughel_eng is a jewel in the rough
По умолчанию Re: MPLAB IDE v8.02 - ошибка дизассемблирования кода

Здравствуйте, уважаемые коллеги!

Ответ на вопрос lard:
Функция приведенного примера выдернута из моего проекта, упрощена для демонстрации и туда помещены "Способ_1" и "Способ_2".
Инициализация указателя "pchar" адресом параметра функции "StkSize" сделана мною только для того, чтобы увидеть, как MPLAB выполнит и покажет взятие адреса, приведение типа и разадресацию для классически инициализированного указателя (для "Способ_1").
В не расширенном режиме пример скомпилирован также только с целью увидеть, как будут показаны те же операции.
На самом же деле я использую "Способ_2" и расширенный режим PIC18-так намного короче код.
А сделал это я чтобы копировать значение параметра StkSize и указателя pTID на структуру из массива в ROM - в очередную структуру из массива в RAM. Так добавляется функция-задача в очередь. В ROM помещён массив структур с параметрами задач, а в RAM - очередь, из которой задачи выгружаются для выполнения... Но это другая тема.

Ответ для Bill:
Спасибо за совет, однако мне логика подсказывает, что обнаружился действительно недостаток и он не должен оговариваться в DS. Я пока не нашёл раздел SPECIAL CONSIDERATIONS WITH MICROCHIP MPLAB® IDE TOOLS, смотрел 51519B.pdf и:
http://ww1.microchip.com/downloads/en/DeviceDoc/RelNotes802.zip
Укажите пожалуйста номер документа, или ссылку на него.

Oтвет для vanner:
В проблемных ситуациях я открываю окно Program Memory, там было так же пусто в строках, которые мы обсуждаем.

Для желающих скомпилировать самостоятельно:
Пример помещён в одном файле, исходный текст полностью приведён в первом сообщении темы.
__________________
"Всё нужное не трудно, а всё трудное не нужно." Г.Сковорода

Последний раз редактировалось el_eng; 21.03.2008 в 12:18.
el_eng вне форума   Ответить с цитированием
Старый 21.03.2008, 14:26   #13
Bill
Senior Member
 
Аватар для Bill
 
Регистрация: 26.02.2007
Адрес: Челябинск
Возраст: 69
Сообщений: 2,215
Вес репутации: 1898/85
Bill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant future
По умолчанию Ссылка ->

http://ww1.microchip.com/downloads/e...Doc/39632D.pdf
Параграф 26.2.5
Bill вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MPLAB IDE v8.00 операция Code Folding неактивна. Почему? vladn777 Продукция MICROCHIP 3 12.08.2009 23:24
I2C и MPLAB IDE mal Продукция MICROCHIP 6 06.08.2008 15:35
dsPIC, ЕЕPROM, MPLAB IDE v8.1, Ассемблер pic18 Продукция MICROCHIP 22 07.03.2008 23:32
ошибка mplab ссs Sergey1 Общетехнические вопросы 2 14.10.2007 12:10
Оптимальность кода MPLAB C18 olegras Продукция MICROCHIP 18 17.03.2007 17:18


Часовой пояс GMT +3, время: 01:18.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot