?

Log in

 
 
27 Декабрь 2014 @ 06:55
asm (AVR)  
А как получить адрес РОН? как аналог в Си: a = &b
В доке на avrasm2, не нашел...
Метки: , ,
 
 
 
Denis Simsimsun on Декабрь, 27, 2014 18:38 (UTC)
так и пишу пока
ldi Z, 3
но это не удобно, так как в коде не понятно что это за '3' такое и если я захочу сменить 3 на что то другое, то руками придется
немного помогает:

.def a = R3
.equ addr_a = 3; for R3
ldi ZL, addr_d

но тоже не избавляет от ручного назначения a = R3 ил что там у нас..

ex0_planet on Декабрь, 27, 2014 18:56 (UTC)
ну а почему тогда не наделать дефайнов вида
.equ R3_ADDR = 3
.equ R4_ADDR = 4
Denis Simsimsun on Декабрь, 27, 2014 19:12 (UTC)
так и приходится руками!(
Думал есть какой метод сделать это автоматом. Компилятор то "знает" :)
Может после Си избалован?
ex0_planet on Декабрь, 27, 2014 20:43 (UTC)
какой компилятор? это ассемблер, он заточен под то, чтобы написанное перевелось в двоичный код и оказалось в выходном файле, максимально близко к тексту.

Я намекну: он и про обычные адреса в памяти не очень-то знает. Когда вы ссылаетесь на адрес метки, он тупо берет численное значение этого символа из таблицы, которое там возникает в момент определения метки. Его можно переопределить или сослаться на вообще неизвестный на данный момент адрес.

У регистра тоже в общем случае может не быть адреса, то что вы указываете в команде mov r6, r5 это для ассемблера immediate operand специального вида, вот и все.

Так что всё руками, руками. Ассемблеры они вообще тупые, фактически, это макропроцессор специального вида.
Denis Simsimsun on Декабрь, 27, 2014 21:46 (UTC)
да... это наверное с непривычки :)
хотел сделать "портируемый" код
Denis Simsimsun on Декабрь, 27, 2014 21:48 (UTC)
Cпасибо за разъяснения и с наступающим!:)
ex0_planet on Декабрь, 28, 2014 10:16 (UTC)
Сорри если это как-то не так прозвучало, просто меня каждый раз безмерно удивляет, когда люди ждут от инструментария какой-то магии :-)

С Новым Годом!
Denis Simsimsun on Декабрь, 28, 2014 10:35 (UTC)
Да просто в Си научили, что все должно быть портируемо и никаких жестких цифр :)
ex0_planet on Декабрь, 31, 2014 15:36 (UTC)
ну тут жы оно по определению предназначено для конкретной платформы, какая уж тут портируемость :-)
Denis Simsimsun on Декабрь, 31, 2014 15:59 (UTC)
ну конечно я не имел в виду перенос на x86 :) дабы просто облегчить что то поменять в коде
Juray Neskazu: Отряд ВЕСНАjuray on Декабрь, 28, 2014 21:32 (UTC)
Кстати, а компилятор откуда знает? Для SFR вот адреса он тоже берёт из дефайнов в библиотеке.
А вот дефайнов РОН я что-то в avr-libc не нашёл (притом что обозначения r30, r31 кое-где используются - в common.h, например)
Неужели таки в сам компилятор встроены?

ex0_planet on Декабрь, 28, 2014 21:47 (UTC)
они в ассемблер встроены, да и то это immediate просто. то есть, ассемблер (или выходная часть кодогенератора) внутри себя имеет шаблоны инструкций вида
inc = "1100111xxxxx", и встретив inc r5 подставляет 000101 вместо xxxxx.
Denis Simsimsun on Декабрь, 30, 2014 16:44 (UTC)
да, я уже внутрь asmavr2.exe посмотрел, там реально есть такое:

ror.ll
1001001ddd000111
ror.l
1001001dd0100110
asr.ll
1001001ddd000110
asr.l
1001001dd0100101
lsr.ll
1001001ddd000101
lsr.l
1001001dd0100100
tst.ll


правда не на все команды
Juray Neskazujuray on Декабрь, 31, 2014 14:25 (UTC)
ну какое же immediate вот в таких конструкциях:

#define XL r26
#define XH r27
#define YL r28
#define YH r29
#define ZL r30
#define ZH r31
ex0_planet on Декабрь, 31, 2014 15:35 (UTC)
вот такая команда полностью валидна и работает:
mov 5, 6

более того, avr-libc этим вовсю пользуется.
Denis Simsimsun on Декабрь, 31, 2014 16:06 (UTC)
> mov 5, 6

не взлэтэл :(

error: Invalid register
Juray Neskazujuray on Январь, 1, 2015 09:17 (UTC)
и как он пользуется этим в приведенных дефайнах?
ex0_planet on Январь, 1, 2015 11:59 (UTC)
В приведенных — никак.
Denis Simsimsun on Декабрь, 28, 2014 23:59 (UTC)
да, похоже жестко, машинные кода не смотрел на разные версии чипов, но предполагаю, что не различаются.
Juray Neskazujuray on Декабрь, 30, 2014 10:13 (UTC)
Ну когда там коммент раскроется?

http://ru-embedded.livejournal.com/109344.html?thread=599584#t599584
Denis Simsimsun on Декабрь, 30, 2014 16:46 (UTC)
done :)