Без компилятора, из которого вы можете разобрать (avr-gcc легко найти), может быть трудно понять, что происходит, когда компилируется язык высокого уровня.
вы просто заявляете, что хотите использовать переменную или адрес, когда используете подобные объявления. это не обязательно, немедленно, поместите что-то в сборку. часто мертвый код и другие вещи удаляются из кода компилятором. В других случаях только до самого конца процесса компиляции вы узнаете, где ваша переменная может оказаться. Иногда символ только когда-либо живет в регистре, поэтому в течение короткого периода времени в программе эта переменная имеет дом. Иногда срок службы переменной должен быть домашним на протяжении всего времени работы программы, и не хватает регистров, чтобы хранить ее в одном вечном хранилище, поэтому ей будет выделена область памяти.
Аналогично указатель - это адрес, который также находится в регистрах или в ячейках памяти.
Если у вас нет компилятора, где вы можете поэкспериментировать с добавлением кода на C и посмотреть, что произойдет. И даже если вам это нужно, вам нужно получить документацию по набору инструкций для нужного семейства процессоров.
http://www.atmel.com/Images/doc0856.pdf
Посмотрите на операцию добавления, например add rd, rr, и она показывает, что d и r оба находятся между 0 и 31, так что вы можете добавить r10, r23. И, глядя на операцию, это означает, что r10 = r10 + r23. Если у вас есть переменные типа char, которые вы хотите добавить в C, это одна из инструкций, которую может использовать компилятор.
Существует две инструкции lds: версия с одним 16-битным словом и одна, которая принимает два 16-битных слова. (обычно ассемблер выбирает это для вас). число от 0 до 31, а k - адрес в области памяти. Если у вас объявлена глобальная переменная, к ней, скорее всего, будут обращаться через lds или sts. Таким образом, K является указателем, фиксированным указателем. Ваш char * в C может превратиться в фиксированное число во время компиляции в зависимости от того, что вы делаете с этим указателем в вашем коде. Если это динамическая вещь, посмотрите на разновидности ld и st, которые используют пары регистров. Таким образом, вы могли бы видеть, что указатель char * превращается в пару регистров или пару ячеек памяти, которые содержат сам указатель, тогда он может использовать пары регистров x, y или z, см. Ld и st, и, возможно, adiw, чтобы найти смещение к этому указателю перед использованием ld или st.
У меня есть симулятор http://github.com/dwelch67/avriss., но он нуждается в работе, а не в полной отладке (если вы не хотите изучать набор инструкций посредством изучения симулятора и его потенциальных ошибок). simavr и некоторые другие, которые вы можете использовать для наблюдения за выполнением вашего кода. http://gitorious.org/simavr