Итак, я давал проект для записи программы, в которой хранится значение в ячейке памяти, 0x200
, тогда программа уменьшает значение и сохраняет его в следующем месте памяти. Я только начал программирование сборки, и я склонен писать его с менталитетом письма с языком высокого уровня. Вот код, который я создал (он выглядит очень много, но это только причина комментариев):AVR сборка, увеличение и уменьшение значений из памяти данных
.cseg
.org 0x200 ;Trying to get the program to start assemblimg from memory location, 0x200
.DSEG
store: .BYTE 1 ;Trying to "create a variable called store to represent memory location, 0x200"
.CSEG
lds r17, store ;loading variable store into registry 17
.def count = r16
ldi count, 0x04 ;the first value, 0x04 assigned to variable, count and stored in registry 16
lp:
sts store, r16 ;stores value in r16, i.e. 0x04, into store which should point to memory location 0x200
cpi count, 0x00 ;check if value is zero yet
breq done ;if value is zero end program
dec count ;decrement the value of count, i.e. 0x04
inc r17 ;increment content of r17, which is store which refers to memory locaion, 0x200
rjmp lp ;restart loop
done: jmp done ;end of program
Я знаю, что это немного неаккуратно причиной замечаний, жаль что Если это помогает это был первый код, который я пытался, но r15 не работает с петлями:
.cseg
.org 0
lds r15, 0x200
lds r17, 0x001
.def count = r16
ldi count, 0x04
lp:
sts r15, r16
cpi count, 0x00
done
dec count
ADD r15, r17
rjmp lp
done: jmp done
Обратите внимание, что ваши директивы '.org' отчасти испорчены - вы, кажется, считаете, что они действительны глобально для каждого сегмента. Это неправда. Вы в настоящее время только ставите код в 200h - .dseg не имеет .org, поэтому ваши данные будут помещены начиная с адреса 0 (если у вас нет сценария компоновщика, который помещает материал в нужные места). AVR основан на * архитектуре Гарварда *, поэтому код и данные имеют два разных адресных пространства. – tofro
@tofro, так как мне обойтись, если dseg начнет сборку с 0x200? –