OberonCore
https://forum.oberoncore.ru/

Как посмотреть ассемблерный код, сгенерированный ББ?
https://forum.oberoncore.ru/viewtopic.php?f=2&t=2705
Страница 1 из 3

Автор:  QWERTYProgrammer [ Воскресенье, 20 Июнь, 2010 14:42 ]
Заголовок сообщения:  Как посмотреть ассемблерный код, сгенерированный ББ?

Много раз упоминалось, что можно посмотреть ассемблерный код, который генерирует ББ при компиляции модуля. Как это проще всего сделать? Это наверняка FAQ, но сразу ответ найти как то не удалось.

Автор:  Info21 [ Воскресенье, 20 Июнь, 2010 21:46 ]
Заголовок сообщения:  Re: Как посмотреть ассемблерный код, сгенерированный ББ?

QWERTYProgrammer писал(а):
Много раз упоминалось, что можно посмотреть ассемблерный код, который генерирует ББ при компиляции модуля. Как это проще всего сделать? Это наверняка FAQ, но сразу ответ найти как то не удалось.
FAQ--не FAQ, а вопрос забавный.
Студенты регулярно в машинный код влазят, самому разбираться неохота, зафиксировал для себя их рапорт: код, вроде, чистый.

Но если бы кто-то сделал типа статейки на тему как, что, и какие выводы, было бы общеполезно.

Автор:  id_ler [ Понедельник, 21 Июнь, 2010 05:58 ]
Заголовок сообщения:  Re: Как посмотреть ассемблерный код, сгенерированный ББ?

QWERTYProgrammer писал(а):
Много раз упоминалось, что можно посмотреть ассемблерный код, который генерирует ББ при компиляции модуля. Как это проще всего сделать?
Нужный модуль можно открыть в ВВ как Data File(hex). Сравнив несколько разных ocf-файлов, будет понятна структура. Дальше, в зависимости от задачи, можно скопировать или весь 16-ричный дамп, или нужную секцию в Notepad и сохранить в file.com Этот com-файл дизассемблировать в отладчике, дизассемблере или т.п., поддерживающем данный формат файла.

Автор:  id_ler [ Понедельник, 21 Июнь, 2010 09:22 ]
Заголовок сообщения:  Re: Как посмотреть ассемблерный код, сгенерированный ББ?

Вот небольшой фрагмент от начала модуля
Код:
 00000100 3436                    xor al, 36
00000102 203433                  and byte ptr [ebx+esi], dh
00000105 203446                  and byte ptr [esi+2*eax], dh
00000108 2036                    and byte ptr [esi], dh
0000010A 46                      inc esi
0000010B 2020                    and byte ptr [eax], ah
0000010D 304120                  xor byte ptr [ecx+20], al
00000110 3030                    xor byte ptr [eax], dh
00000112 2030                    and byte ptr [eax], dh
00000114 3020                    xor byte ptr [eax], ah
00000116 3030                    xor byte ptr [eax], dh
00000118 2020                    and byte ptr [eax], ah
0000011A 44                      inc esp
0000011B 3020                    xor byte ptr [eax], ah
0000011D 3030                    xor byte ptr [eax], dh
0000011F 2030                    and byte ptr [eax], dh
00000121 3020                    xor byte ptr [eax], ah
00000123 3030                    xor byte ptr [eax], dh
00000125 2020                    and byte ptr [eax], ah
00000127 363020                  xor byte ptr ss:[eax], ah
0000012A 3031                    xor byte ptr [ecx], dh
0000012C 2030                    and byte ptr [eax], dh
0000012E 3020                    xor byte ptr [eax], ah
00000130 3030                    xor byte ptr [eax], dh
00000132 0D0A383820              or eax, 2038380A
00000137 3030                    xor byte ptr [eax], dh
00000139 2030                    and byte ptr [eax], dh
0000013B 3020                    xor byte ptr [eax], ah
0000013D 3030                    xor byte ptr [eax], dh
0000013F 2020                    and byte ptr [eax], ah
00000141 3230                    xor dh, byte ptr [eax]
00000143 2030                    and byte ptr [eax], dh
00000145 3120                    xor dword ptr [eax], esp
00000147 3030                    xor byte ptr [eax], dh
00000149 2030                    and byte ptr [eax], dh
0000014B 3020                    xor byte ptr [eax], ah
0000014D 2030                    and byte ptr [eax], dh
0000014F 3020                    xor byte ptr [eax], ah
00000151 3030                    xor byte ptr [eax], dh
00000153 2030                    and byte ptr [eax], dh
00000155 3020                    xor byte ptr [eax], ah
00000157 3030                    xor byte ptr [eax], dh
00000159 2020                    and byte ptr [eax], ah
0000015B 3132                    xor dword ptr [edx], esi
0000015D 203438                  and byte ptr [eax+edi], dh
00000160 2036                    and byte ptr [esi], dh
00000162 352036430D              xor eax, 0D433620
00000167 0A36                    or dh, byte ptr [esi]
00000169 43                      inc ebx
0000016A 2036                    and byte ptr [esi], dh
0000016C 46                      inc esi
0000016D 2033                    and byte ptr [ebx], dh
0000016F 3120                    xor dword ptr [eax], esp
00000171 3030                    xor byte ptr [eax], dh
00000173 2020                    and byte ptr [eax], ah
00000175 3536203639              xor eax, 39362036
0000017A 2036                    and byte ptr [esi], dh
0000017C 3520373720              xor eax, 20373720
00000181 2037                    and byte ptr [edi], dh
00000183 3320                    xor esp, dword ptr [eax]
00000185 3030                    xor byte ptr [eax], dh
00000187 203530203646            and byte ptr [46362030], dh
0000018D 2020                    and byte ptr [eax], ah
0000018F 37                      aaa
00000190 3220                    xor ah, byte ptr [eax]
00000192 37                      aaa
00000193 3420                    xor al, 20
00000195 37                      aaa
00000196 3320                    xor esp, dword ptr [eax]
00000198 3030                    xor byte ptr [eax], dh
0000019A 0D0A343620              or eax, 2036340A
0000019F 36                      BYTE 036h

Автор:  bohdant [ Понедельник, 21 Июнь, 2010 11:03 ]
Заголовок сообщения:  Re: Как посмотреть ассемблерный код, сгенерированный ББ?

id_ler писал(а):
Нужный модуль можно открыть в ВВ как Data File(hex). Сравнив несколько разных ocf-файлов, будет понятна структура. Дальше, в зависимости от задачи, можно скопировать или весь 16-ричный дамп, или нужную секцию в Notepad и сохранить в file.com Этот com-файл дизассемблировать в отладчике, дизассемблере или т.п., поддерживающем данный формат файла.

То что вы привели на код кстати абсолютно не похоже. Поставте Int3 (или сделайте деление на ноль если в ББ нету возможности сотворить Инт3) в начале процедуры и загрузите код под отладчиком - будет значительно проще.

Странно как то, т.е. нету стандартных средств???
А разве исходников ББ нету?


В Бутылке просто в "проводнике" кликнув по модулю открывается декодер. Плюс есть дополнительные опции компилятора позволяющиее простматривать генерируемый llvm-код.

Автор:  QWERTYProgrammer [ Понедельник, 21 Июнь, 2010 15:39 ]
Заголовок сообщения:  Re: Как посмотреть ассемблерный код, сгенерированный ББ?

id_ler писал(а):
Этот com-файл дизассемблировать в отладчике, дизассемблере или т.п., поддерживающем данный формат файла.

Спасибо! Поскольку никогда прежде этим не занимался, просьба назвать примеры подходящих отладчика/дизассемблера. Для наглябности было бы очень неплохо привести полностью какой-нибудь простейший пример: ББ-модуль, соответствующий file.com и результирующий asm-код.

Автор:  bohdant [ Понедельник, 21 Июнь, 2010 15:55 ]
Заголовок сообщения:  Re: Как посмотреть ассемблерный код, сгенерированный ББ?

QWERTYProgrammer писал(а):
Спасибо! Поскольку никогда прежде этим не занимался, просьба назвать примеры подходящих отладчика/дизассемблера. Для наглябности было бы очень неплохо привести полностью какой-нибудь простейший пример: ББ-модуль, соответствующий file.com и результирующий asm-код.

Рекомендую
ollydbg/hiew32
hiew32 можно найти с таблеткой, но в этом случае и демо-версии вполне достаточно.
Прошу обратить внимание, что id_ler привел не вполне корректный способ :!:

Если исходники BlackBox существуют, то лучше глянуть на формат модулей, что бы вычислить смещения процедур и т.п.

Автор:  QWERTYProgrammer [ Понедельник, 21 Июнь, 2010 15:55 ]
Заголовок сообщения:  Re: Как посмотреть ассемблерный код, сгенерированный ББ?

Debug.exe?

Автор:  bohdant [ Понедельник, 21 Июнь, 2010 15:57 ]
Заголовок сообщения:  Re: Как посмотреть ассемблерный код, сгенерированный ББ?

т.к. начав дизассембилование по неправильному смещению, можно получить откровенную чепуху

Автор:  bohdant [ Понедельник, 21 Июнь, 2010 15:57 ]
Заголовок сообщения:  Re: Как посмотреть ассемблерный код, сгенерированный ББ?

QWERTYProgrammer писал(а):
Debug.exe?

?

Автор:  bohdant [ Понедельник, 21 Июнь, 2010 15:59 ]
Заголовок сообщения:  Re: Как посмотреть ассемблерный код, сгенерированный ББ?

1. Запустите OLLYDBG.EXE
2. Там выберите File->Attach и выберите BlackBox

Автор:  QWERTYProgrammer [ Понедельник, 21 Июнь, 2010 16:09 ]
Заголовок сообщения:  Re: Как посмотреть ассемблерный код, сгенерированный ББ?

bohdant писал(а):
QWERTYProgrammer писал(а):
Debug.exe?

?

Посмотрел hiew32, вроде "hiew32demo file.com" выдает те же коды, что и "debug file.com".
Имеют ли результаты какое-то отношение к реальности, не вполне ясно. Может все-таки есть соотв. ББ-tool?

Автор:  Иван Горячев [ Понедельник, 21 Июнь, 2010 16:51 ]
Заголовок сообщения:  Re: Как посмотреть ассемблерный код, сгенерированный ББ?

В \Dev\Spec\ лежат описания форматов всех файлов, в том числе и кодовых. В начале у модуля идёт заголовок и метаинформация, потом код, потом ещё служебка.

Автор:  hothing [ Понедельник, 21 Июнь, 2010 21:45 ]
Заголовок сообщения:  Re: Как посмотреть ассемблерный код, сгенерированный ББ?

На данный момент, в мире нет ничего лучше для дизассемблирования, чем IDA (Interdctive DisAssembler). Есть бесплатная версия.

http://www.idapro.ru/

Автор:  id_ler [ Вторник, 22 Июнь, 2010 07:01 ]
Заголовок сообщения:  Re: Как посмотреть ассемблерный код, сгенерированный ББ?

QWERTYProgrammer писал(а):
Посмотрел hiew32, вроде "hiew32demo file.com" выдает те же коды, что и "debug file.com".
Имеют ли результаты какое-то отношение к реальности, не вполне ясно.
Т.к. модуль вне ВВ практического значения не имеет, то лучше использовать отладчик и загружать весь ВВ, как писал bohdant . Цикл статей про ollydbg вроде был на wasm.ru Hiew -- мощная программа, которая может загрузить файл в любом формате и здесь преобразовывать в com-файл не нужно. Вообще, мое предложение с com-файлом было для большего выбора дизассемблирующих программ. Чтобы они не ругались на незнакомый формат. Корректность декодирования при этом, мягко говоря, не улучшается.

Автор:  Сергей Оборотов [ Вторник, 22 Июнь, 2010 13:21 ]
Заголовок сообщения:  Re: Как посмотреть ассемблерный код, сгенерированный ББ?

QWERTYProgrammer писал(а):
Много раз упоминалось, что можно посмотреть ассемблерный код, который генерирует ББ при компиляции модуля. Как это проще всего сделать? Это наверняка FAQ, но сразу ответ найти как то не удалось.
Наверное неправильно поняли. Он не ассемблерный.

Автор:  QWERTYProgrammer [ Вторник, 22 Июнь, 2010 23:40 ]
Заголовок сообщения:  Re: Как посмотреть ассемблерный код, сгенерированный ББ?

Сергей Оборотов писал(а):
QWERTYProgrammer писал(а):
Много раз упоминалось, что можно посмотреть ассемблерный код, который генерирует ББ при компиляции модуля. Как это проще всего сделать? Это наверняка FAQ, но сразу ответ найти как то не удалось.
Наверное неправильно поняли. Он не ассемблерный.


Хорошо, спрошу по-другому: когда я запускаю в ББ модуль, выполняющий некое вычисление, ББ должен послать CPU некую последовательность машинных команд, так? Если так, то каким образом можно эту последовательность команд узнать? Приведут ли предложенные манипиляции с Code-файлом и дизассемблером/отладчиком к требуемому результату?

Автор:  Илья Ермаков [ Вторник, 22 Июнь, 2010 23:44 ]
Заголовок сообщения:  Re: Как посмотреть ассемблерный код, сгенерированный ББ?

Да машинный он, машинный, всё Вы правильно понимаете; просто назвали ассемблерным, а ассемблер - это текстовая мнемоника для машинного, вот Сергей и поправил.

Автор:  id_ler [ Среда, 23 Июнь, 2010 08:20 ]
Заголовок сообщения:  Re: Как посмотреть ассемблерный код, сгенерированный ББ?

QWERTYProgrammer писал(а):
Приведут ли предложенные манипиляции с Code-файлом и дизассемблером/отладчиком к требуемому результату?
При компиляции ещё создается Sym-файл. Повторюсь, важнее – куда и как загружается модуль.

P.S. Объявление процедуры в машинных кодах: Dev/Docu/P-S-I
Пример
Код:
 PROCEDURE [code] Erase (adr, words: INTEGER)   (* erase memory area *)
      089H, 0C7H,         (* MOV EDI, EAX *)
      031H, 0C0H,         (* XOR EAX, EAX *)
      059H,         (* POP ECX *)
      0F2H, 0ABH;         (* REP STOS *)
В Code-файле такой последовательности маш. кодов не будет.

Автор:  igor [ Среда, 23 Июнь, 2010 08:45 ]
Заголовок сообщения:  Re: Как посмотреть ассемблерный код, сгенерированный ББ?

QWERTYProgrammer писал(а):
Много раз упоминалось, что можно посмотреть ассемблерный код, который генерирует ББ при компиляции модуля. Как это проще всего сделать?
Мне показалась интересной сама мысль, с точки зрения изучения генератора :wink: .

Страница 1 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/