|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Отладочный модуль на К1801ВМ1
Author |
Message |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Я, конечно, не большой специалист по С++, но как работает код всё же представляю. В С++ есть вот такой абзац: Ну про ASSERT - ладно - Shaos мне объяснил... Но вот дальше: if (addr == 0177714)Взял я сегодня один свой коротенький (чтоб легче искать) проект на С++, и вставил в него очень похожий код: Скомпилировал и поискал в коде сигнатуру CC FF (=o177714). Вот что нашел: Ну cmp eax,00000FFCC <==> if (addr == 0177714) я просто ожидал! Остальное - просто интересно... Только вот в коде эмулятора БК-0010 кода cmp eax,00000FFCC или чего похожего не нашлось...
_________________ iLavr
|
13 Jan 2018 12:03 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Написал письмо автору эмулятора - Юрию Калмыкову, а он исчез... однако. | | | | Quote: Final-Recipient: rfc822; kalmykov@stoik.comAction: 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 21:41 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22567 Location: Silicon Valley
|
Может эмулятор 16-битный?
|
14 Jan 2018 02:09 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Да нет... не 16-битный, я уже почти все аналогии в коде нашел. Вот, к примеру, смотри: Код С++Этот код на ассемблере: | | | | 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 | | | | |
Но не могу найти вот этой аналогии: Как ты считаешь if (addr == 0177714) можно выполнить иначе чем cmp eax,00000FFCC ? Ну то есть без cmp ?
_________________ iLavr
|
14 Jan 2018 09:34 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22567 Location: Silicon Valley
|
ну можно скажем push 0000FFCC и потом pop его в какой-то регистр и потом сравнивать уже регистры? и допустим если у человека включена жестокая оптимизация и этот адрес уже сидит в каком то регистре...
|
14 Jan 2018 09:56 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Я тоже уже про это думал... Тут еще в чем сложность - исходники от версии 3.0, а код от версии 2.6. Я предполагаю, что разницы большой между ними не случилось в обработке порта FFCC. Но может так быть что в версии 2.6 этот момент был написан иначе - я поэтому и компилировал сам отдельно похожий участок: он выдает, что if (addr == 0177714) компилируется в cmp eax,00000FFCC. А push 0000FFCC - это, как мне кажется, судя по коду - передача аргумента в функцию. Собственно, я и попробовал написать письмо автору - спросить исходники для версии 2.6.
_________________ iLavr
|
14 Jan 2018 10:16 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22567 Location: Silicon Valley
|
Ну если у тебя код более старый чем исходники, то видимо там этой строчки вообще небыло?
|
14 Jan 2018 10:47 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Может быть... Но как-то должно же происходить выделение адреса 0000FFCC. Тем паче, что судя по коду версии 3.0, автор не мудрствовал лукаво в выделении адресов портов. Их там потом больше интересовало качество и плавность звука. Ладно... подумаю еще над кодом... P.S. Могло быть сделано через switch (...) case ...
_________________ iLavr
|
14 Jan 2018 10:52 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Наверное, всё же в версии 2.6 проверки if (addr == 0177714) не было. Такое ощущение, что автор в версии 3.0 её непонятно зачем добавил, перестраховался что ли... Вот так идет вызов: То есть адрес 0177714 уже выделен. Но дальше в SetWord опять проверка на адрес 0177714 : По меньшей мере такое сочетание странно. В SetWord не должно быть if (addr == 0177714). Тогда всё похоже на истину.
_________________ iLavr
|
14 Jan 2018 11:13 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Shaos, пока я ищу точку входа (а я надеюсь, что всё же найду), посмотри вот этот материал: http://arhiv.xaker.name/threads/22158/Всё ли там достоверно? Ибо другого плана внедриться в код .ехе-файла у меня просто нет.
_________________ iLavr
|
14 Jan 2018 14:07 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22567 Location: Silicon Valley
|
А зачем внедряться, если есть более новые исходники? Просто собери исходники и вперёд
|
14 Jan 2018 20:20 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
С ними приложен уже и собранный .ехе - но версия 3.0 уже не работает в Вынь 98 и Вынь ХР, иначе бы я, бесусловно, не морочил себе и другим голову... Но в познавательных целях морочить себе голову, оказывается, очень полезно порой! Скомпилировал я для проверки это "странное сочетание"... Так вот компилятор С++ тоже считает вторую проверку if (addr == 0177714) не только странной, но и ненужной! И ОН ЕЁ ПРОСТО УДАЛЯЕТ!!! АФИГЕННО!!!Поэтому я и не могу найти cmp eax,00000FFCC ТАМ ЕЁ ПРОСТО НЕТ! Ну и заодно посмотрел, как компилятор С++ разворачивает конструкцию switch (...) case ...Тоже очень интересно... хотя и не так потрясно...
_________________ iLavr
|
14 Jan 2018 23:26 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22567 Location: Silicon Valley
|
Ну если собрать правильным компилятором, то поди и в Win98 заработает?
|
15 Jan 2018 00:22 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Нет, об этом прямо предупреждают там, где выложены исходники. Начиная с версии 3.0, эмулятор БК-0010 ориентирован на Вин 7, Виста и т.д. Да я уже почти все нашел. Пустот в коде много. Даже интересно будет попробовать все же сделать "инжекцию" в код. Один раз у меня это не получилось, надо попробовать еще раз...
_________________ iLavr
|
15 Jan 2018 00:57 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22567 Location: Silicon Valley
|
Ну может человек перешел на вижуалстудию более новой версии - вот сборка 3.0 и перестала быть совместимой со старыми виндами А ты попробуй пересобери исходники в старой вижуалстудии - авось заведётся?
|
15 Jan 2018 01:07 |
|
|
Who is online |
Users browsing this forum: No registered users and 13 guests |
|
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
|
|