Итак, я пытаюсь изменить первый элемент массива, который я храню в 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.
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
, вам придется делать это вручную.
Непонятно, как вы строите и какое у вас окружение. Что-то должно скопировать ваш инициализатор в SRAM при загрузке, убедитесь, что вы все настроили правильно.