Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
8 / 8 / 4
Регистрация: 06.05.2014
Сообщений: 70

Вызов дочернего процесса

22.05.2015, 12:28. Показов 1917. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, как правильно вызвать дочерний процесс, у меня в после срабатывания функции 4bh в ax ошибка - 8 устанавливается

Код ошибки Описание
1 Неверный код подфункции
2 Не найден файл запускаемой программы
3 Указанный путь не найден
4 Слишком много открытых файлов
5 Нет доступа
8 Нет памяти для загрузки программы
10 Длина блока среды больше 32 Кбайт
11 Неправильный формат запускаемого exe-файла

Не знаю, как ее исправить.

Спасибо большое, кто откликнется!

Главная программа

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
TITLE   PROGNAME (EXE)
;----------------------------------------
STACKSG SEGMENT PARA STACK 'Stack'
    DW  32 DUP(?)   
STACKSG ENDS
;----------------------------------------
DATASG  SEGMENT PARA 'Data'
        path db 'lab26.exe',0
        PARMBLK DW  7 DUP (0)
        
MES1    DB  'Р Родительский процесс запущен',10,13,'$'
MES1LEN EQU $-MES1
MES2    DB  'Р Дочерний процесс отработал нормально',10,13,'$'
MES2LEN EQU $-MES2
MES3    DB  'Р Дочерний процесс завершился с ошибкой',10,13,'$'
MES3LEN EQU $-MES3
MES4    DB  'Р Дочерний процесс не активизирован',10,13,'$'
MES4LEN EQU $-MES4
 
        cmd db 10,'lab26.exe',0dh
        errors db 'Ошибка вызова дочернего процесса!$'
        EXIT    DW (?)                  ; выход по любой клавише
DATASG  ENDS
;----------------------------------------
CODESG  SEGMENT PARA 'Code'
BEGIN   PROC    FAR
        ASSUME  CS:CODESG, DS:DATASG, SS:STACKSG
        PUSH    DS
        XOR     AX,AX                   ; запись в стек
        PUSH    AX                      ;    нулевого адреса
        MOV     AX,DATASG               ; засылка адреса
        MOV     DS,AX                   ;    DATASG в регистр DS
        mov     es,ax
;----------------------------------------
        mov ah,09h
        lea dx,mes1
        int 21h
 
        
        mov ax,tm
        mov dx,es                    ;Освобождение
        sub ax,dx                    ;лишней памяти
        mov bx,ax
        mov ah,4ah
        int 21h
        
    MOV AX,DATASG           ;настроим ES на сегмент данных
    MOV ES,AX
    MOV AH,4BH          ;функция ехес
    MOV AL,0            ;подфункция запуска программы
    MOV BX,OFFSET PARMBLK   ;адрес блока параметров
    MOV DX,OFFSET path  ;адрес имени
    INT 21H         ;  дочерней программы
    JC  ERREXEC         ;ошибка запуска
;Проанализируем код возврата из дочернего процесса
    MOV AH,4DH          ;функция получения кода возврата
    INT 21H
    CMP AL,1            ;наш код ошибки?
    JE  ERRCHILD        ;да
        mov ah,09h
        lea dx,mes2
        int 21h
;Завершение программы
OUTPROG:
    MOV AX,4C00H        ;функция завершения, 
    INT 21H         ;код завершения = 0
ERRCHILD:
    mov ah,09h
    lea dx,mes3
    int 21h
    JMP OUTPROG
ERREXEC:
    mov ah,09h
    lea dx,mes4
    int 21h
 
    JMP OUTPROG
 
   
   tm  segment
   tm ends
        RET                             ; завершение программы
BEGIN   ENDP
CODESG  ENDS
        END     BEGIN
Дочерняя работает отдельно (если просто из консоли ее напрямую вызвать):
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
TITLE   PROGNAME (EXE)
;----------------------------------------
STACKSG SEGMENT PARA STACK 'Stack'
    DW  32 DUP(?)   
STACKSG ENDS
;----------------------------------------
DATASG  SEGMENT PARA 'Data'
;============================
;Поля данных 
ALLOCSEG    DW  0       ;сегментный адрес выделенного блока
FNAME       DB  'BIGFILE.DAT',0 ;имя файла для записи массива
;============================
 
        ErrorMessage db 'Ошибка создания файла!$'
        FileOK db 'Файл успешно открыт!$'
        child db 'Запущена дочерняя программа!$'
        filepath db 'C:\zad\lab26\file.txt',0
        HANDLE dw (?)
        ASCVAL  DB '      ','$'         ; шаблон вывода
        EXIT    DW (?)                  ; выход по любой клавише
DATASG  ENDS
;----------------------------------------
CODESG  SEGMENT PARA 'Code'
BEGIN   PROC    FAR
        ASSUME  CS:CODESG, DS:DATASG, SS:STACKSG
;----------------------------------------
    MOV AX,DATASG
    MOV DS,AX
 
    mov ah,09h
    lea dx,child
    int 21h
    
    ;Программа типа ЕХЕ занимает всю память. Освободим ее
    MOV AX,ABCD         ;сегментный адрес конца программы
    MOV DX,ES           ;сегментный адрес начала программы
    SUB AX,DX           ;размер программы в параграфах
    MOV BX,AX           ;отправим его в ВХ
    MOV AH,4AH          ;функция изменения размера блока
    INT 21H
;Теперь выделим 64 Кбайт
    MOV AH,48H          ;функция выделения памяти
    MOV BX,1000H        ;  1000H параграфов = 64 Кбайт
    INT 21H
    MOV ALLOCSEG,AX     ;адрес выделенного блока
;Заполним выделенный блок памяти каким-нибудь символом
    MOV ES,AX           ;настроим на него ES
    XOR DI,DI           ;ES:DI -> начало выделенного блока
    MOV CX,0FFFFH       ;65535 - счетчик байтов
    MOV AL,'#'          ;заполняющий символ
    CLD             ;заполнять вперед
    REP STOSB           ;заполнение
    MOV BYTE PTR ES:[DI],'$'    ;заполним последний байт массива 
                    ;  для контроля
;Создадим файл с помощью функции 3CH и сохраним выделенный системой дескриптор 
;  в ячейке HANDLE
    call CREATEFILE
;Запишем содержимое заполненного блока в файл. 
; Поскольку за один раз можно вывести в файл не более 64К-1 байт, 
; запишем два раза по 32 Кбайт
;Сначала первую половину массива
    MOV AH,40H      ;функция записи
    MOV BX,HANDLE   ;дескриптор открытого файла
    MOV CX,32768    ;выведем половину массива
    PUSH    DS      ;сохраним сегментный адрес
    MOV DS,ALLOCSEG ;настроим DS на выделенный блок
    XOR DX,DX       ;DS:DX -> на выделенный блок
    INT 21H
    
;Затем вторую половину массива
    POP DS      ;восстановим адресуемость нашего сегмента
    MOV Ah,40H
    MOV BX,HANDLE
    MOV CX,32768
    PUSH    DS
    MOV DS,ALLOCSEG ;настроим DS на выделенный блок
    MOV DX,32768    ;продолжим запись с этого байта
    INT 21H
    POP DS
;Освободим выделенный блок памяти. ES уже указывает на него
    mov ax,ALLOCSEG
    mov es,ax
    
    MOV AH,49H          ;функция освобождения памяти
    INT 21h
    
    mov ah,01h
    int 21h
    
 
    mov ah,4ch
    int 21h ; завершение программы
BEGIN   ENDP
 
ABCD SEGMENT 'ENDSEG'           ;фиктивный сегмент для определения
ABCD ENDS   
;****************************************
;****************************************
CREATEFILE PROC NEAR
        mov ah,3ch;создание файла
        mov cx,00h;обычный файла
        lea dx,filepath
        int 21h
        JC errors
        mov HANDLE,ax;сохранение файлового индекса
        jmp noterr
errors:     mov ah,09h
        lea dx,ErrorMessage
        int 21h 
        jmp toEnd
noterr:     
      mov ah,09h
      lea dx,FileOk
      int 21h   
toEnd:    
ret
endp
 
 
;****************************************
;****************************************
CODESG  ENDS
        END     BEGIN
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.05.2015, 12:28
Ответы с готовыми решениями:

Создание дочернего процесса
нужно создать дочерний процесс, чтобы если закрыть родительский закрылся и дочерний. но незнаю как можно сделать...

Завершение дочернего процесса
Подскажите как правильно обработать завершение программы при вызове родителем QProcess::close() Надо во вторичных потоках завершить...

Создание дочернего процесса
Уважаемые форумчане, у меня возник такой вопрос: Возможно ли средствами с++ создать дочерний процесс для определенного процесса? так...

1
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
22.05.2015, 16:46
Лучший ответ Сообщение было отмечено Федя Камушкин как решение

Решение

Цитата Сообщение от Федя Камушкин Посмотреть сообщение
PUSH DS
XOR AX,AX ; запись в стек
PUSH AX ; нулевого адреса
MOV AX,DATASG ; засылка адреса
MOV DS,AX ; DATASG в регистр DS
mov es,ax
;----------------------------------------
mov ah,09h
lea dx,mes1
int 21h
mov ax,tm
mov dx,es ;Освобождение
sub ax,dx ;лишней памяти
mov bx,ax
mov ah,4ah
int 21h
Укорачивать надо сегмент PSP.
mov es,ax в твоем коде и приводит к ошибке. Ее бы убрать.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
        MOV     AX,DATASG               ; засылка адреса
        MOV     DS,AX                   ; DATASG в регистр DS
 
        mov ah,09h
        lea dx,mes1
        int 21h
        
        mov bx,tm
        mov ax,es                   ;Освобождение
        sub bx,ax                   ;лишней памяти
        mov ah,4ah
        int 21h
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.05.2015, 16:46
Помогаю со студенческими работами здесь

Запуск дочернего процесса
Почему второй вариант не запускает дочерний процесс? // Работает CreateProcess(L"programma.exe", L"programma.exe...

Завершение дочернего процесса по ошибке
Например, я запускаю дочерний процесс 1.ехе и ожидаю его окончания: #include <windows.h> #include <iostream> using namespace...

Чтение stdout дочернего процесса
Задача: запустить консольную утилиту и отобразить процесс ее деятельности. Пример: pngout.exe screen.png 1.png При запуске,...

Перехват потока от дочернего процесса
Всем добрый день. Недавно восстанавливал информацию на своем винте и нашел кучу архивов. Начал открывать а они то нормальные то битые. ...

Управление видимостью дочернего процесса
Здравствуйте. Консольное приложение можно сделать скрытым или видимым, например, так: #include <WS2tcpip.h> int main() { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru