Перейти к содержанию
    

Нюансы в преобразовании ASM инструкций в двоичный

Здравствуйте.

 

Пробую разобратся с сабжем. И тут у меня возник вопрос следующего типа.

Есть 2 комманды :

1) ADD R0, R0, R0;

2) ADD R0, R0, LSL #0

Если я пробую их записать в двоичной форме, согласно ARM Architecture Reference Manual, у меня получается, что они идентичны бит в бит.

т.е. Код операции у них одинаковый (ADD или 0000); Rd и Rs также нули. Меня смущает запись в параметре Operand2. Согласно вышеуказаному документу Operand2 для первого случая состоит из битов [11:4], которые забиты нулями и поля Rm (4 биты), куда я полагаю вносяться также нули. Operand2 для второго случая состоит из поля shift_imm (5 битов), трёх битов забитых нулями и поля Rm (4 биты), куда как я понимаю тоже надо записать нули... Вот тут я и стопорюсь. Что не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2) ADD R0, R0, LSL #0
Вроде бы такой команды не существует. Всегда указываются три регистра: приёмник, источник1 и источник2. И в конце необязательный сдвиг, который когда = 0 не отображается (не указывается)

 

Короче, команды

1) ADD R0, R0, R0

2) ADD R0, R0, R0, LSL #0

должны быть идентичными в машинных кодах

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде бы такой команды не существует. Всегда указываются три регистра: приёмник, источник1 и источник2. И в конце необязательный сдвиг, который когда = 0 не отображается (не указывается)

 

Короче, команды

1) ADD R0, R0, R0

2) ADD R0, R0, R0, LSL #0

должны быть идентичными в машинных кодах

Я понимаю, что пример выбран дурацкий... Но все же.... они не идентичны... Ну по крайней мере, если верить тому документу, который я привел выше (ARM Architecture Reference Manual). Собственно потому меня и заинтересовал этот вопрос.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Согласно файлу arm7tdmi.pdf (стр. 52)

1. Оп-код команды ADD = 0100

2. Вторым операндом может быть регистр со сдвигом (8 типов сдвигов и 5 бит = значение сдвига) или непосредственное число со сдвигом.

 

Формат сдвига описывается на стр. 54. Он может быть непосредственным или взятым из другого регистра.

Короче, второй операнд всегда (!) сдвигается, даже если в команде он опущен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Формат сдвига описывается на стр. 54. Он может быть непосредственным или взятым из другого регистра.

Короче, второй операнд всегда (!) сдвигается, даже если в команде он опущен.

Распишите пожалуйста эти комманды в двоичной форме, для всех 32-х бит. Хочу сверить со своим вариантом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Распишите пожалуйста эти комманды в двоичной форме, для всех 32-х бит. Хочу сверить со своим вариантом.

Правильнее будет, если Вы распишете, а другие сравнят со своим вариантом, если им это будет интересно.

Рекомендую перечитать ARM Architecture Reference Manual (у меня выпуск E), страницы A5-8 и A5-9. Мне кажется, там всё исчерпывающе описано.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Правильнее будет, если Вы распишете, а другие сравнят со своим вариантом, если им это будет интересно.

Прошу прощения, вы правы.

Итак:

команда ADD R0, R0, R0

код операции ADD 0100

поле S 0

поле Rn 0000

поле Rd 0000

поле Rm 0000

поле cond 0000

 

 

команда ADD R0, R0, LSL R0

код операции 0100

поле S 0

поле Rn 0000

поле Rd 0000

поле shift_imm 00000

поле Rm 0000

поле cond 0100

 

так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

команда ADD R0, R0, LSL R0

код операции 0100

поле S 0

поле Rn 0000

поле Rd 0000

поле shift_imm 00000

поле Rm 0000

поле cond 0100

 

так?

Нет, не так. Во-первых, команда должна быть записана так: ADD R0, R0, R0, LSL R0. Во-вторых, почему это у Вас изменилось поле cond? Изменится только нулевой бит поля shift Operand2, т.к. величина сдвига берется из регистра.

 

ADD    R0, R0, R0            e0800000
ADD    R0, R0, R0, LSL R0    e0800010

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет, не так. Во-первых, команда должна быть записана так: ADD R0, R0, R0, LSL R0. Во-вторых, почему это у Вас изменилось поле cond? Изменится только нулевой бит поля shift Operand2, т.к. величина сдвига берется из регистра.

 

ADD    R0, R0, R0            e0800000
ADD    R0, R0, R0, LSL R0    e0800010

Извените, не тот пример... Я имел ввиду ADD R0,R0, LSL #0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извените, не тот пример... Я имел ввиду ADD R0,R0, LSL #0

Т.е. ADD R0, R0, R0, LSL #0. Тогда никакого отличия от ADD R0, R0, R0 не будет, о чем уже писали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Т.е. ADD R0, R0, R0, LSL #0. Тогда никакого отличия от ADD R0, R0, R0 не будет, о чем уже писали.

Т.е. в двоичном представлении они будут идентичны? А каким образом тогда отделить

ADD R0, R0, R1

и

ADD R0, R0, R1 LSL #0 ?

Я так понимаю они также будут идентичны? Но ведь это ж разные комманды!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я так понимаю они также будут идентичны? Но ведь это ж разные комманды!

Это одна и та же команда. Любая Data Processing инструкция включает возможность сдвига операнда, а нулевое значение сдвига просто опускается в записи.

Никто не запрещает писать всюду LSL #0, только стоит ли загромождать код?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Т.е. в двоичном представлении они будут идентичны? А каким образом тогда отделить

ADD R0, R0, R1

и

ADD R0, R0, R1 LSL #0 ?

Я так понимаю они также будут идентичны? Но ведь это ж разные комманды!

1. R0=R0+R1

2. R0=R0+R1<<0 или R0=R0+R1

:biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это одна и та же команда. Любая Data Processing инструкция включает возможность сдвига операнда, а нулевое значение сдвига просто опускается в записи.

Никто не запрещает писать всюду LSL #0, только стоит ли загромождать код?

Спасибо за ответ. Теперь вроде все ясно :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...