2010-02-24 2 views
1

У меня есть ассемблерная программа, и я стараюсь ее понять. (Я действительно профилирую его). Есть ли инструмент/редактор Linux, который бы немного структурировал его для меня? Отображение, где циклов/скачков будет достаточно. Удобное описание того, что делает инструкция, было бы замечательно.Инструмент для понимания ассемблерных программ?

+0

У вас есть исходный код сборки, или вы используете дизассемблер на исполняемый файл? - Вы знаете сборку? x86 (32-разрядный) процессор? – mctylr

+0

У меня есть источник, сбрасываемый oprofile. Поэтому я думаю, что он похож на формат objdump. У меня есть источник, но с тяжелой оптимизацией oprofile (objdump?) Не удается найти соответствие между ASM и C++. –

+0

Итак, у вас есть разборка исполняемого файла, написанная на C++. Это совсем другой вопрос, чем понимание программы, первоначально написанной в сборке, потому что вы хотите установить соединение между конкретными инструкциями по сборке и исходным источником C++. Первое, что вы можете сделать, это убедиться, что компилятор C++ запущен _with debugging enabled_, поэтому дополнительная дополнительная информация отладки остается в исполняемом файле для дизассемблера для ссылки. Демонсаторы только возвращают процесс обратно к сборке. Существует также процесс декомпиляции. Это имеет тенденцию быть более трудным и не очень хорошим результатом. – mctylr

ответ

0

Asm plugin for Eclipse Вы могли бы использовать.

Однако, как правило, IDE не используются для программирования сборки. Я не уверен, насколько лучше вы поймете, как легко поймете, где прыжки и петли - вы все равно должны все прочесть.

0

Не очень, но вы всегда можете посмотреть на ссылки инструкции, используйте подсветку синтаксиса (VIM синтаксис asm), также вы можете выполнить его через отладчик, если нет никаких ограничений на его запуск. Для уже собранного кода это может быть интересно: LIDA

3

Если вы ищете что-то похожее на OllyDbg, но для Linux, вы можете попробовать edb.

1

Поскольку вы действительно меняете язык высокого уровня для профилирования, вы можете сделать пару вещей, чтобы помочь процессу. Сначала включите и сохраните информацию об отладке в компиляторе и компоновщике C++ (не позволяйте этому strip исполняемый файл). В g ++ флаг командной строки -g делает это. Во-вторых, многие компиляторы C++ имеют флаги для вывода исходного исходного кода, а не для удаления объектного кода (который используется компоновщиком). В g ++ флаг -S позволяет это.

Сборку из компилятора можно сравнить с сборкой с демонтажа oprofile.

Я не очень хорошо разбираюсь в декомпиляторах, но два из них содержат another SO post: Boomerang и REC для C, а не C++.

Я надеюсь, что это поможет.

0

Только для PowerPC CPU Проект Demono предназначен для восстановления алгоритмов двоичного кода (в настоящее время только для PPC) - и это не полностью декомпилятор. Проект находится в стадии разработки, но некоторые примеры - это работы. Сайт имеет онлайн сервис для генерации C-как описание функций из assebler: online service for decompile PPC asm

Для использования его, необходимо выполнить следующие действия:

  1. разбирайте двоичный код (для PowerPC) в тексте ассемблере (МАР)
  2. Вставка текста assebler в поле «Ассемблер»
  3. Нажмите кнопку «Восстановить»
  4. Посмотрите, чтобы сформировать «восстановленный алг оритм»

Например, если ваш ассемблер текст:

funct(){ 
    0x00000002: cmpw r3, r4  
    0x00000003: ble label_1  
    0x00000004: mr r6, r3  
    0x00000005: b label_2  
    0x00000006: label_1:  
    0x00000007: mr r6, r4  
    0x00000008: label_2:  
    0x00000009: cmpw r6, r5  
    0x0000000A: ble label_3  
    0x0000000B: mr r7, r6  
    0x0000000C: b label_4  
    0x0000000D: label_3:  
    0x0000000E: mr r7, r5  
    0x0000000F: label_4:  
    0x00000010: mr r3, r7  
    0x00000011: blr    
} 

Интернет сервис восстановления следующее описание алгоритма функция в:

funct(arg_w_0, arg_w_1, arg_w_2){ 
    if(arg_w_0>arg_w_1?true?false){ 
    arg_w_0=arg_w_1; 
    }else{ 
    } 
    if(arg_w_0>arg_w_2?true?false){ 
    arg_w_0=arg_w_2; 
    }else{ 
    } 
    return (arg_w_0); 
} 

И, следовательно, FUNCT() получить максимум из трех числа - max3().

Возможно, эта услуга поможет вам понять, как работает инструкции ассемблера ..

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