Сегмент данных AVR хранит бессмыслицу после компиляции

Итак, я пытаюсь изменить первый элемент массива, который я храню в SRAM, и я проверил, равны ли данные после компиляции значению предварительной инициализации, и оно не было равным. так что это мой код:

.data
.org  0x0100
system_log: .space 20, 0x44
            .byte 10,13,0

.text
.org 0x4000

loop:
  rjmp loop

print_buff:
    
    LDI   XL, lo8(system_log)
    LDI   XH, hi8(system_log)         ;Z points to string message
    ld r0, X
    mov r18, r0
    rjmp print_msg

Я печатаю первое значение массива и ожидаю, что оно будет равно D, но это дает мне A

Я не знаю, что происходит, но начнем, и, кстати, я использую Arduino с чипом Atmega328P.

Непонятно, как вы строите и какое у вас окружение. Что-то должно скопировать ваш инициализатор в SRAM при загрузке, убедитесь, что вы все настроили правильно.

Jester 13.07.2024 22:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

LDI XH, hi8(system_log) ;Z points to string message

Этот код неправильный. Вы загружаете регистр X, а не регистр Z, который вы используете в print_msg, как и в вашем другом вопросе Обновление элемента в массиве в сборке AVR

Более того, в этом print_msg вы используете LPM, поскольку эта функция читает из флэш-памяти, тогда как для чтения из оперативной памяти вы должны использовать LD или LDD. Что вам нужно, это

  • Две процедуры: одна читает из флэш-памяти, а другая — из ОЗУ; или
  • Одна подпрограмма, которая знает, получает ли она указатель на флэш-память или указатель на ОЗУ, и которая использует соответствующую информацию во время выполнения для выполнения LPM соответственно LD; или
  • Одно из этих новых устройств с линейным адресным пространством, которое может читать флэш-память с помощью LD (ATmega328 не входит в их число).

Кроме того, раздел .data необходимо инициализировать при запуске. Поскольку вы используете инструменты GNU, вы можете просто извлечь код из libgcc с помощью

.global __do_copy_data

Или, если вы используете что-то вроде -nostdlib -nodefaultlibs -nostartfiles, вам придется делать это вручную.

Другие вопросы по теме