Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по ARM7 ассемблеру
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
coolibin
подскажите, что делает вот такая команда LDR R2, =0xC00FE1 ? мне с первого взгляда показалось, что в регистр загружается содержимое памяти по адресу 0xC00FE1, но такого адреса нет.
Lotor
Цитата(coolibin @ May 3 2012, 16:31) *
подскажите, что делает вот такая команда LDR R2, =0xC00FE1 ? мне с первого взгляда показалось, что в регистр загружается содержимое памяти по адресу 0xC00FE1, но такого адреса нет.

В регистр загружается именно значение, почитайте тут например.
aaarrr
Это псевдокоманда загрузки константы в регистр (т.е. она загрузит в R2 число 0xC00FE1).
На деле же ассемблер заменяет её на LDR R2, [PC, #xx].
R.A.K.
Цитата(coolibin @ May 3 2012, 16:31) *
подскажите, что делает вот такая команда LDR R2, =0xC00FE1 ? мне с первого взгляда показалось, что в регистр загружается содержимое памяти по адресу 0xC00FE1, но такого адреса нет.


Почитайте в руководстве на среду, в которой работаете, про assemler pseudo-instructions.


haker_fox
А если операнд будет "в ширину", то в R2 загрузится значение по адресу, значение которого равно адресу)
coolibin
дело в том, что про псевдо инструкции я читал, но я так и не понял что к чему) может кто нибудь объяснить т. с. на пальцах, что все таки делает данная инструкция? LDR R2, [PC, #xx] что заместо хх ставить?
aaarrr
Цитата(coolibin @ May 3 2012, 17:15) *
что заместо хх ставить?

Смещение относительно текущего адреса инструкции с учетом конвейера (т.е. на деле PC указывает на 2 инструкции вперед относительно текущей).
Но лучше пусть ассемблер ставит.
coolibin
честно, я вообще ничего не пойму)) давайте по порядку, я в иде дизассемблировал прошивку проца аля ARM7TDMI, обнаружил кучу инструкций типа LDR R2, =0xC00FE1, меня интересует, что будет происходить в результате выполнения именно этой команды? в R2 будет загружено число 0xC00FE1? или число по несуществуещему адресу 0xC00FE1? или еще что то? я буду оч благодарен если кто нибудь популярно объяснит))
R.A.K.
Цитата(coolibin @ May 3 2012, 17:15) *
дело в том, что про псевдо инструкции я читал, но я так и не понял что к чему) может кто нибудь объяснить т. с. на пальцах, что все таки делает данная инструкция? LDR R2, [PC, #xx] что заместо хх ставить?


Загрузить в регистр константу можно двумя способами:
1. Командой MOV
2. Командой LDR

Одной командой MOV загрузить любое значение нельзя. Можно только такое, которое получается циклическим сдвигом любой 8-ми разрядной константы вправо на четное число бит.
Если этого сделать нельзя - можно загрузить константу в несколько приемов (MOV + еще какая-нибудь data-processing команда с еще одним непосредственным операндом).
Либо можно разместить константу (в секции DATA), недалеко от текущего кода, и загружать ее в регистр командой LDR, используя в качестве базовой части адреса текущее значение PC(R15), а смещение задавая непосредственным операндом.

Чтобы избавить программиста от этого геморроя, введена псевдо-команда LDR. Программист просто указывает, что необходимо загрузить в регистр такую-то константу. Программа-ассемблер сама по ходу дела решает как это лучше сделать - через MOV или через LDR (вместо псевдо-каманды вставляет подходящую инструкцию, если надо LDR - добавляет константу в секцию DATA).
SII
LDR -- не псевдокоманда, не вводите народ в заблуждение. Это самая что ни на есть обычная команда, загружающая в регистр содержимое некоторой ячейки памяти. Запись же вида LDR R0, =1234 говорит транслятору ассемблера, что надо где-то в памяти выделить местечко под константу 1234, а здесь обеспечить её загрузку в R0. Сама же команда в действительности примет вид LDR R0, [PC, #смещение], где смещение вычисляется, исходя из адреса этой команды и адреса константы. При выполнении процессор прибавит к текущему значению PC значение смещения, после чего прочитает из памяти слово, лежащее по получившемуся адресу, и занесёт его в R0.

Цитата(coolibin @ May 3 2012, 18:08) *
честно, я вообще ничего не пойму)) давайте по порядку, я в иде дизассемблировал прошивку проца аля ARM7TDMI, обнаружил кучу инструкций типа LDR R2, =0xC00FE1, меня интересует, что будет происходить в результате выполнения именно этой команды? в R2 будет загружено число 0xC00FE1? или число по несуществуещему адресу 0xC00FE1? или еще что то? я буду оч благодарен если кто нибудь популярно объяснит))


Будет загружено указанное число.
coolibin
вот сейчас все более менее понятно, благодарю!
у меня еще один вопрос, есть код:

Код
LDR     R1, =0xC0228C
LDRB    R0, [R1]


я так понимаю здесь загружаеться в переменную R0 один байт хранящийся по адресу 0xC0228C. только такого адреса нет в программе и переферия имеет немного другие адреса? как это можно объяснить? может ли это быть связано, например, с внешним eeprom?
aaarrr
Цитата(coolibin @ May 4 2012, 12:04) *
может ли это быть связано, например, с внешним eeprom?

Вряд ли. Вы бы название процессора огласили, код которого разбираете.
coolibin
точно не помню, помоему этот - http://www.chipfind.ru/datasheet/micronas/cdc3272gc.htm из диаграммы я понял, что это RAM, но я могу ошибаться
aaarrr
Да, это RAM.
coolibin
спасибо!
SII
Цитата(coolibin @ May 4 2012, 12:04) *
Код
LDR     R1, =0xC0228C
LDRB    R0, [R1]


я так понимаю здесь загружаеться в переменную R0 один байт хранящийся по адресу 0xC0228C


Только не в переменную, а в регистр. Переменных в том строгом смысле, какой используется в языках высокого уровня, на уровне команд процессора (и соответственно, в языке ассемблера) нет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.