Вопрос № 98556: Здраствуйте как сделать чтоб программа запускала файл 1.exe ??...Вопрос № 98574: Пытаюсь *.asm файл скомпилировать в MASM'е, пишет "LINK: fatal error LNK1104: cannot open file "import32.lib". Ему что ли явный путь указать? А когда этот экзешник будет запускаться на другом компе, там-то он откуда узнает где библиоте...Вопрос № 98578: Здравствуйте, уважаемые эксперты!
Разъясните, пожалуйста, мне 2 вопроса.
1. К главе 10 прилагаются 2 программы: prog10 и test10. В общем, они показывают, как строка «My string»из test10 заменяется строкой «Моя строка» из prog10. Известно также, ч...
Вопрос № 98.556
Здраствуйте как сделать чтоб программа запускала файл 1.exe ??
Отвечает: IceWolf
Здравствуйте, Василий Васильевич Сквозняков!
Вот статья из уроков Iczelion'а, там описывается запуск с использованием CreateFile http://wasm.ru/article.php?article=1001014
Также можно использовать ShellExecute/ShellExecuteEx из shell32.dll:
HINSTANCE ShellExecute(
--------- И да поможет вам F1, и да сохранит вас F2!
Ответ отправил: IceWolf (статус: 10-ый класс)
Ответ отправлен: 16.08.2007, 01:36
Вопрос № 98.574
Пытаюсь *.asm файл скомпилировать в MASM'е, пишет "LINK: fatal error LNK1104: cannot open file "import32.lib". Ему что ли явный путь указать? А когда этот экзешник будет запускаться на другом компе, там-то он откуда узнает где библиотека?
Если пытаюсь в WinAsm сделать тоже самое, то там кнопки "assemble", "link", "go all", "execute" не активны, хотя путь к masm'у прописан. Они так и должны быть не активны при открытии asm-файла? Как его тогда компилировать?
Отправлен: 16.08.2007, 07:19
Вопрос задал: Blackie (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: IceWolf
Здравствуйте, Blackie!
Да, нужно указывать полный путь к .lib'у (обычно masm32lib<имя файла>.lib). Но ошибка, скорее всего, не из за этого. Вы, вероятно, раньше использовали TASM, в нём, насколько помню, .lib'ы всех библиотек собраны в файле import32.lib, в пакете MASM32 нет файла import32.lib-нужно указывать .lib'ы для каждой DLL из которой импортируете функции отдельно, также советую прописать .inc файлы с прототипами функций чтобы работал макрос invoke, вот так:
include masm32includewindows.inc
include masm32includekernel32.inc
include masm32includeuser32.inc
Чтобы WinAsm компилировал проект, точнее запустил masm, который его скомпилирует, нужно создать проект (File->New Project). Далее в окне Explorer (Viev->Explorer) удалите из проекта автоматически созданный пустой .asm файл, если хотите использовать уже готовый, а не набирать заново (щелкаете на нём правой кнопкой->Remove file), потом добавляем к проекту свой .asm файл (щелчок в Explorer'е->Add Files, выбираете файл) Сохраняете проект, ассемблируете, запускаете, радуетесь.
Удачи!
--------- И да поможет вам F1, и да сохранит вас F2!
Ответ отправил: IceWolf (статус: 10-ый класс)
Ответ отправлен: 16.08.2007, 08:44
Вопрос № 98.578
Здравствуйте, уважаемые эксперты! Разъясните, пожалуйста, мне 2 вопроса.
1. К главе 10 прилагаются 2 программы: prog10 и test10. В общем, они показывают, как строка «My string»из test10 заменяется строкой «Моя строка» из prog10. Известно также, что некоторые команды могут быть заменены эквивалентными, например:
push cs mov ax,cs
pop ds <=эквивалентно=> mov ds,ax
В prog10 в метке процесса Ok_09 как раз встречаются push cs и pop ds, которые я решил заменить на соответствующие им mov ax,cs и mov ds,ax. Однако после замены этих команд в программе prog10 строка «Моя строка!» перестаёт выводиться как раньше. Вообще ничего не выводится. Почему так происходит? Может, эти команды не всегда являются эквивалентными?
2. Для чего в этой же метке процесса Ok_09 нужно сохранять регистры ds и dx? Автор пишет, что они будут изменяться, поэтому мы их и сохраняем. Но у меня под отладчиком AFDPRO эти регистры не меняются. Я даже изменял код программы, убрав из Ok_09 строки, сохраняющие эти регистры, то есть: push ds, push dx и pop dx, pop ds. И у меня программа правильно работала, то есть производила замену строки.
Заранее спасибо.
Приложение:
Отправлен: 16.08.2007, 08:50
Вопрос задал: Masada (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: IceWolf
Здравствуйте, Masada!
1) На самом деле эти команды не эквивалентны, рассмотрим что они делают:
push ds-толкаем регистр в стек, т.е. уменьшает значение sp на 2 (для 16-битного регистра) и записывает значение регистра в память по адресу sp, значения регистров, кроме sp не изменяются
pop ds читает в регистр значение по адресу sp и увеличивает его значение на два, значения других регистров, кроме ds и sp не изменяются
mov ax, dx -а вот здесь мы изменяем значение регистра ax-присваиваем ему значение ds, а что было до этого в регистре ax?... точнее его страдавшее части ah-там было число 09h которое говорит вызываемому прерыванию 21h(call dword ptr cs:[Int_21h_vect]) что мы хотим вывести строку, а не, например, открыть файл6ведб прерывание 21h выполняет очень много функций. В регистре ds-сегмент данных, в принципе, произвольное число вот и 21h прерывание приняв неверный параметр в ah
оканчивается ошибкой.
Подведём итог:
push cs
pop ds ;присваивают значение cs регистру ds
2)Вы забываете, что всё это происходит в обработчике прерывания, внутри него (перед вызовом call dword ptr cs:[Int_21h_vect]) мы изменяем и ds и dx, но обработчики прерываний не должны изменять регистры, т.е. при входе и перед выходим состояние регистров должно быть одинаковым, кроме тех, через которые прерывание возвращает результат своей работы, иначе перед вызовом прерывания программисту пришлось бы сохранять все регистры в памяти, а затем из восстанавливать. Неудобно? Да! Поэтому и условились, что прерывание
не должно изменять регистры (в том числе и регистр флагов). Допустим Ваша программа занимается расчетами, при этом использует регистр dx, в процессе расчетов она выводит строку используя mov ah, 09h/int 21h, ваш обработчик подменит строку, выведет сообщение, но если он изменит dx и не восстановит прежнее его значение то после вызова int 21h программа продолжит расчёты с неверным dx. Внутри процедур также желательно сохранять используемые регистры. В Вашем же примере о
шибки не произошло лишь по случайности, Ваша программы не использует dx после вывода строки и его изменение никак не повлияло на её работу.
Вот и всё.
Надеюсь я Вам помог.
--------- И да поможет вам F1, и да сохранит вас F2!
Ответ отправил: IceWolf (статус: 10-ый класс)
Ответ отправлен: 16.08.2007, 10:42