2016-06-28 3 views
0

Всякий раз, когда я составляю следующую программу:ARM инструкция ассемблер передает Thumb в Thumb2

.syntax unified 
.section .text 
_start: 
ADD R0, R1 

я получаю следующий двоичный выход:

ADD.W R0, R0, R1 

, который означает, что мой ассемблер передает 16 битный код на 32 бита код. Интересно, почему мой ассемблер ведет себя так вместо компиляции кода в 16 битной инструкции «08 44»

я запускаю сборку с помощью следующей команды:

рука-ни-EABI-а - о output.o -m палец -EL input.s

+0

2-байтовый указатель большого пальца устанавливает флаги. если вы пишете 'add r0, r1', вы должны получить 16-разрядную инструкцию. – EOF

+0

, который все еще не объясняет, почему ассемблер не переводит 'ADD R0, R1' в' 08 44' – YouYou

+0

О, вы имеете в виду '0x44 0x08'? Взгляните на справочное руководство по архитектуре ARM: * Кодирование T2 ARMv6T2, ARMv7, если и - оба из R0-R7 ARMv4T, ARMv5T \ *, ARMv6 \ *, ARMv7 в противном случае *. Кажется, вы не можете использовать эту кодировку для нижних регистров в thumb1. – EOF

ответ

2
add r0,r1 
adds r0,r1 
adds r8,r0 

arm-none-eabi-as -mthumb so.s -o so.o 
so.s: Assembler messages: 
so.s:2: Error: instruction not supported in Thumb16 mode -- `adds r0,r1' 
so.s:3: Error: instruction not supported in Thumb16 mode -- `adds r8,r0' 

интересно

add r0,r1 
add r0,r1 
add r8,r1 

00000000 <.text>: 
    0: 1840  adds r0, r0, r1 
    2: 1840  adds r0, r0, r1 
    4: 4488  add r8, r1 

интересный.

.thumb 
.syntax unified 

add r0,r1 
add r0,r1 
add r8,r1 

00000000 <.text>: 
    0: eb00 0001 add.w r0, r0, r1 
    4: eb00 0001 add.w r0, r0, r1 
    8: 4488  add r8, r1 

нормально прогресс

.thumb 
.syntax unified 

add r0,r1 
adds r0,r1 
adds r8,r1 

00000000 <.text>: 
    0: eb00 0001 add.w r0, r0, r1 
    4: 1840  adds r0, r0, r1 
    6: eb18 0801 adds.w r8, r8, r1 

хммм.

.thumb 
.syntax unified 

add r0,r1 
adds r0,r1 
add r8,r1 

00000000 <.text>: 
    0: eb00 0001 add.w r0, r0, r1 
    4: 1840  adds r0, r0, r1 
    6: 4488  add r8, r1 

ОК, это просто беспокоит.

.thumb 
.syntax unified 

add r0,r1 
adds r0,r1 
add.w r8,r1 

00000000 <.text>: 
    0: eb00 0001 add.w r0, r0, r1 
    4: 1840  adds r0, r0, r1 
    6: eb08 0801 add.w r8, r8, r1 

Так что получение команды 0x18xx и 0x44xx для генерации не сложно. ассемблер не делает жизнь легкой. если вам нужна конкретная инструкция, вы должны просто поместить там машинный код и сделать с ней.

EDIT вздыхаем попытался предложение Notlikethat в

.thumb 
.syntax unified 

add.n r0,r1 
add.n r8,r1 

arm-none-eabi-as -mthumb so.s -o so.o 
so.s: Assembler messages: 
so.s:5: Error: cannot honor width suffix -- `add.n r0,r1' 

неудачу

.thumb 

add.n r0,r1 
add.n r8,r1 

arm-none-eabi-as -mthumb so.s -o so.o 
so.s: Assembler messages: 
so.s:4: Error: unexpected character `n' in type specifier 
so.s:4: Error: bad instruction `add.n r0,r1' 
so.s:5: Error: unexpected character `n' in type specifier 
so.s:5: Error: bad instruction `add.n r8,r1' 

неудачу

.thumb 
.syntax unified 

adds.n r0,r1 
add.n r8,r1 

00000000 <.text>: 
    0: 1840  adds r0, r0, r1 
    2: 4488  add r8, r1 

хорошо, что получил его ...

и надстройку против добавляет, имеет смысл, f или по какой-либо причине версия с высоким регистром добавления 0x44xx, которую вы были после, не изменяет флаги, где выполняется низкий регистр 0x18xx. Этот ассемблерный язык в ARMv7-m ARM показывает это.

EDIT 2, старая рука рука говорит

ограничение Операнд Если низкий регистр указан для и Rm (Н1 == 0 и Н2 == 0), то результат будет непредсказуем. Так что для armv4 и armv5 я бы не пытался сделать вашу команду 0x4408, поскольку она непредсказуема.

В доктрине armv7-m не сказано, что в теории это хорошо для этой архитектуры. не знаю, что говорит armv6m.

+0

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

+0

и не ожидайте, что эти результаты останутся неизменными, очевидно, некоторые из нас помнят, когда вы делали добавку или не делали этого или что-то еще. –

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