|
Вопрос по ARM7 ассемблеру |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 15)
|
May 3 2012, 12:42
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(coolibin @ May 3 2012, 16:31)  подскажите, что делает вот такая команда LDR R2, =0xC00FE1 ? мне с первого взгляда показалось, что в регистр загружается содержимое памяти по адресу 0xC00FE1, но такого адреса нет. В регистр загружается именно значение, почитайте тут например.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
May 3 2012, 12:45
|
Участник

Группа: Validating
Сообщений: 55
Регистрация: 6-04-11
Пользователь №: 64 180

|
Цитата(coolibin @ May 3 2012, 16:31)  подскажите, что делает вот такая команда LDR R2, =0xC00FE1 ? мне с первого взгляда показалось, что в регистр загружается содержимое памяти по адресу 0xC00FE1, но такого адреса нет. Почитайте в руководстве на среду, в которой работаете, про assemler pseudo-instructions.
|
|
|
|
|
May 3 2012, 14:14
|
Участник

Группа: Validating
Сообщений: 55
Регистрация: 6-04-11
Пользователь №: 64 180

|
Цитата(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).
|
|
|
|
|
May 3 2012, 15:47
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414

|
LDR -- не псевдокоманда, не вводите народ в заблуждение. Это самая что ни на есть обычная команда, загружающая в регистр содержимое некоторой ячейки памяти. Запись же вида LDR R0, =1234 говорит транслятору ассемблера, что надо где-то в памяти выделить местечко под константу 1234, а здесь обеспечить её загрузку в R0. Сама же команда в действительности примет вид LDR R0, [PC, #смещение], где смещение вычисляется, исходя из адреса этой команды и адреса константы. При выполнении процессор прибавит к текущему значению PC значение смещения, после чего прочитает из памяти слово, лежащее по получившемуся адресу, и занесёт его в R0. Цитата(coolibin @ May 3 2012, 18:08)  честно, я вообще ничего не пойму)) давайте по порядку, я в иде дизассемблировал прошивку проца аля ARM7TDMI, обнаружил кучу инструкций типа LDR R2, =0xC00FE1, меня интересует, что будет происходить в результате выполнения именно этой команды? в R2 будет загружено число 0xC00FE1? или число по несуществуещему адресу 0xC00FE1? или еще что то? я буду оч благодарен если кто нибудь популярно объяснит)) Будет загружено указанное число.
|
|
|
|
|
May 4 2012, 08:04
|
Местный
  
Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228

|
вот сейчас все более менее понятно, благодарю! у меня еще один вопрос, есть код: Код LDR R1, =0xC0228C LDRB R0, [R1] я так понимаю здесь загружаеться в переменную R0 один байт хранящийся по адресу 0xC0228C. только такого адреса нет в программе и переферия имеет немного другие адреса? как это можно объяснить? может ли это быть связано, например, с внешним eeprom?
--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
|
|
|
|
|
May 4 2012, 10:07
|
Местный
  
Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228

|
точно не помню, помоему этот - http://www.chipfind.ru/datasheet/micronas/cdc3272gc.htm из диаграммы я понял, что это RAM, но я могу ошибаться
Сообщение отредактировал coolibin - May 4 2012, 10:09
--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
|
|
|
|
|
May 4 2012, 20:42
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414

|
Цитата(coolibin @ May 4 2012, 12:04)  Код LDR R1, =0xC0228C LDRB R0, [R1] я так понимаю здесь загружаеться в переменную R0 один байт хранящийся по адресу 0xC0228C Только не в переменную, а в регистр. Переменных в том строгом смысле, какой используется в языках высокого уровня, на уровне команд процессора (и соответственно, в языке ассемблера) нет.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|