OberonCore https://forum.oberoncore.ru/ |
|
Странности компилятора https://forum.oberoncore.ru/viewtopic.php?f=29&t=5958 |
Страница 1 из 1 |
Автор: | prospero78 [ Вторник, 22 Ноябрь, 2016 15:43 ] |
Заголовок сообщения: | Странности компилятора |
Привет всем!) Если кто знает, в чём тут особенность -- объясните мне, пожалуйста. Я открыл дизассемблированный бинарный код нескольких модулей. Во всех модулях есть странная комбинация ассемблерных команд, по пересылке значения из ячейки памяти в регистр ЕАХ и обратно из регистра ЕАХ в ячейку памяти. Ниже пример такого дизассемблированного бинарного кода. Код: PROCEDURE $$ 00000000H: 55 push ebp 00000001H: 8B EC mov ebp, esp 00000003H: 57 push edi 00000004H: 56 push esi 00000005H: 66|A1 00 00 00 64 mov ax, [1677721600] (* 1 *) 0000000BH: 66|A3 00 00 00 64 mov [1677721600], ax (* вот это зачем? *) 00000011H: 66|A1 00 00 00 64 mov ax, [1677721600] (* повтор 1 *) 00000017H: 66|A3 00 00 00 64 mov [1677721600], ax (* повтор 1 непонятно зачем *) 0000001DH: 50 push eax 0000001EH: 66|A1 0D 00 00 64 mov ax, [1677721613] 00000024H: 50 push eax 00000025H: 68 00 00 00 64 push 1677721600 0000002AH: 68 00 00 00 64 push 1677721600 0000002FH: FF 15 00 00 00 64 call [1677721600] 00000035H: 66|A1 00 00 00 64 mov ax, [1677721600] 0000003BH: 66|A3 20 00 00 64 mov [1677721632], ax 00000041H: 66|A1 00 00 00 64 mov ax, [1677721600] (* вот это зачем??? *) 00000047H: 66|A3 19 00 00 64 mov [1677721625], ax 0000004DH: 50 push eax 0000004EH: 66|A1 3D 00 00 64 mov ax, [1677721661] 00000054H: 50 push eax 00000055H: 68 00 00 00 64 push 1677721600 0000005AH: 68 00 00 00 64 push 1677721600 0000005FH: FF 15 00 00 00 64 call [1677721600] 00000065H: C6 05 00 00 00 64 00 mov [1677721600], 0 0000006CH: 66|A1 00 00 00 64 mov ax, [1677721600] (* так регистр не обнуляется! ax -- младшая половина обнулена, а что со старшей? *) 00000072H: 66|A3 50 00 00 64 mov [1677721680], ax 00000078H: 66|A1 00 00 00 64 mov ax, [1677721600] (* вот это опять зачем?? *) 0000007EH: 66|A3 49 00 00 64 mov [1677721673], ax 00000084H: 50 push eax 00000085H: 66|A1 74 00 00 64 mov ax, [1677721716] 0000008BH: 50 push eax 0000008CH: 68 26 00 00 64 push 1677721638 00000091H: 68 00 00 00 64 push 1677721600 00000096H: FF 15 31 00 00 64 call [1677721649] 0000009CH: 66|A1 00 00 00 64 mov ax, [1677721600] 000000A2H: 66|A3 87 00 00 64 mov [1677721735], ax 000000A8H: 66|A1 00 00 00 64 mov ax, [1677721600] (* вот этот повтор опять зачем? *) 000000AEH: 66|A3 80 00 00 64 mov [1677721728], ax 000000B4H: 50 push eax 000000B5H: 66|A1 A4 00 00 64 mov ax, [1677721764] 000000BBH: 50 push eax 000000BCH: 68 56 00 00 64 push 1677721686 000000C1H: 68 00 00 00 64 push 1677721600 000000C6H: FF 15 61 00 00 64 call [1677721697] 000000CCH: C6 05 00 00 00 64 00 mov [1677721600], 0 000000D3H: 5E pop esi 000000D4H: 5F pop edi 000000D5H: 8B E5 mov esp, ebp 000000D7H: 5D pop ebp 000000D8H: C3 ret Кроме того, что отмечено в коде, поправьте, если я не прав: в Паскаль-стиле вызывающая сторона очищает стек, восстанавливает регистры (или я ошибаюсь?) |
Автор: | Artyemov [ Вторник, 22 Ноябрь, 2016 17:53 ] |
Заголовок сообщения: | Re: Странности компилятора |
Цитата: 00000035H: 66|A1 00 00 00 64 mov ax, [1677721600] 0000003BH: 66|A3 20 00 00 64 mov [1677721632], ax 00000041H: 66|A1 00 00 00 64 mov ax, [1677721600] (* вот это зачем??? *) 00000047H: 66|A3 19 00 00 64 mov [1677721625], ax Значение из адреса [1677721600] "появляется" сначала по адресу [1677721632], а потом и по адресу [1677721625]. Зачем??? Почему не 3-мя командами, в смысле. Накомпилялось |
Автор: | Борис Рюмшин [ Вторник, 22 Ноябрь, 2016 18:21 ] |
Заголовок сообщения: | Re: Странности компилятора |
А как и чем дизассемлирование проведено? |
Автор: | prospero78 [ Вторник, 22 Ноябрь, 2016 18:26 ] |
Заголовок сообщения: | Re: Странности компилятора |
Цитата: Значение из адреса [1677721600] "появляется" сначала по адресу [1677721632], а потом и по адресу [1677721625]. Зачем??? Почему не 3-мя командами, в смысле. Накомпилялось В каком месте??? Код: 00000005H: 66|A1 00 00 00 64 mov ax, [1677721600] (* 1 *) 0000000BH: 66|A3 00 00 00 64 mov [1677721600], ax (* вот это зачем? *) 00000011H: 66|A1 00 00 00 64 mov ax, [1677721600] (* повтор 1 *) 00000017H: 66|A3 00 00 00 64 mov [1677721600], ax (* повтор 1 непонятно зачем *) Здесь все 4 адреса одинаковые!!! Цитата: А как и чем дизассемлирование проведено? Встроенным диассемблером?! |
Автор: | Иван Денисов [ Вторник, 22 Ноябрь, 2016 18:36 ] |
Заголовок сообщения: | Re: Странности компилятора |
prospero78 писал(а): Встроенным диассемблером?! Валера, проверь, кстати, еще дизассемблером от Trurl http://oberoncore.ru/bbcc/subs/dev/decoder X512 сказал, что этот дизассемблер от Йозефа паленый какой-то, надо будет его заменить. UPD: вижу, он тебе уже сам ответил http://community.blackboxframework.org/ ... t=151#p828 |
Автор: | Борис Рюмшин [ Вторник, 22 Ноябрь, 2016 18:50 ] |
Заголовок сообщения: | Re: Странности компилятора |
Иван Денисов писал(а): что этот дизассемблер от Йозефа паленый какой-то Вот и я про то же... |
Автор: | prospero78 [ Вторник, 22 Ноябрь, 2016 19:00 ] |
Заголовок сообщения: | Re: Странности компилятора |
Скачал вариант от Trurl. Без изменений. Корявые названия в юникоде, те же перегоны ах <->mem |
Автор: | Trurl [ Вторник, 22 Ноябрь, 2016 20:10 ] |
Заголовок сообщения: | Re: Странности компилятора |
А что за модули? Может у Вас там Код: a:=a
|
Автор: | prospero78 [ Вторник, 22 Ноябрь, 2016 21:02 ] |
Заголовок сообщения: | Re: Странности компилятора |
Не, такого смешного кода у меня нет))) Думаю, причина в другом -- я модуль не скомпилировал)) |
Автор: | Trurl [ Вторник, 22 Ноябрь, 2016 21:13 ] |
Заголовок сообщения: | Re: Странности компилятора |
Хм, а что же оно тогда дизассемблировало? |
Автор: | prospero78 [ Вторник, 22 Ноябрь, 2016 21:20 ] |
Заголовок сообщения: | Re: Странности компилятора |
Модуль в версии 1.7 не компилируется 19 ошибок. Ругается на Цитата: out.WriteSString(mname); mname? что-то требует в виде открытого массива, а передаётся CHAR(?) |
Автор: | Александр Ильин [ Вторник, 22 Ноябрь, 2016 23:21 ] |
Заголовок сообщения: | Re: Странности компилятора |
prospero78 писал(а): Кроме того, что отмечено в коде, поправьте, если я не прав: в Паскаль-стиле вызывающая сторона очищает стек, восстанавливает регистры (или я ошибаюсь?) Поправлю: в Паскале вызываемая процедура чистит за собой, в Си - вызывающая.Я запомнил так: в Си есть процедуры с переменным числом параметров (*printf), а в Паскале нету. Только вызывающая сторона такой процедуры знает, сколько параметров она на самом деле запихала в стек, вот она и чистит за собой, то есть это Сишная фишка. В Паскале такого нет, там и вызываемый, и вызывающий - оба знают число параметров, так что чистить может кто угодно, но по факту сделано не так, как в Си (как в Си - см. выше). Wikipedia: Цитата: 2 Caller (вызывающий) clean-up
2.1 cdecl 2.2 syscall 2.3 optlink 3 Callee (вызываемый) clean-up 3.1 pascal 3.2 stdcall 3.3 Microsoft fastcall ... |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |