Вопрос № 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-ом
Отвечает: Юра Устинов
Здравствуйте, 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