Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/41: Рейтинг темы: голосов - 41, средняя оценка - 4.93
41 / 40 / 23
Регистрация: 10.03.2012
Сообщений: 374

Запуск одной программы из другой

06.10.2013, 20:39. Показов 7949. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Пытаюсь запустить одну программу из другой, но ничего не происходит (должна выводиться строка символов в консоль). Вызывающая программа:
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
CSEG SEGMENT
ASSUME CS:CSEG, DS:CSEG
ORG 100h
 
Main:
   MOV BX,CSEG ;получить # параграфа конца
   MOV AX,ES ;получить # параграфа начала
   SUB BX,AX ;вычислить размер программы
   MOV AH,4AH ;номер функции
   INT 21H ;перераспределение
   ;---указываем на блок параметров
   MOV AX,SEG PARAMETERS ;в ES - сегмент
   MOV ES,AX ;
   MOV BX,OFFSET PARAMETERS ;в BX - смещение
   ;---сохранить копии SS и SP
   MOV KEEP_SS,SS ;сохраняем SS
   MOV KEEP_SP,SP ;сохраняем SP
   ;---указываем на строку имени файла
   MOV DX,OFFSET FILENAME ;смещение - в DX
   MOV AX,SEG FILENAME ;сегмент - в DS
   MOV DS,AX ;
   ;---загрузка программы
   MOV AH,4BH ;функция EXEC
   MOV AL,0 ;выбираем "загрузку и запуск"
   INT 21H ;запускаем задачу
   ;---впоследствии, восстанавливаем регистры
   MOV AX,DS ;восстанавливаем DS
   MOV DS,AX ;
   MOV SS,KEEP_SS ;восстанавливаем SS
   MOV SP,KEEP_SP ;восстанавливаем SP
   ;---в конце программы создаем фиктивный сегмент
   ret
FILENAME DB 'A:\TRIAL.EXE',0 ;загружаем TRIAL.EXE
PARAMETERS DW 7 DUP(0) ;нулевой блок параметров
KEEP_SS DW 0 ;переменная для SS
KEEP_SP DW 0 ;переменная для SP
CSEG ENDS
END Main
Вызываемая программа:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
text     segment 'code'       ; Начало сегмента команд
         assume CS:text, DS:data
begin:   mov    AX,data       ; Инициализация сегментного
         mov    DS,AX         ; регистра DS
         mov    AH,9          ; Функция DOS вывода на экран
         mov    DX,offset message ; Адрес выводимого сообщения
         int    21h           ; Вызов DOS
         mov    AX,4C00h      ; Завершение программы
         int    21h
text     ends                 ; Конец сегмента команд
data     segment              ; Начало сегмента данных
message  db 'Heloo, world!$', 13, 10
data     ends                 ; Конец сегмента данных
stk      segment stack        ; Начало сегмента стека
         dw 128 dup (0)       ; Стек
stk      ends                 ; Конец сегмента стека
         end    begin         ; Конец текста программы
Подскажите, как правильно это организовать? Спасибо!

Добавлено через 4 часа 45 минут
нашел на форуме вот этот код:
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
CSEG SEGMENT
ASSUME CS:CSEG, DS:CSEG
ORG 100h
 
Main:
   mov ax,CSEG
   mov ds,ax
   mov ax, 03; чистим
   int 10h; экран
   ;Выведем на экран сообщение mes о запуске родительского процесса
   mov ah,40h
   mov bx,1          ; Вывод первого
   mov cx,len        ;сообщения
   mov dx,offset mes
   int 21h
   mov ax,0c07h    ; ожидаем нажатие клавиши
   int 21h  
;Освободим всю лишнюю память
   mov ax,0
   mov dx,es                    ;Освобождение
   sub ax,dx                    ;лишней памяти
   mov bx,ax
   mov ah,4ah
   int 21h
;Запустим дочерний процесс
   mov AX,ds        ;Настроим ES на сегмент данных
   mov ES,AX       
   mov AH,4Bh      ;Функция Exec
   mov AL,0            ;Подфункция запуска программы
   mov BX,offset parmblk   ;Адрес блока параметров
   mov DX,offset chname    ;Адрес имени дочерней программы
   int 21h             
 
   mov ax,0c07h    ; ожидаем нажатие клавиши
   int 21h  
   mov AX,4C00h    ;Функция завершения, код завершения = 0
   int 21h             
   ret
parm     dw  7 dup(0)
parmblk   dw   7 dup(0)
chname      db  'child.exe',0    ;Имя дочерней программы
mes      db 'Loader is running ...',10,13
len      equ $-mes
CSEG ENDS
END Main
Дочерняя программа:
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
CSEG SEGMENT
ASSUME CS:CSEG, DS:CSEG
ORG 100h
 
Main:
   mov ax, CSEG
   mov ds, ax
   mov ah, 40h            ;Вывод первого
   mov bx, 1               ;сообщения
   mov cx, len
   mov dx, offset mes
   int 21h
 
   mov ax, 0c07h    ; ожидаем нажатие клавиши
   int 21h
  
   mov ax, 4c00h              ;Функция завершения
   int 21h
   ret
msg equ $ - Main
mes  db 'Kernel is running ...',10,13
len equ  $-mes
CSEG ENDS
END Main
Дочерний процесс также не выводит сообщение на экран. Подскажите, в чем ошибка?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.10.2013, 20:39
Ответы с готовыми решениями:

Запуск одной программы из другой
Здравствуйте для начала :) Задача казалась весьма простой, мне нужно запустить одну программу используя программку которую сам написал....

Запуск одной программы из-под другой
Пытаюсь написать программу - службу, которая в нужный момент будет запускать другую программу у пользователя. Другая программа даже...

Запуск одной процедуры из другой
Как из одной процедуры вызвать другую?

1
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
06.10.2013, 21:42
Вот работающие примеры, курите.

first.Asm
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
.model small
.data
msg1    db 13,10,'Trying execute second.exe$'
msg2    db 13,10,'Error$'
msg3    db 13,10,'First terminating. Press any key$'
fn  db 'second.exe',0   ;Имя запускаемого файла
param   db 10,' bufer.txt',13   ;командная строка
; === Exec Parameter Block (EPB) для функции 4Bh ===
env dw 0            ;Сегмент среды (окружения DOS) для загружаемой программы
cmd_of  dw offset param     ;Смещение командной строки +
cmd_seg dw @data        ;+ сегмент командной строки
fcb1    dd 0            ;FCB (не используется)
fcb2    dd 0            ;FCB (не используется)
Len dw $-env  ;Длина EPB
dsize=$-msg1        ;размер сегмента данных
 
.stack 256
.code
start:
    mov ah,4ah      ;функция изменения размера блока памяти
    mov bx,((csize/16)+1)+256/16+((dsize/16)+1)+256/16;новый размер программы с учетом всех сегментов
    int 21h     ;ограничиваем блок данных нашей программы
    mov ax,@data    ;Настраиваем сегментные регистры
    mov ds,ax
    mov es,ax
    mov ah,9        ;функция вывода сообщения на экран
    lea dx,msg1     ;выводимое сообщение
    int 21h         ;выводим на экран
    mov ax,4b00h        ;Функция EXEC (EXECute - загрузка и запуск программы)
    lea dx,fn       ;Имя файла для запуска
    lea bx,env      ; --- Готовим EPB ---
    int 21h         ;запуск
    jb er           ;если ошибка - переход
ex: mov ah,9        ;функция вывода сообщения на экран
    lea dx,msg3     ;выводимое сообщение
    int 21h         ;выводим на экран
    mov ah,1        ;Ожидаем нажатия любой клавиши
    int 21h
    mov ax,4c00h        ;закончить программу
    int 21h
er: mov ah,9        ;функция вывода сообщения на экран
    lea dx,msg2     ;выводимое сообщение
    int 21h         ;выводим на экран
    jmp ex          ;выход
csize=$-start           ;размер сегмента кода
end start
second.Asm
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
.model small
.data
msg1    db 13,10,'Trying to create file$'
msg2    db 13,10,'Error$'
msg3    db 13,10,'Second terminating. Press any key$'
msg4    db 13,10,'File NOT created$'
msg5    db 13,10,'File created succsessfully. Trying execute third.exe$'
fn  db 'third.exe',0        ;Имя запускаемого файла
param   db 10,' bufer.txt',13       ;командная строка
; === Exec Parameter Block (EPB) для функции 4Bh ===
env dw 0            ;Сегмент среды (окружения DOS) для загружаемой программы
cmd_of  dw offset param     ;Смещение командной строки +
cmd_seg dw @data        ;+ сегмент командной строки
fcb1    dd 0            ;FCB (не используется)
fcb2    dd 0            ;FCB (не используется)
Len dw $-env            ;Длина EPB
filename db 13 dup (0)      ;Имя файла из командной строки
dsize=$-msg1        ;размер сегмента данных
 
.stack 256
.code
start:
    mov ah,4ah      ;функция изменения размера блока памяти
    mov bx,((csize/16)+1)+256/16+((dsize/16)+1)+256/16;новый размер программы с учетом всех сегментов
    int 21h     ;ограничиваем блок данных нашей программы
    mov bx,@data        
    mov es,bx       ;настраиваем сегментный регистр es
    lea di,filename     ;имя файла
    mov si,80h      ;начало командной строки
@getname:
    inc si          ;следующий символ командной строки
    mov al,ds:[si]      ;читаем символ из командной строки
    cmp al,' '      ;если это пробел
    je @getname     ;читаем следующий
    cmp al,0dh      ;если конец строки
    je @endgetname      ;то заканчиваем читать командную строку
    mov es:[di],al      ;если другой, то сохраняем его в имени файла 
    inc di          ;следующий символ имени файла
    cmp di,0dh      ;если превышено ограничение длины имени файла
    je @endgetname      ;то заканчиваем
    jmp short @getname  ;иначе продолжаем
@endgetname:
    mov ds,bx       ;настраиваем сегментный регистр ds
    mov ah,9        ;функция вывода сообщения на экран
    lea dx,msg1     ;выводимое сообщение
    int 21h         ;выводим на экран
    mov ah,3ch      ;ф-я создания файла
    mov cx,0        ;атрибуты
    lea dx,filename     ;имя файла
    int 21h         ;создаем
    jb er2          ;если ошибка переход
    mov ah,9        ;функция вывода сообщения на экран
    lea dx,msg5     ;выводимое сообщение
    int 21h         ;выводим на экран
    mov ax,4b00h        ;Функция EXEC (EXECute - загрузка и запуск программы)
    lea dx,fn       ;Имя файла для запуска
    lea bx,env      ; --- Готовим EPB ---    
    int 21h         ;запуск
    jb er           ;если ошибка - переход
ex: mov ah,9        ;функция вывода сообщения на экран
    lea dx,msg3     ;выводимое сообщение
    int 21h         ;выводим на экран
 
    mov ah,1    ;Ожидаем нажатия любой клавиши
    int 21h
    mov ax,4c00h    ;закончить программу
    int 21h
er: mov ah,9        ;функция вывода сообщения на экран
    lea dx,msg2     ;выводимое сообщение
    int 21h         ;выводим на экран
    jmp ex          ;выход
 
er2:    mov ah,9        ;функция вывода сообщения на экран
    lea dx,msg4     ;выводимое сообщение
    int 21h         ;выводим на экран
    jmp ex          ;выход
 
csize=$-start   ;размер сегмента кода
    
end start
third.Asm
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
.model small
.data
msg1    db 13,10,'Trying to change attributes$'
msg3    db 13,10,'Third terminating. Press any key$'
msg4    db 13,10,'Attributes NOT changed$'
msg5    db 13,10,'Attributes changed succsessfully$'
filename db 13 dup (0)      ;Имя файла
 
.stack 256
.code
start:
    mov bx,@data        
    mov es,bx       ;настраиваем сегментный регистр es
    lea di,filename     ;имя файла
    mov si,80h      ;начало командной строки
@getname:
    inc si          ;следующий символ командной строки
    mov al,ds:[si]      ;читаем символ из командной строки
    cmp al,' '      ;если это пробел
    je @getname     ;читаем следующий
    cmp al,0dh      ;если конец строки
    je @endgetname      ;то заканчиваем читать командную строку
    mov es:[di],al      ;если другой, то сохраняем его в имени файла 
    inc di          ;следующий символ имени файла
    cmp di,0dh      ;если превышено ограничение длины имени файла
    je @endgetname      ;то заканчиваем
    jmp short @getname  ;иначе продолжаем
@endgetname:
    mov ds,bx       ;настраиваем сегментный регистр ds
    mov ah,9        ;функция вывода сообщения на экран
    lea dx,msg1     ;выводимое сообщение
    int 21h         ;выводим на экран
    mov ax,4301h        ;ф-я изменения атрибутов
    mov cx,100001b      ;только чтение + архивный
    lea dx,filename     ;имя файла
    int 21h         ;установка атрибутов
    jb er           ;если ошибка - переход
    mov ah,9        ;функция вывода сообщения на экран
    lea dx,msg5     ;выводимое сообщение
    int 21h         ;выводим на экран
ex: mov ah,9        ;функция вывода сообщения на экран
    lea dx,msg3     ;выводимое сообщение
    int 21h         ;выводим на экран
 
    mov ah,1    ;Ожидаем нажатия любой клавиши
    int 21h
    mov ax,4c00h    ;закончить программу
    int 21h
er: mov ah,9        ;функция вывода сообщения на экран
    lea dx,msg4     ;выводимое сообщение
    int 21h         ;выводим на экран
    jmp ex          ;выход
 
end start
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.10.2013, 21:42
Помогаю со студенческими работами здесь

Запуск функции одной формы из другой
Доброго времени суток! Есть 2 формы - mainForm и addForm. При запуске mainForm запускается функция выводящая информацию из БД в...

Запуск цикла одной кнопкой и остановка другой
Цикл вызывается после нажатия первой кнопки, пытаюсь завершить цикл после нажатия второй кнопки. Делал переменную уже и public и клас...

Как отправить в RAM переменную из одной программы, а потом достать её из другой программы?
Как отправить в RAM переменную из одной программы, а потом достать её из другой программы?

[Emu8086] Запуск из программы другой программы
Доброе утро, форумчане! Задача следующая: Есть Emu8086. Нужно написать программу, которая запускает другую программу (/путь/name.exe). ...

Запуск программы только из другой программы
Здравствуйте уважаемые программисты, сегодня столкнулся с проблемой, естественно первым делом прогуглил и нечего толкового не нашёл....


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru