Проблема с портом 0x6F

Когда я дизассемблирую созданный в среде Arduino IDE pjoject, я вижу в созданном коде («фактически дизассемблированный код»), что он использует инструкцию IN/OUT на порту 0X6F.

Вот так (часть дизассемблированного списка):

00E3     4FFF                SBCI      R31,0XFF                 ; .O
00E4     91A5                LPM       R26,Z+                   ; ..
00E5     91B4                LPM       R27,Z                    ; ..
00E6     B79F                IN        R25,0X6F                 ; ..
00E7     94F8                CLI                                ; ..
00E8     1161                CPSE      R22,R1                   ; a.
00E9     C004                RJMP      L00EE                    ; ..

00EA     918C                LD        R24,X                    ; ..
00EB     9530                COM       R19                      ; 0.
00EC     2338                AND       R19,R24                  ; 8#
00ED     C002                RJMP      L00F0                    ; ..

00EE     91EC      L00EE:    LD        R30,X                    ; ..
00EF     2B3E                OR        R19,R30                  ; >+
00F0     933C      L00F0:    ST        X,R19                    ; <.
00F1     BF9F                OUT       0X6F,R25                 ; ..
00F2     9508      L00F2:    RET   

В любом случае в таблице данных ATMEGA328 указано, что порт 0x6F отображается в памяти и поэтому доступ к нему должен осуществляться через инструкции LDS/STS. Эта проблема меня очень смущает. Кто-нибудь может дать мне объяснение?? Спасибо !

, 👍0

Обсуждение

Каков исходный код C/C++?, @Mikael Patel

avr-objdump дизассемблирует эти байты на «in r25, 0x3f» и «out 0x3f, r25», что соответствует ответу Микаэля Пателя. Похоже у вас сломался дизассемблер., @Edgar Bonet


1 ответ


4

Код операции AVR для инструкции IN:

Loads data from the I/O Space (Ports, Timers, Configuration Registers, etc.) into register Rd in the Register File.

Operation:
(i) Rd ← I/O(A)
Syntax: Operands: Program Counter:
(i) IN Rd,A 0 ≤ d ≤ 31, 0 ≤ A ≤ 63, PC ← PC + 1
16-bit Opcode: 1011 0AAd dddd AAAA

Дизассемблирование кода операции B79F (hex) = 1011 0111 1001 1111 (bin) — это IN R25,$3F, который на самом деле является SREG.

Блок кода с инструкциями IN, CLI и OUT — критический участок, где сохраняются флаги в SREG, прерывания отключается, а позже SREG восстанавливается.

Удачи!

,

Спасибо большое. Я свяжусь с создателем Disasm, сообщу ему о проблеме и перекомпилирую, когда получу новую версию. Надеюсь, это решит проблему. В любом случае большое-большое спасибо за конструктивные ответы., @Kristian Sander

HI: (время 22:23 по европейскому времени): Позвонил ему, сообщил об ошибке. Он осмотрел. Исправил. Вернул новую версию. Я запустил его. Разобрал файл (который дает приведенный выше список), io-порты теперь правильные (все в диапазоне 0x00 - 0x6F) Благодарю за ценную помощь. КШ, @Kristian Sander