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

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


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

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

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

Выпуск № 222
от 28.08.2005, 20:11

Администратор:Калашников О.А.
В рассылке:Подписчиков: 255, Экспертов: 23
В номере:Вопросов: 2, Ответов: 7


Вопрос № 25185: Есть программа на ассемблере для MASM32. В программе есть функция MyFunction, которая должна вызываться с двумя параметрами (длина каждого параметра 4 байта). Как "закинуть" эти параметры в функцию, чтобы можно было к ним обратить...
Вопрос № 25210: Как запустить программу? А лучше будет если она потом вернётся к запустившей её. Заранее благодарен....

Вопрос № 25.185
Есть программа на ассемблере для MASM32.
В программе есть функция MyFunction, которая должна вызываться с двумя параметрами (длина каждого параметра 4 байта).
Как "закинуть" эти параметры в функцию, чтобы можно было к ним обратиться непосредственно из функции? Как это будет выглядеть на асме? Я пробовал через стек, но не получилось. Как лучше поступить?

Приложение:

Отправлен: 22.08.2005, 21:45
Вопрос задал: andrey (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Евгений Иванов
Здравствуйте, andrey!
вот кусочек из работающей программы.
align 32
proc DlgTabProc
ARG @@hDlg:dword,@@wmsg:dword,@@wparam:dword,@@lparam:dword
LOCAL @@h_scroll :dword
mov eax,[@@wmsg]

как видишь, очень просто.
---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 22.08.2005, 21:50

Отвечает: newinfo2005
Здравствуйте, andrey!
Пробуй эти параметры занести в переменную или...
приравняй bp=sp и как мы знаем стек растет снизу вверх ,делаем необходимые операции.Посмотри в приложение так как масма у меня под рукой нет то попробуй
это.

Приложение:

---------
Хочу стать умным и...много денег и халявного инета.

Ответ отправил: newinfo2005 (статус: 3-ий класс)
Отправлен: 22.08.2005, 22:05

Отвечает: Вiктор
Здравствуйте, andrey!
прошу прощения, в работе не проверял. Но вроде должно работать. Смотрите во вложении.
А эксперт newinfo не учёл что размер данных - 4 байта. (вроде так по умолчанию для push?)

Приложение:

---------
Хочу себе более быстрый компьютер ! ! !

Ответ отправил: Вiктор (статус: 4-ый класс)
Отправлен: 22.08.2005, 23:17

Отвечает: Sager
Здравствуйте, andrey!
Проще будет сделать вот так:
push par3
push par2
push par1
call testproc

....
testproc par1,par2,par3:DWORD
mov eax,par1
...
ret
testproc endp
А всякие там push ebp/mov ebp,esp/ retn за тебя сам масм32 сделает
Ответ отправил: Sager (статус: 4-ый класс)
Отправлен: 23.08.2005, 09:08


Вопрос № 25.210
Как запустить программу?
А лучше будет если она потом вернётся к запустившей её.
Заранее благодарен.
Отправлен: 23.08.2005, 15:49
Вопрос задал: Pycckuu MegBegb (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Евгений Иванов
Здравствуйте, Pycckuu MegBegb!
Для этого есть функция запуска программы.

блин. в Яндексе пустил поиск!
и нашёл вот это
http://www.kalashnikoff.ru/Assembler/issues/029.htm
---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 23.08.2005, 15:57

Отвечает: BOIL
Здравствуйте, Pycckuu MegBegb!

для запуска программы нужно пользоваться "родными" для операционной системы функциями API
конечно, прийдется повозиться со стеком при вызове (поместить, очисить), но, похоже, что без операционной системы не обойтись

что касается возврата к запустившей программе - тут нужно использовать примитивы синхронизации, разделяемую память или что-то в этом роде для передаче к дочерней программе информации о дескрипторах и размерах сегментов родительской программы (как я понимаю, нужно получить доступ к данным)

Удачи!..
Ответ отправил: BOIL (статус: 3-ий класс)
Отправлен: 23.08.2005, 15:59

Отвечает: newinfo2005
Здравствуйте, Pycckuu MegBegb!
+------------------------------------------------------------------------------
¦ DOS Fn 4bH: Выполнить или загрузить программу -- EXEC еще
+------------------------------------------------------------------------------
+------------------------------------------------------------------------------
¦ Вход ¦ AH ¦ 4bH
+---------¦ DS:DX ¦ адрес строки ASCIIZ с именем файла, содержащего программу
¦ ES:BX ¦ адрес EPB (EXEC Parameter Block - блока параметров EXEC)
¦ AL ¦ 0 = Загрузить и выполнить
¦ AL ¦ 3 = Загрузить программный оверлей
+---------+-------+------------------------------------------------------------
¦ Выход ¦ AX ¦ код ошибки если CF установлен
+------------------------------------------------------------------------------

Описание: Предоставляет средства одной программе (родителю) вызвать другую
программу (ребенка), которая по завершению возвратит управление
родителю.

DS:DX указывает на строку ASCIIZ в форме: "d:путьимяфайла",0.
Если диск или путь опущены, они подразумеваются по умолчанию.
ES:BX указывает на блок памяти, подготовленный как EPB, формат
которого зависит от запрошенной подфункции в AL.
+------------------------------------------------------------------------------+
AL=0 EXEC: Так как родительская программа первоначально получает всю доступную
память в свое распоряжение, вы должны освободить часть памяти через
функцию 4aH до вызова EXEC (AL=0). Обычная последовательность:

1. Вызовите функцию 4aH с ES=сегменту PSP и BX=минимальному объему
памяти, требуемой вашей программе (в параграфах).
2. Подготовьте строку ASCIIZ с именем вызываемого программного фай-
ла и установите DS:DX на первый символ этой строки.
3. Подготовьте Блок Параметров EXEC со всеми необходимыми полями.
4. Сохраните текущие значения SS, SP, DS, ES и DTA в переменных,
адресуемых через регистр CS (CS - это единственная точка для
ссылок после того, как EXEC вернет управление от ребенка).
5. Выдайте вызов EXEC с AL=0.
6. Восстановите локальные значения SS и SP.
7. Проверьте флаг CF, чтобы узнать, не было ли ошибки при EXEC.
8. Восстановите DS, ES и локальную DTA, если необходимо.
9. Проверьте код выхода через функцию 4dH WAIT (если надо).

Все открытые файлы дублируются, так что ребенок может обрабатывать
данные как через описатели файлов, так и через стандартный в/в.
Режимы доступа описателей дублируются, но любые активные блокировки
файлов не будут относиться к ребенку. См. функцию 5cH.

После возврата из ребенка, векторы INT 22H Terminate, INT 23H Ctrl-
Break и INT 24H Critical Error восстанавливаются в их предыдущие
значения.

AL=3 LOAD: Эта подфункция используется для загрузки "оверлея". DS:DX указывает
на ASCIIZ имя файла, а ES:BX указывает на "LOAD"-версию
Блока Параметров EXEC. Главное значение этой подфункции в том, что
она считывает Заголовок EXE и выполняет необходимые перемещения
сегментов, как это требуется для программ .EXE.

Замечания: Эта функция использует программу-загрузчик из COMMAND.COM, который
транзитен в DOS 2.x (и, возможно, уже перекрыт программой). В этом
случае возникнет ошибка, если DOS не найдет файл COMMAND.COM. Вы
должны обеспечить корректную строку COMSPEC= в окружении перед
вызовом этой функции.
Вместо разбора собственных FCB (как требуется для EPB), вы можете
найти удобным загрузить и выполнить вторичную копию файла
COMMAND.COM, используя опцию /C. Например, чтобы выполнить
программу FORMAT.COM, установите DS:DX на адрес строки ASCIIZ:
"command.com",0
и установите EPB+2 на сегмент и смещение следующей строки команд:
0eH,"/c format a:/s/4",0dH

Такой вторичный интерпретатор команд использует очень мало памяти
(около 4K). Вы можете поискать в Окружении DOS строку COMSPEC=,
чтобы установить точное местоположение файла COMMAND.COM.

Надеюсь поможет!!
---------
Хочу стать умным и...много денег и халявного инета.
Ответ отправил: newinfo2005 (статус: 3-ий класс)
Отправлен: 23.08.2005, 16:12


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

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

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

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

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


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


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Яндекс


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

В избранное