EXC_BAD_INSTRUCTION при внедрении кода (armv7 asm)

Я понятия не имею, почему следующий код вызывает ошибку BAD_INSTRUCTION, кто-нибудь?

mov    r4, r0
movw   r0, #0xc70   ; injected code start here
movt   r0, #0x8bb3
movw   r3, #0x576
ldr    r1, [r7]
movs   r5, #0x1a
add    r5, pc       ; next instruction will jump over 9 instructions
bx     r5           ; injected code end here
ldr    r1, [r0]
ldr    r0, [r2]
blx    0x26e11c
movw   r1, #0x6442
movt   r1, #0x18
add    r1, pc
ldr    r1, [r1]
blx    0x26e11c
mov    r3, r1
movw   r1, #0x66a4  ; r1 has not been loaded
movt   r1, #0x15    ; with new value. Why?
mov    r2, r0
add    r1, pc       ; This instruction isn't getting called
mov    r0, r4       ; EXC_BAD_INSTRUCTION here
blx    __sprintf

person RyanB    schedule 08.07.2016    source источник
comment
Почему бы не просмотреть код в отладчике и не посмотреть, что на самом деле происходит?   -  person Paul R    schedule 08.07.2016
comment
@PaulR Я сделал, как вы можете видеть мой комментарий к каждой инструкции. После bx r5 у меня все нормально. Но следующие 2 movw и movt ничего не установили в r1, и после этого процесс стал EXC_BAD_INSTRUCTION.   -  person RyanB    schedule 08.07.2016
comment
Вы уверены в значении 0x1a? Если бы вы отклонились на +/- 1 байт, я мог бы увидеть, как отладчик запутался в том, где вы находитесь в коде (поэтому он выглядит так, как будто вы трассируете код, который вы ожидаете), но поскольку вы бы Не выполняйте инструкции, которые, по вашему мнению, вы выполняете... Просто мысль.   -  person David Wohlferd    schedule 08.07.2016
comment
что это за процессор/ядро? вы используете bx для переключения из режима большого пальца в режим руки. ваш процессор поддерживает режим руки?   -  person old_timer    schedule 10.07.2016


Ответы (1)


Между смещением в 26 байт (т. е. не кратным 4-байтовым инструкциям ARM) и установкой флага немедленной генерации (movs r5, #0x1a) я чувствую, что это код Thumb. Однако bx r5 является межсетевой ветвью, и, поскольку бит 0 в r5 не установлен, он будет взаимодействовать с состоянием ARM в середине некоторых инструкций Thumb и станет очень недовольным. Поскольку я считаю, что EXC_BAD_INSTRUCTION — это отчет iOS об исключении неопределенной инструкции, все это выглядит складывающимся.

Если вы находитесь в состоянии Thumb и хотите остаться в состоянии Thumb, либо используйте не взаимодействующую ветвь (т. е. mov pc, r5), либо убедитесь, что установлен бит 0 цели bx (т. е. сделайте смещение 0x1b).

person Notlikethat    schedule 09.07.2016
comment
Да вы правы. Я забыл установить бит 0 адреса назначения в r5. - person RyanB; 11.07.2016