nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 15 Oct 2018 05:00



Reply to topic  [ 263 posts ]  Go to page Previous  1 ... 10, 11, 12, 13, 14, 15, 16 ... 18  Next
Отладочный модуль на К1801ВМ1 
Author Message
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Lavr wrote:
Посмотрел код - нашел места, где обрабатывают адрес FFCC, кстати не так, как я ожидал.
Я ожидал сравнения на число FFCC, а в коде делается так:
Code:
004120C5: 8B8ED0000000                 mov       ecx,[esi][0000000D0]
004120CB: 68CCFF0000                   push      00000FFCC
004120D0: E82B23FFFF                   call     .000404400

Я, конечно, не большой специалист по С++, но как работает код всё же представляю.
В С++ есть вот такой абзац:
Code:
void CCovox::SetWord (int addr, WORD value)
{
  ASSERT (addr == 0177714);

  if (addr == 0177714)
  {
    SetSample (value);
  }
}

Ну про ASSERT - ладно - Shaos мне объяснил...
Но вот дальше: if (addr == 0177714)

Взял я сегодня один свой коротенький (чтоб легче искать) проект на С++, и вставил в него очень
похожий код:
Code:
  if (addr == 0177714)
  {
    // SetSample (value);
    Sleep(0177714); //--- это аналог вызова функции
  }
  Sleep(10000); //--- это в исходном коде так и было

Скомпилировал и поискал в коде сигнатуру CC FF (=o177714). Вот что нашел:
Code:
.004011D7: 8B842430050000               mov       eax,[esp][000000530]
.004011DE: 8B3594F14000                 mov       esi,[00040F194] - это явно указатель на ф-цию  Sleep
.004011E4: 83C404                       add       esp,004
.004011E7: 3DCCFF0000                   cmp       eax,00000FFCC - if (addr == 0177714)
.004011EC: 7507                         jne      .0004011F5

.004011EE: 68CCFF0000                   push      00000FFCC \    - 0177714
.004011F3: FFD6                         call      esi - Sleep(0177714);

.004011F5: 6810270000                   push      000002710 \  - 10000
.004011FA: FFD6                         call      esi - Sleep(10000);

Ну cmp eax,00000FFCC <==> if (addr == 0177714) я просто ожидал! :wink:
Остальное - просто интересно...

Только вот в коде эмулятора БК-0010 кода cmp eax,00000FFCC или чего похожего не нашлось... :o

_________________
iLavr


13 Jan 2018 13:03
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Написал письмо автору эмулятора - Юрию Калмыкову, а он исчез... однако. :o
Quote:
Final-Recipient: rfc822; kalmykov@stoik.com
Action: failed
Status: 5.0.0
Diagnostic-Code: smtp; 550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser b38sor10147536uad.30 - gsmtp
Last-Attempt-Date: Sat, 13 Jan 2018 20:19:41 -0800 (PST)

_________________
iLavr


13 Jan 2018 22:41
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 16995
Location: Colorado
Reply with quote
Lavr wrote:
Только вот в коде эмулятора БК-0010 кода cmp eax,00000FFCC или чего похожего не нашлось... :o

Может эмулятор 16-битный? :roll:

_________________
:eugeek: https://twitter.com/Shaos1973


14 Jan 2018 03:09
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
Может эмулятор 16-битный? :roll:

Да нет... не 16-битный, я уже почти все аналогии в коде нашел.
Вот, к примеру, смотри:
Код С++
Code:
  SetWordIndirect (0177660, 0);
  SetWordIndirect (0177662, 0);
  SetWordIndirect (0177664, 01330);
  SetWordIndirect (0177706, 0);
  SetWordIndirect (0177710, 0);
  SetWordIndirect (0177712, 0);
  SetWordIndirect (0177714, 0);

Этот код на ассемблере:
Code:
.00404594: 8B4E18                       mov       ecx,[esi][00018]
.00404597: 52                           push      edx
.00404598: 68B0FF0000                   push      00000FFB0; 0177660
.0040459D: 8B01                         mov       eax,[ecx]
.0040459F: FF5024                       call      d,[eax][00024]

.004045A2: 8B4E18                       mov       ecx,[esi][00018]
.004045A5: 33DB                         xor       ebx,ebx
.004045A7: 53                           push      ebx
.004045A8: 68B2FF0000                   push      00000FFB2; 0177662
.004045AD: 8B11                         mov       edx,[ecx]
.004045AF: FF5224                       call      d,[edx][00024]

.004045B2: 8B4E18                       mov       ecx,[esi][00018]
.004045B5: 68D8020000                   push      0000002D8; o1330; 728d
.004045BA: 68B4FF0000                   push      00000FFB4; SetWordIndirect (0177664, 01330);
.004045BF: 8B01                         mov       eax,[ecx]
.004045C1: FF5024                       call      d,[eax][00024] SetWordIndirect

.004045C4: 8B4E18                       mov       ecx,[esi][00018]
.004045C7: 53                           push      ebx
.004045C8: 68C6FF0000                   push      00000FFC6; 0177706
.004045CD: 8B11                         mov       edx,[ecx]
.004045CF: FF5224                       call      d,[edx][00024]

.004045D2: 8B4E18                       mov       ecx,[esi][00018]
.004045D5: 53                           push      ebx
.004045D6: 68C8FF0000                   push      00000FFC8; 0177710
.004045DB: 8B01                         mov       eax,[ecx]
.004045DD: FF5024                       call      d,[eax][00024]

.004045E0: 8B4E18                       mov       ecx,[esi][00018]
.004045E3: 53                           push      ebx
.004045E4: 68CAFF0000                   push      00000FFCA; 0177712
.004045E9: 8B11                         mov       edx,[ecx]
.004045EB: FF5224                       call      d,[edx][00024]

.004045EE: 8B4E18                       mov       ecx,[esi][00018]
.004045F1: 53                           push      ebx
.004045F2: 68CCFF0000                   push      00000FFCC ; 0177714 ***
.004045F7: 8B01                         mov       eax,[ecx]
.004045F9: FF5024                       call      d,[eax][00024] SetWordIndirect

Но не могу найти вот этой аналогии:
Code:
  if (addr == 0177714)
  {
     SetSample (value);
  }

Как ты считаешь if (addr == 0177714) можно выполнить иначе чем cmp eax,00000FFCC ?
Ну то есть без cmp ?

_________________
iLavr


14 Jan 2018 10:34
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 16995
Location: Colorado
Reply with quote
ну можно скажем push 0000FFCC и потом pop его в какой-то регистр и потом сравнивать уже регистры?
и допустим если у человека включена жестокая оптимизация и этот адрес уже сидит в каком то регистре...

_________________
:eugeek: https://twitter.com/Shaos1973


14 Jan 2018 10:56
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
ну можно скажем push 0000FFCC и потом pop его в какой-то регистр и потом сравнивать уже регистры?

Я тоже уже про это думал... :-?
Тут еще в чем сложность - исходники от версии 3.0, а код от версии 2.6.
Я предполагаю, что разницы большой между ними не случилось в обработке порта FFCC.
Но может так быть что в версии 2.6 этот момент был написан иначе - я поэтому и компилировал
сам отдельно похожий участок: он выдает, что if (addr == 0177714) компилируется в cmp eax,00000FFCC.

А push 0000FFCC - это, как мне кажется, судя по коду - передача аргумента в функцию.


Собственно, я и попробовал написать письмо автору - спросить исходники для версии 2.6.

_________________
iLavr


14 Jan 2018 11:16
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 16995
Location: Colorado
Reply with quote
Ну если у тебя код более старый чем исходники, то видимо там этой строчки вообще небыло?

_________________
:eugeek: https://twitter.com/Shaos1973


14 Jan 2018 11:47
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
Ну если у тебя код более старый чем исходники, то видимо там этой строчки вообще небыло?

Может быть... Но как-то должно же происходить выделение адреса 0000FFCC.
Тем паче, что судя по коду версии 3.0, автор не мудрствовал лукаво в выделении адресов портов.
Их там потом больше интересовало качество и плавность звука.

Ладно... подумаю еще над кодом...


P.S. Могло быть сделано через switch (...) case ...

_________________
iLavr


14 Jan 2018 11:52
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Наверное, всё же в версии 2.6 проверки if (addr == 0177714) не было.
Такое ощущение, что автор в версии 3.0 её непонятно зачем добавил, перестраховался что ли...

Вот так идет вызов:
Code:
  case 0177714:
    if (m_pCovox)
      m_pCovox->SetWord (0177714, src);
    return;
То есть адрес 0177714 уже выделен.
Но дальше в SetWord опять проверка на адрес 0177714 :
Code:
void CCovox::SetWord (int addr, WORD value)
{
  ASSERT (addr == 0177714);

  if (addr == 0177714)
  {
    SetSample (value);
  }
}
По меньшей мере такое сочетание странно.
В SetWord не должно быть if (addr == 0177714). Тогда всё похоже на истину.

_________________
iLavr


14 Jan 2018 12:13
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Shaos, пока я ищу точку входа (а я надеюсь, что всё же найду), посмотри вот этот материал:
http://arhiv.xaker.name/threads/22158/

Всё ли там достоверно? Ибо другого плана внедриться в код .ехе-файла у меня просто нет.

_________________
iLavr


14 Jan 2018 15:07
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 16995
Location: Colorado
Reply with quote
А зачем внедряться, если есть более новые исходники? Просто собери исходники и вперёд

_________________
:eugeek: https://twitter.com/Shaos1973


14 Jan 2018 21:20
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
Просто собери исходники и вперёд
С ними приложен уже и собранный .ехе - но версия 3.0 уже не работает в Вынь 98 и Вынь ХР,
иначе бы я, бесусловно, не морочил себе и другим голову...

Но в познавательных целях морочить себе голову, оказывается, очень полезно порой! :roll:
Lavr wrote:
Но дальше в SetWord опять проверка на адрес 0177714 :
Code:
void CCovox::SetWord (int addr, WORD value)
{
  ASSERT (addr == 0177714);

  if (addr == 0177714)
  {
    SetSample (value);
  }
}

По меньшей мере такое сочетание странно.

Скомпилировал я для проверки это "странное сочетание"...
Так вот компилятор С++ тоже считает вторую проверку if (addr == 0177714) не только
странной, но и ненужной! И ОН ЕЁ ПРОСТО УДАЛЯЕТ!!! АФИГЕННО!!!
Поэтому я и не могу найти cmp eax,00000FFCC ТАМ ЕЁ ПРОСТО НЕТ! :o

Ну и заодно посмотрел, как компилятор С++ разворачивает конструкцию switch (...) case ...
Тоже очень интересно... хотя и не так потрясно... 8)

_________________
iLavr


15 Jan 2018 00:26
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 16995
Location: Colorado
Reply with quote
Ну если собрать правильным компилятором, то поди и в Win98 заработает?

_________________
:eugeek: https://twitter.com/Shaos1973


15 Jan 2018 01:22
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
Ну если собрать правильным компилятором, то поди и в Win98 заработает?

Нет, об этом прямо предупреждают там, где выложены исходники.
Начиная с версии 3.0, эмулятор БК-0010 ориентирован на Вин 7, Виста и т.д.

Да я уже почти все нашел. Пустот в коде много. Даже интересно будет попробовать
все же сделать "инжекцию" в код.
Один раз у меня это не получилось, надо попробовать еще раз... :wink:

_________________
iLavr


15 Jan 2018 01:57
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 16995
Location: Colorado
Reply with quote
Ну может человек перешел на вижуалстудию более новой версии - вот сборка 3.0 и перестала быть совместимой со старыми виндами
А ты попробуй пересобери исходники в старой вижуалстудии - авось заведётся?

_________________
:eugeek: https://twitter.com/Shaos1973


15 Jan 2018 02:07
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 263 posts ]  Go to page Previous  1 ... 10, 11, 12, 13, 14, 15, 16 ... 18  Next

Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.