Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Ассемблер? Это просто! Учимся программировать


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler (Ассемблер)

Выпуск № 539
от 08.09.2006, 13:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 347, Экспертов: 30
В номере:Вопросов: 3, Ответов: 4


Вопрос № 54088: Здравствуйте. Хочу спросить может у кого из экспертов есть книги на русском языке или просто информация об алгоритмах преобразования двоичных чисел. Например мне надо двоичное число 1011011000101101010111101(не принципиально какое) преобразовать в дв...
Вопрос № 54095: Здравствуйте. Тогда спрошу по-другому. А можно ли узнать по какому адресу расположена программа, если знать,что она занимает, например, 2006 байт ?...
Вопрос № 54134: Здравствуйте. Не подскажете ли, как в DOS программе проверить, не запущена ли она под NT. Интересуют нестандартные решения, если они помогут уменьшить размер кода, ну, например, NT блокирует доступ куда-то там, а 9x - нет и попробовать получить досту...

< /tr>
Вопрос № 54.088
Здравствуйте. Хочу спросить может у кого из экспертов есть книги на русском языке или просто информация об алгоритмах преобразования двоичных чисел. Например мне надо двоичное число 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-программа.


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.36 от 06.09.2006
Яндекс Rambler's Top100

В избранное