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

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

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

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 281
от 08.11.2005, 17:48

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


Вопрос № 28817: Здравствуйте, господа эксперты. Во-первых хочу поблагодарить Вас за четкие и полные ответы по предыдущим вопросам, спасибо огромное. Но тут ещё одна проблема, в институте дали зпдание на тему "Подпрограммы", но тему не объяснили, сказали ра...
Вопрос № 28825: Здравствуйте, господа эксперты!!! Меня интересует следующее: Как создать на асме программу (я понимаю что ручками), которая выполняла бы следующее: Имеется, к примеру, 4 компа, объединенных в локальную сеть. Программа должна при запуске на компе ...
Вопрос № 28845: Добрый день Эксперты. Нада мне тут в университете написать дизассемблер для проца 8088. Имею таблицу опкодов. Знаю струтуру команд. Знаю, что в начале *.сом и *.ехе файлов есть какаята область. Вот низнаю с чего начать. Не представляю как оброботать ...

Вопрос № 28.817
Здравствуйте, господа эксперты. Во-первых хочу поблагодарить Вас за четкие и полные ответы по предыдущим вопросам, спасибо огромное. Но тут ещё одна проблема, в институте дали зпдание на тему "Подпрограммы", но тему не объяснили, сказали разобраться дома самому, но мне не хватает своих знаний, поэтому обратился к вам за поддержкой. Условие : (выполниь в debug.exe) "В однобайтовом массиве заменить все числа, являющиеся простыми, их порядковыми номерами". И всё в условии больше ничего не сказанно. В условии я не понял ещё в каком однобайтовом массиве, т.е. откуда он начинается ... Заранее благодарен.
Отправлен: 02.11.2005, 22:32
Вопрос задал: S1lveR (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Master135
Здравствуйте, S1lveR!
В условии все правильно сказано.
Писать программу я за вас не буду, но по основным пунктам подскажу.
1) Делаем массив Answer Dи 20 dup ? из 20 однобайтных чисел. Теперь надо его как-то заполнить. Тут 3 варианта - вводить поэлементно с клавиатуры и считывать 1й ф-цией 21го прерывания, потом можно задавать самому, 3 генерировать случайно с помощью системных часов, что довольно не просто в реализации.
2) надо создать процедуру, которая бы определяла простое ли это число. Конечно есть множество оптимизаций под эту задачу, но самое простое - перебирать делители от 2 до 128, так как байт максимально может иметь значение 256. Процедура описывается так, Prost proc far, а заканчивается nick endp параметр передавать например через al, явно не указывать, а просто затолкать в стек (push) а в самой процедуре вытащить (pop). Да что я впрочем рассказываю, об этом есть множество книг в нете, напрмер Абеля или Юрова или Бредли...
3) Передвигаться по элементам массива вы будете наверняка с помощью индексного регистра si, поэтому, если процедура скажет что число простое, то вы вернете в каком-то регистре текущее значение si иначе само изначальное число.
4) Вывод результатов можно производить в этом же цикле(после того как узнали простое число или нет) выводим его второй функцией 21 прерывания.
Вроде бы все... А книгами я советую обзавестись. Удачи.
Ответ отправил: Master135 (статус: Студент)
Отправлен: 03.11.2005, 01:58

Отвечает: Лысков Игорь Витальевич
Здравствуйте, S1lveR!
Дополню експерта Master135
1) В условиях не оговорено, как заполнять массив, поэтому проще всего задать в самом тексте, например так: Answer db 6,34,17,47,...
2) можно сделать, чтобы процедура возвращала флаг С=1, когда простое, и С=0, когда непростое
3) Если в SI будет адрес массива, то по выходу, проанализировав С, можно будет по адресу [si-1] записать индекс как ( SI - offset Answer - 1 )
4) Вывод результатов в условиях не оговорен, скорее всего это лишнее, тем более что весь процесс будет наблюдаться под debug-ом

---------
Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: 7-ой класс)
Отправлен: 03.11.2005, 10:18

Отвечает: Юра Устинов
Здравствуйте, S1lveR!
Не знаю откуда он начинается, видимо откуда хотите, что касается алгоритма, то простые числа вам придётся хранить в таблице и проверять элемент со всеми.
Будет такого типа алгоритм:
mov cx,<размер массива>
metka:
mov si,0ffffh
metka2:
inc si
test massivelementov[cx],massivprostih[si]
jne metka2
mov dx,<размер массива>
sub dx,cx
mov massievelementov[cx],dx
test si,<kol-vo prostih>
jne metka2
loop metka1
Не тестил, но должно работать...Удачи!:)
---------
Спасём Россию!!!
Ответ отправил: Юра Устинов (статус: 4-ый класс)
Отправлен: 03.11.2005, 17:59


Вопрос № 28.825
Здравствуйте, господа эксперты!!!
Меня интересует следующее: Как создать на асме программу (я понимаю что ручками), которая выполняла бы следующее: Имеется, к примеру, 4 компа, объединенных в локальную сеть. Программа должна при запуске на компе №1 добавлять себя в автозапуск, затем искать в сети диски с полным доступом и если таковые есть, то копировать себя туда и запускаться. Т.е. она должна распространиться таким образом по сети!!! После того как она распространит себя должно показываться сообщение какое-нибудь.
Это нужно для дальнейшей реализации курсового (т.е. во благо знаний!!!), а пишу вам потому, что никогда на ассемблере не работал с сетью. Если поможете буду признателен!!!
Отправлен: 03.11.2005, 09:29
Вопрос задал: Rams (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Юра Устинов
Здравствуйте, Rams!
Автозапуск... Чтож, я думаю в реестре. А насчёт для знаний ;).
Всё остальное api-функциями и это уже не ассемблер. Извини, чем мог помог...
---------
Спасём Россию!!!
Ответ отправил: Юра Устинов (статус: 4-ый класс)
Отправлен: 03.11.2005, 18:00


Вопрос № 28.845
Добрый день Эксперты. Нада мне тут в университете написать дизассемблер для проца 8088. Имею таблицу опкодов. Знаю струтуру команд. Знаю, что в начале *.сом и *.ехе файлов есть какаята область. Вот низнаю с чего начать. Не представляю как оброботать эту область (да и саму скомпилированную программу). Подскажите пожалуйста алгоритм, если можете то лутше пошагово. Может быть и линк на информацию (если можно полный - до самого окна с информацией). спасибо за ответ.
Отправлен: 03.11.2005, 14:31
Вопрос задал: Olmi5404 (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Юра Устинов
Здравствуйте, Olmi5404!
В начале com файла нет никакой области(ты наверное имел ввиду PSP). Com - это чисто набор машкодов. У exe-шника же есть своя структура в которой много чего напихано, например, 3 и 4 байты - это <размер файла> div 512. Когда ты запускаешь com, то заметь ip = 100h, это потому что первые 256 байт занимет PSP - Program Segment Prefix, начни с этого,DOS при вызове СОМ-файла помещает в стек сегментный адрес программы и ноль, так что RET передает управление на нулевой адрес текущего сегмента, то есть на первый байт PSP. Там находится код команды INT 20h, которая и используется для возвращения управления в DOS. Можно сразу заканчивать программу командой INT 20h, хотя это длиннее на 1 байт.
Это так для общего познания. И ещё, есть отладочные регистры - это где-то между началом и серединой вашего проекта. Перехват прерываний напоследок....
Удачи...У вас классные задания в университете!!!
---------
Спасём Россию!!!
Ответ отправил: Юра Устинов (статус: 4-ый класс)
Отправлен: 03.11.2005, 18:00

Отвечает: Стас
Здравствуйте, Olmi5404!
Начни с COM программ (со структурой заголовка EXE разберешся позднее).
Как правильно заметил Юра Устинов COM это сразу "слепок" памяти начинающийся с адреса 100h и длиной в размер COM файла, там и код и данные вместе.
Прими все регистры перед началом дизасма равными 0. Кроме SP=FFFEh, IP=100h. В ячейку FFFEh кладешь word 0.
Цикл. Берешь первый байт по адресу IP смотришь, по таблице опкодов, длину команды, пишешь в тектовый файл мнемокод команды (разобравшись с аргументами, если они есть(длина команды>1), пишешь в текстовый файл и их, модифицируешь свои виртуальные регистры в соотвествии с командой, увеличиваешь IP на размер команды. Возможно стоит отметить, что данный адрес принадлежит к коду("КОД"), если какойто адрес использовался для загрузки/сохранения данных отмечаем его как "ДАННЫЕ". И к началу цикла.
Узнать о том, что прога завершается можно если IP=0, либо вызвана int20, либо Int21 с AH=4c.
Примерно так.
Вообщем задача не ординарная... Дерзай.
Ответ отправил: Стас (статус: Специалист)
Отправлен: 04.11.2005, 02:32


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

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

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

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

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


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


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

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.faq
Архив рассылки
Отписаться
Вспомнить пароль

В избранное