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

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


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

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

Лучшие эксперты по данной тематике

Коцюрбенко Алексей aka Жерар
Статус: Профессор
Рейтинг: 2897
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2578
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2122
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1484
Дата выхода:03.11.2011, 00:30
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:193 / 61
Вопросов / ответов:1 / 1

Консультация # 184342: Здравствуйте! Нужна помощь по ассемблеру - имеется родительская и дочерняя программы, листинги программ прилагаю. Необходимо, чтобы родительская программа запускала по очереди 2 дочерних процесса, при этом чтобы один процесс открывал файл FILE.txt, а другой закрывал его. Заранее спасибо за ответ....


Консультация # 184342:

Здравствуйте! Нужна помощь по ассемблеру - имеется родительская и дочерняя программы, листинги программ прилагаю. Необходимо, чтобы родительская программа запускала по очереди 2 дочерних процесса, при этом чтобы один процесс открывал файл FILE.txt, а другой закрывал его. Заранее спасибо за ответ.

Дата отправки: 28.10.2011, 23:51
Вопрос задал: Федрычев Даниил Сергеевич (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, Федрычев Даниил Сергеевич!
Использовать обычный запуск ax=4b00h не получится, т.к.
при завершении программы все открытые файлы закрываются.
В результате чего, нельзя получить из дочерней программы handle файла...
Можно реализовать, используя механизм оверлеев.
Итак, вот, что у меня получилось...
Handle передаю через регистр AX, т.к. в случае оверлеев имеем, фактически,
одну многосегментную программу.

Родительская программа ma.asm

Код :
;Родительская программа MA.ASM
_code segment 'CODE'
 assume cs:_code, ds:_data, ss:_stack
 main proc
 mov ax, _data
 mov ds,ax

 mov ah, 40h
 mov bx, 1
 mov cx, lStart ;Старт родительской программы
 mov dx, offset sStart
 int 21h

 mov ax, zzz
 mov dx, es  ;Освобождение
 sub ax, dx  ;лишней памяти
 mov  bx, ax
 mov ah, 4ah
 int 21h

;Выделение памяти для оверлеев
 mov ah, 48h  ;
 mov bx, 1000h       ;запросим 64 кбайт
 int 21h
 jnc NoErrMem
 jmp errmem  ;переход, если произошла ошибка
NoErrMem:
 mov EPB, ax  ;сохранение адреса памяти
 mov EPB+2, ax ;для настройки адресов при загрузки оверлеев
 mov run_seg, ax ;сегмент оверлея в длинном вызове
 mov ax, ds
 mov es, ax

;Загрузка первого оверлея
 mov bx, offset EPB ;блок EXEC Parameter Block
 mov dx, offset chname1 ;имя файла в ASCIIZ
 mov ax, 4B03h ;функция загрузки оверлея
 int 21h
 jnc NoErrOvr
 jmp errexec  ;переход, если произошла ошибка
NoErrOvr:
;Вызов оверлея
 push ds
 push es
 mov cs:save_ss, ss
 mov cs:save_sp, sp

 call dword ptr run_adr ;длинный вызов оверлея

 mov sp, cs:save_sp
 mov ss, cs:save_ss
 pop es
 pop ds
 mov handle, ax ;сохраним handle файла!
 test ax, ax
 jz errchild

 mov ah, 40h
 mov bx, 1
 mov cx, lOk  ;Оверлей отработал
 mov dx, offset sOk
 int 21h

;Загрузка второго оверлея
 mov bx, offset EPB ;блок EXEC Parameter Block
 mov dx, offset chname2 ;имя файла в ASCIIZ
 mov ax, 4B03h ;функция загрузки оверлея
 int 21h
 jc errexec  ;переход, если произошла ошибка
;Вызов оверлея
 push ds
 push es
 mov cs:save_ss, ss
 mov cs:save_sp, sp

 mov ax, handle

 call dword ptr run_adr ;длинный вызов оверлея

 mov sp, cs:save_sp
 mov ss, cs:save_ss
 pop es
 pop ds

 test ax, ax
 jz errchild

 mov ah, 40h
 mov bx, 1
 mov cx, lOk  ;Оверлей отработал
 mov dx, offset sOk
 int 21h

;Освобождение памяти, которая использована для оверлея
finish:
 mov ah, 49h  ;функция освобождения памяти
 mov es, EPB  ;получение адреса блока памяти
 int 21h  ;вызов MS-DOS
 jc errmem  ;переход, если произошла ошибка

outprog:
 mov ax, 4c00h ;Завершение
 int 21h  ;программы

errmem:
 mov ah, 40h
 mov bx, 1
 mov cx, lErrMem ;Ошибка менеджера памяти
 mov dx, offset sErrMem
 int 21h
 jmp outprog
errchild:
 mov ah, 40h
 mov bx, 1  ;Вывод третьего
 mov cx, lErrCh ;сообщения
 mov dx, offset sErrCh
 int 21h
 jmp outprog
errexec:
 mov ah, 40h
 mov bx, 1
 mov cx, lErrOvr ;Ошибка загрузки оверлея
 mov dx, offset sErrOvr
 int 21h
 jmp outprog

save_sp dw ?
save_ss dw ?

main endp

_code ends

;Сегмент данных
_data segment 'DATA'
EPB dw ?  ;адрес загрузки
 dw 0  ;значение настройки
run_adr dw 0  ;новый указатель инструкции
run_seg dw ?  ;новое значение кодового сегмента

chname1 db "DO.EXE",0 ;Имя дочерней программы
chname2 db "Close.EXE",0 ;Имя дочерней программы
handle dw 0
sStart db "Родительский процесс запущен",10,13
lStart equ $-sStart
sOk db "Дочерний процесс отработал",10,13
lOk equ $-sOk
sErrOvr db "Дочерний процесс не активизирован",10,13
lErrOvr equ $-sErrOvr
sErrCh db "Дочерний процесс вернул ошибку",10,13
lErrCh equ $-sErrCh
sErrMem db "Ошибка работы с памятью",10,13
lErrMem equ $-sErrMem

_data ends

;Сегмент стека
_stack segment stack 'STACK'
 dw 100h dup(?)
_stack ends

zzz segment
zzz ends
 end main

Оверлей do.asm (открывает файл)
Код :
;Дочерняя программа do.asm
 .286
 assume cs:_code, ds:_data, ss:_stack
_code segment 'code'
main proc
 mov ax, _data
 mov ds, ax

 mov ah, 40h
 mov bx, 1
 mov cx, lStart ;Начало оверлея
 mov dx, offset sStart
 int 21h

 mov ah, 3dh  ;Открытие файла
 mov al, 0  ;для чтения
 mov dx, offset fname
 int 21h
 jnc ok

 mov ah, 40h
 mov bx, 1
 mov cx, lErrOp ;Ошибка открытия файла
 mov dx, offset sErrOp
 int 21h

 xor ax, ax  ;возврящаем 0, как ошибку
 jmp finend
ok:
 push ax
 mov ah, 40h
 mov bx, 1
 mov cx, lOk  ;файл открылся
 mov dx, offset sOk
 int 21h
 pop ax  ;возвращаем handle
finend:
 retf
main endp
_code ends

;Сегмент данных
_data segment 'data'
sStart db 'Дочерний процесс запущен',10,13
lStart equ $-sStart
sErrOp db 'Фаил не открылся !',10,13
lErrOp equ $-sErrOp
sOk db 'Фаил открылся',10,13
lOk equ $-sOk
fname db 'FILE.txt',0
_data ends

;Сегмент стека
_stack segment stack 'Stack'
 dw 100h dup(?)
_stack ends
 end main

Оверлей close.asm (закрывает файл)
Код :
;Дочерняя программа close.asm

 assume cs:_code, ds:_data, ss:_stack
_code segment 'code'
main proc
 push ax  ;handle

 mov ax, _data
 mov ds, ax

 mov ah, 40h  ;Вывод первого
 mov bx, 1  ;сообщения
 mov cx, lStart
 mov dx, offset sStart
 int 21h

 pop bx  ;handle файла
 mov ah, 3eh  ;Закрываем файл
 int 21h
 jnc ok

 mov ah, 40h
 mov bx, 1
 mov cx, lErrCl ;ошибка закрытия файла
 mov dx, offset sErrCl
 int 21h
 xor ax, ax  ;пометим ошибку
 jmp finend
ok:
 mov ah, 40h
 mov bx, 1
 mov cx, lOk  ;файл закрылся
 mov dx, offset sOk
 int 21h
 mov ax, 1  ;все ок
finend:
 retf
main endp
_code ends

;Сегмент данных
_data segment 'data'
sStart db 'Второй дочерний процесс запущен',10,13
lStart equ $-sStart
sErrCl db 'Фаил не закрылся !',10,13
lErrCl equ $-sErrCl
sOk db 'Фаил закрылся',10,13
lOk equ $-sOk
_data ends

;Сегмент стека
_stack segment stack 'Stack'
 dw 100h dup(?)
_stack ends
 end main


Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 29.10.2011, 21:15

5
нет комментария
-----
Дата оценки: 29.10.2011, 23:32

Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное