sx386 писал(а):Как можно прочитать и записать 'nm' элемент массива 'array' ?
num - номер элемента
для начала - nm в вышеприведенном не является элементом массива array
этот элемент объявлен как самостоятельная метка в ОЗУ - по сему запись и /или чтение из него возможно любым доступным способом, вполоть до:
lds Rn, nm
sts nm,Rn ; где Rn любой из регистров (R0-R31)
если же надо считать элемент массива array (0-80), то его надо объявлять как константу или лучше использовать содержимое указателя позиции (num), размешенного по адресу, находящемуся в ячейке nm - но так "мудрить" стоит только при нехватки оперативных регистров
иначе удобнее было бы объявить :
.undef XL ; только у avrasm2 !!!
.undef XH ; только у avrasm2 !!!
.def nm_arreyl=R26
.def nm_arreyh=R27
.def tmp=r17
.def nm=R16 ; R0-R15 только в случае, если не предусматривается непосредственная загрузка данных в регистр иначе доступно лишь R16-R31
.def adr_arreyl=r3
.def adr_arreyh=r4
.dseg
array : .byte 80
ну и при инициализации записать какое-то начальное значение в nm и записать базовый адрес начала массива в какую-нибудь регистровую пару (а не напрямую в индексные регистры!)
затем чтение/запись по предварительно модифицированному индексному регистру ( но ни базовый адрес ни содержимое указателя при этом изменяться не должны)
можно конечно и другой вариант присобачить - нечто с базовым адресом в виде константы ( экономия двух регистров ) - но диапазон смещения маловат будет, посему с двумя дополнительными регистрами интереснее (да и число элементов массива может быть двухбайтовым...):
clr nm ; на этапе инициализации
ldi tmp,low(arrey)
mov adr_arreyl,tmp
ldi tmp,high(arrey)
mov adr_arreyh,tmp
----------
mov nm_arreyl,nm
clr nm_arreyh
add nm_arreyl, adr_arreyl
adc nm_arreyh,adr_arreyh ; создать текущий адрес элемента массива
ну и дальше - читай или записывай (ld Rd,X /st X,Rd) ... только вот куда? (надо бы какой -то регистр назначения иметь /Rd/)
