OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 17 Январь, 2019 19:54

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Странности компилятора
СообщениеДобавлено: Вторник, 22 Ноябрь, 2016 15:43 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1104
Откуда: СССР v2.0 rc 1
Привет всем!)
Если кто знает, в чём тут особенность -- объясните мне, пожалуйста.
Я открыл дизассемблированный бинарный код нескольких модулей. Во всех модулях есть странная комбинация ассемблерных команд, по пересылке значения из ячейки памяти в регистр ЕАХ и обратно из регистра ЕАХ в ячейку памяти.
Ниже пример такого дизассемблированного бинарного кода.
Код:
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


Кроме того, что отмечено в коде, поправьте, если я не прав: в Паскаль-стиле вызывающая сторона очищает стек, восстанавливает регистры (или я ошибаюсь?)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странности компилятора
СообщениеДобавлено: Вторник, 22 Ноябрь, 2016 17:53 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 259
Цитата:
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-мя командами, в смысле. Накомпилялось :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странности компилятора
СообщениеДобавлено: Вторник, 22 Ноябрь, 2016 18:21 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4199
Откуда: Россия, Орёл
А как и чем дизассемлирование проведено?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странности компилятора
СообщениеДобавлено: Вторник, 22 Ноябрь, 2016 18:26 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1104
Откуда: СССР v2.0 rc 1
Цитата:
Значение из адреса [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 адреса одинаковые!!!

Цитата:
А как и чем дизассемлирование проведено?

Встроенным диассемблером?!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странности компилятора
СообщениеДобавлено: Вторник, 22 Ноябрь, 2016 18:36 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2247
prospero78 писал(а):
Встроенным диассемблером?!

Валера, проверь, кстати, еще дизассемблером от Trurl
http://oberoncore.ru/bbcc/subs/dev/decoder
X512 сказал, что этот дизассемблер от Йозефа паленый какой-то, надо будет его заменить.

UPD: вижу, он тебе уже сам ответил :)
http://community.blackboxframework.org/ ... t=151#p828


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странности компилятора
СообщениеДобавлено: Вторник, 22 Ноябрь, 2016 18:50 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4199
Откуда: Россия, Орёл
Иван Денисов писал(а):
что этот дизассемблер от Йозефа паленый какой-то

Вот и я про то же...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странности компилятора
СообщениеДобавлено: Вторник, 22 Ноябрь, 2016 19:00 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1104
Откуда: СССР v2.0 rc 1
Скачал вариант от Trurl.
Без изменений.
Корявые названия в юникоде, те же перегоны ах <->mem


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странности компилятора
СообщениеДобавлено: Вторник, 22 Ноябрь, 2016 20:10 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1118
А что за модули? Может у Вас там
Код:
a:=a


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странности компилятора
СообщениеДобавлено: Вторник, 22 Ноябрь, 2016 21:02 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1104
Откуда: СССР v2.0 rc 1
Не, такого смешного кода у меня нет)))
Думаю, причина в другом -- я модуль не скомпилировал))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странности компилятора
СообщениеДобавлено: Вторник, 22 Ноябрь, 2016 21:13 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1118
Хм, а что же оно тогда дизассемблировало?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странности компилятора
СообщениеДобавлено: Вторник, 22 Ноябрь, 2016 21:20 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1104
Откуда: СССР v2.0 rc 1
Модуль в версии 1.7 не компилируется 19 ошибок.
Ругается на
Цитата:
out.WriteSString(mname);

mname? что-то требует в виде открытого массива, а передаётся CHAR(?)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странности компилятора
СообщениеДобавлено: Вторник, 22 Ноябрь, 2016 23:21 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2289
Откуда: Россия, Санкт-Петербург
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
...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB