2012-01-17 4 views
1

Мой учитель хочет, чтобы у нас было общее понимание сборки, потому что позже по дороге это может быть полезно. Я в порядке с этим, но мой колледж предоставляет нулевую документацию по этому вопросу, за исключением 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. Однако я не уверен, что происходит.

+0

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

+0

Это справедливо, я не ищу ответа, я бы хотел понять. Я добавлю дополнительную информацию. – Lg102

+0

Я рекомендую сборку, а затем разборку кода. Затем ознакомьтесь с инструкцией по набору инструкций avr для получения информации о каждой инструкции. Вы должны иметь возможность выяснить между документом набора инструкций avr и главой core/cpu в файле данных atmega32/manual о том, что такое регистр z, как он сопоставляется с gprs и что инструкция на самом деле выполняет как закодированная. оттуда возвращаются к ассемблеру –

ответ

2

Чтобы ответить на ваши вопросы о смене, то, что он делает, это сдвинуть все биты на один влево, добавив нуль в качестве первого бита. Другими словами, он умножает на 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 this pdf и, возможно, другие главы. AVR Assembler User Guide также, вероятно, хорошая ставка.

 Смежные вопросы

  • Нет связанных вопросов^_^