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

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


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

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

Выпуск № 833
от 21.08.2007, 16:05

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


Вопрос № 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 ??
Отправлен: 15.08.2007, 22:11
Вопрос задал: Василий Васильевич Сквозняков (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: IceWolf
Здравствуйте, Василий Васильевич Сквозняков!
Вот статья из уроков Iczelion'а, там описывается запуск с использованием CreateFile http://wasm.ru/article.php?article=1001014
Также можно использовать ShellExecute/ShellExecuteEx из shell32.dll:
HINSTANCE ShellExecute(

HWND hwnd, // хэндл родительского окна
LPCTSTR lpOperation, // тип операции (см приложение)
LPCTSTR lpFile, // умя файла
LPCTSTR lpParameters, // строка параметров
LPCTSTR lpDirectory, // рабочая директория
INT nShowCmd // флаги (см приложение)
);
Пример:
invoke ShellExecute, hwnd, addr opreration, addr filename, 0, 0, SW_SHOW
Удачи!

Приложение:

---------
И да поможет вам 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

includelib masm32libkernel32.lib
includelib masm32libuser32.lib

Чтобы 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

mov ax, cs ;присваиваем cs регистру ax-значение ax изменилось
mov ds, ax ;присваиваем ax регистру 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


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

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

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

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

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


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


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.56 beta от 20.08.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное