Что это делает в сборке

Мой учитель хочет, чтобы мы имели базовое представление об ассемблере, потому что позже это может быть полезно. Я согласен с этим, но мой колледж не предоставляет никакой документации по этому вопросу, кроме 4 небольших примеров. Я пытаюсь понять, что происходит в этом:

.DEVICE ATmega32

.CSEG
main:

ldi    ZL,low(varclist<<1)
ldi    ZH,high(varclist<<1)

.CSEG
varclist:
.db    1, 2
.db    3, 4
.db    5, 6
.db    7, 8
.db    9, 0

Я работаю в студии AVR 5 и смотрю на вкладку «процессор». Кажется, я не могу найти никакой связи между значениями в «varclist» и шестнадцатеричными значениями, которые показывают регистры. Как я смотрю на это?

Я ожидаю, что регистр Z будет содержать 0x0100, поскольку я полагаю, что «наиболее значимый» бит будет объявлен первым, а наименее значимый - последним объявленным. Однако я вижу 0x0070. Однако я не уверен, что делает переключение.


person Lg102    schedule 17.01.2012    source источник
comment
Поскольку это ваша домашняя работа, я думаю, вы должны добавить этот тег. По той же причине точное указание кода, вероятно, не лучший способ помочь вам. Можете ли вы сказать, что, по вашему мнению, должно присутствовать в ваших регистрах и какое значение вы получаете? Как только вы это сделаете, мы, безусловно, сможем объяснить, что было не так в ваших рассуждениях :)   -  person Quentin Casasnovas    schedule 18.01.2012
comment
Это справедливо, я не ищу ответа, я хотел бы понять. Я добавлю больше информации.   -  person Lg102    schedule 18.01.2012
comment
Я рекомендую собрать, а затем разобрать код. Затем просмотрите руководство по набору инструкций avr для получения информации о каждой инструкции. Вы должны быть в состоянии выяснить между документом набора инструкций avr и главой ядра / процессора в таблице данных / руководстве atmega32, что такое регистр z, как он сопоставляется с gprs и что на самом деле делает инструкция, как закодировано. оттуда работайте в обратном направлении к языку ассемблера   -  person old_timer    schedule 18.01.2012


Ответы (1)


Чтобы ответить на ваш вопрос о сдвиге, скажем, что он сдвигает все биты на один влево, добавляя ноль в качестве первого бита. Другими словами, он умножает на 2 высокое (соответственно низкое) значение переменной varclist.

varclist здесь в вашей программе адрес массива байт [0x01, 0x02, ... 0x00] в памяти => varclist указатель на первый байт этого массива. Для получения исходного адреса нам достаточно разделить на 2 (обратная операция умножения) и мы получим

0x0070 >> 1 = 0000 0000 0111 0000 >> 1 = 0000 0000 0011 1000 = 0x0038

Таким образом, адрес varclist был 0x0038. Я не знаю, как вы подумали, что это 0x0100, но я надеюсь, что теперь вы понимаете код.

Я думаю, что этот адрес умножается на 2, потому что адреса места для хранения программ выражаются в смещении слов, и в этом случае вам нужно будет умножить на 2, чтобы получить адрес в байтовом смещении. Позже вы можете загрузить этот байт (первый байт вашего массива) в r0благодаря инструкции сборки LPM.

Я бы рекомендовал вам прочитать главу 5.2 этого pdf и, возможно, другие главы по мере необходимости. Что ж. Руководство пользователя по ассемблеру AVR также, вероятно, является хорошей ставкой.

person Quentin Casasnovas    schedule 17.01.2012