ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
28 марта
853139 Топик полностью
sladkoejka (05.07.2018 13:49 - 14:00, просмотров: 401) ответил Bill на Корректный код генерируется в обоих случаях
Обнаружил интересное различие в коде который не работает и коде, который работает. Вот сам код примера:  #include <ioCY7C68013A.h> #include <intrinsics.h> void delay(unsigned long n) { while( n-- > 0 ) __no_operation(); } void main( void ) { SOEA = 0x03; // Enable Port A Pins: 0, 1 (LED0 & LED1) IOA = 0x03; // LED0 & LED1 off for (;;) { IOA = 0x02; // LED0 on delay(10000); IOA = 0x03; // LED0 off delay(10000); } } Для точной подстройки адреса, куда компилятор будет класть код, используется также небольшой асм файл: COMMON INTVEC:CODE:ROOT(0) ORG 0x4f nop END В таком виде код не работает. Но если заменить на ORG 0x50, то код работает. Разница должна быть только в адресе начала кода. Однако обнаружил, что компилятор немного модифицирует и код. Вот фрагмент рабочего кода:
 0000E7  00              NOP
 0000E8  85 08 0C        MOV   0xC,0x8
 0000EB  85 09 0D        MOV   0xD,0x9
 0000EE  85 0A 0E        MOV   0xE,0xA
 0000F1  85 0B 0F        MOV   0xF,0xB
 0000F4  79 10           MOV   R1,#0x10
 0000F6  78 08           MOV   R0,#0x08
 0000F8  12 00 83        LCALL 0x0083
 0000FB  E5 0C           MOV   A,0xC
 0000FD  45 0D           ORL   A,0xD
 0000FF  45 0E           ORL   A,0xE
 000100  0E              INC   R6            ; <= обращаем внимание сюда
 000101  45 0F           ORL   A,0xF
 000103  70 E2           JNZ   0x00E7
 000105  7F 08           MOV   R7,#0x08
 000107  02 00 BE        LJMP  0x00BE
А вот тот-же фрагмент нерабочего кода:
 0000E6  00              NOP
 0000E7  85 08 0C        MOV   0xC,0x8
 0000EA  85 09 0D        MOV   0xD,0x9
 0000ED  85 0A 0E        MOV   0xE,0xA
 0000F0  85 0B 0F        MOV   0xF,0xB
 0000F3  79 10           MOV   R1,#0x10
 0000F5  78 08           MOV   R0,#0x08
 0000F7  12 00 82        LCALL 0x0082
 0000FA  E5 0C           MOV   A,0xC
 0000FC  45 0D           ORL   A,0xD
 0000FE  45 0E           ORL   A,0xE
 000100  45 0F           ORL   A,0xF          ; <= обращаем внимание сюда
 000102  70 E2           JNZ   0x00E6
 000104  7F 08           MOV   R7,#0x08
 000106  02 00 BD        LJMP  0x00BD
Это код функции delay. Очень странно... Такое впечатление, что компилятор забыл добавить INC R6. Однако не совсем ясно что там происходит. Что интересно, в debug режиме код совсем другой. Нужно разбираться...