2014-11-12 2 views
0

Я играю с Coldfire дизассемблер и найти этот кусок кода:Что делает эта инструкция bsr.l?

loc_F7E: 
    bsr.l loc_F7E+2 
    lea 12(sp),sp 
    pea (284).w 
    clr.l -(sp) 
    move.l a6,d0 
    addi.l #-636,d0 
    move.l d0,-(sp) 

loc_F98: 
    bsr.l loc_F98+2 
    lea $C(sp),sp 
    pea (284).w 
    clr.l -(sp) 
    move.l a6,d0 
    addi.l #-$398,d0 
    move.l d0,-(sp) 

Я пытаюсь выяснить, что это необходимость для тех, кто bsr.l. Для меня это только прыгает.

+0

Есть ли что-нибудь еще после 'move.l d0, - (sp)' в каждом случае? –

+0

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

+2

Является ли это исполняемым файлом, библиотекой, объектным файлом или что? Я просто задаюсь вопросом, является ли адрес назначения bsr фактически просто заполнителем, который фиксируется по ссылке/времени загрузки? –

ответ

0

Я думаю, что это может быть результатом оптимизации компилятора для более компактного кода. См. «Краткая оптимизация BRA» в руководстве для компилятора.

Последние версии IDA разберите такие ветки, как skip2 (есть также skip1) для кода HC08 и HC12. Я раньше не видел такой оптимизации в коде ColdFire.

EDIT: это может быть просто файл объекта с неразрешенными перемещениями.

+0

Я разобрал этот же код с REC (http://www.backerstreet.com/rec/), и он смог сказать мне, что это на самом деле вызовы функций и показать мне, какая функция. Поэтому я думаю, что вы правы, но, к сожалению, IDA не может понять это! –

+1

отправьте отчет об ошибке. –

0

В соответствии с руководством bsr.l *+2 имеет шестнадцатеричный код $61FF $0000 $0000, поэтому это, скорее всего, результат демонтажа объектного кода с неразрешенными перемещениями, о чем упомянул об этом Игорь Скочинский.

+0

Я думаю, что вы правы. Смотрите мой ответ на Игоря. –

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