Вопрос № 54088: Здравствуйте. Хочу спросить может у кого из экспертов есть книги на русском языке или просто информация об алгоритмах преобразования двоичных чисел. Например мне надо двоичное число 1011011000101101010111101(не принципиально какое) преобразовать в дв...Вопрос № 54095: Здравствуйте. Тогда спрошу по-другому. А можно ли узнать по какому адресу расположена программа, если знать,что она занимает, например, 2006 байт ?...Вопрос № 54134: Здравствуйте. Не подскажете ли, как в DOS программе проверить, не запущена ли она под NT. Интересуют нестандартные решения, если они помогут уменьшить размер кода, ну, например, NT блокирует доступ куда-то там, а 9x - нет и попробовать получить досту...
Вопрос № 54.088
<
/tr>
Здравствуйте. Хочу спросить может у кого из экспертов есть книги на русском языке или просто информация об алгоритмах преобразования двоичных чисел. Например мне надо двоичное число 1011011000101101010111101(не принципиально какое) преобразовать в двоично десятичное, из команд ассемблера имеется только сложение, вычитание, логические операции и операции сдвига, ну там еще переходы условные и безусловные... вобщем напрямую никак. Это только пример, можно и другие привести, нужно например поделить 16 битное число
на 16 битное, а в распоряжении имеются только восьмибитные регистры.
Отправлен: 02.09.2006, 15:58
Вопрос задал: Dark128 (статус: 6-ой класс)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 2)
Отвечает: Physicist
Здравствуйте, Dark128!
Делим число на 100, получаем частное и остаток. Остаток преобразуем в двоично-десятичную форму (получаем две последние цифры в десятичном представлении), затем производим то же самое и с частным. И так до тех пор, пока в частном не останется 0. Если в распоряжении только 8-битные регистры, то делить на 100 многобайтовое число нужно "в столбик" (как учили в школе, только основание системы счисления будет 256, а не 10).
Примерно также (в столбик) можно поделить и 16-битное на 16-битное, но этот случай чуть сложнее. Можете посмотреть, как в 16-битных компиляторах (Pascal,C++) поддерживались операции с 32-байтовыми целыми - обычно исходники этих функций поставлялись вместе с компиляторами. А еще лучше посмотрите реализацию существующих библиотек для работы с "большими" числами.
Ответ отправил: Physicist (статус: Студент)
Ответ отправлен: 02.09.2006, 18:04 Оценка за ответ: 5
Вопрос № 54.095
Здравствуйте. Тогда спрошу по-другому. А можно ли узнать по какому адресу расположена программа, если знать,что она занимает, например, 2006 байт ?
Отправлен: 02.09.2006, 17:54
Вопрос задал: Whiteman (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: EPDSota
Здравствуйте, Whiteman!
В общем случае зная размер программы нельзя определить ее адрес...
В ДОСе можно посмотреть - зная сколько ОЗУ занимает сегмент кода во время выполения, ища по цепочке выделенной памяти ДОСа, можно найти программу аналогичного размера (может она и окажется искомой)...
В Виндовсе - получив список процессов можно найти похожий (та-же оговорка, что и в ДОСе)...
--------- Открыть глаза навстречу солнцу
Ответ отправил: EPDSota (статус: Специалист)
Ответ отправлен: 02.09.2006, 18:12 Оценка за ответ: 4
Вопрос № 54.134
Здравствуйте. Не подскажете ли, как в DOS программе проверить, не запущена ли она под NT. Интересуют нестандартные решения, если они помогут уменьшить размер кода, ну, например, NT блокирует доступ куда-то там, а 9x - нет и попробовать получить доступ - не получилось, значит NT. И так далее
Отправлен: 03.09.2006, 08:54
Вопрос задал: Sha_Lun (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: EPDSota
Здравствуйте, Sha_Lun!
Получи адрес переменных окружения из PSP и проверь, есть ли там строка OS=Windows_NT - если нет, то это или 9х (или NT3.51() - это уж только у большого любителя найдеться)
--------- Открыть глаза навстречу солнцу
Ответ отправил: EPDSota (статус: Специалист)
Ответ отправлен: 04.09.2006, 09:30
Отвечает: mix_mix
Здравствуйте, Sha_Lun!
Любите нестандартные медоты - это ко мне.
1.
mov ecx,cs
xor cl,cl
jecxz @win9X
win9X:
2. Также можно через PEB (Process Enviroment Block):
mov ecx,fs:[30h]
mov eax,[ecx+0Ch] ;в NT 08h - ImageBase, 0Ch - LdrData, а в 9х оба = 0
test eax,eax
je win9x
;для NT можно доп-но версию извлечь
mov eax,[ecx+0A4h] ;OSMajorVersion
mov edx,[ecx+0A8h] ;OSMinorVersion
movzx ecx,word ptr [ecx+0ACh] ;OSBuildNumber
И без всяких Вин Апи :)
Ответ отправил: mix_mix (статус: 5-ый класс)
Ответ отправлен: 04.09.2006, 17:26 Оценка за ответ: 4 Комментарий оценки: Все это хорошо, конечно, но у меня DOS-программа.