Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2017, 17:19   #1
седьмой
Форумчанин
 
Регистрация: 17.07.2012
Сообщений: 140
По умолчанию Может ли ассемблер запусить программу на с++?

У меня есть программа на с++ в досе и мне надо что бы она запускалась, когда придет прерывание на lpt порт, прерывание желательно было аппаратное, но не хватило опыта его настроить, зато получилось настроить программное через INT 17h и есть код на с++, его надо каждый раз запускать на выполнение, как это сделать не подскажете? Может наверно быть и другой вариант, в середину кода на с++ вставить эту ассемблерную вставку, но мне кажется, что правильнее было бы запускать с++ из ассемблера. Вот код на ассемблере
Код:
org  100h
     mov dx,00       ; lpt-порт(0) 
@3
in al,dx    
 mov   ah,02       ; функция int 17h
int 17h    ;прерывание программное 
bt ax,0Eh   ; проверяем 14 бит, если 0 то пришло прерывание
jnc @1   ;переход если 0
mov al,'1' ;если не было прерывание 1 на экран
int 29h
jmp @3
mov al,'0'
int 29h
jmp 03
int 20h
END START
седьмой вне форума Ответить с цитированием
Старый 01.06.2017, 13:50   #2
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Здравствуй, седьмой!
Опять пытаешься создать тяни-толкая из кусков Windows (c++) и фрагмента на ассемблере под DOS. "Тут или крест сними или трусы надень". Остановись на чем-то одном... Когда определишься -- разговор можно продолжить...
Mikl___ вне форума Ответить с цитированием
Старый 01.06.2017, 14:29   #3
седьмой
Форумчанин
 
Регистрация: 17.07.2012
Сообщений: 140
По умолчанию

Цитата:
Сообщение от Mikl___ Посмотреть сообщение
Здравствуй, седьмой!
Здравствуй Микл, как я рад Вас видеть! Потерял ссылку на сайт где Вы сейчас обитаете. Нет вы ошибаетесь, я доделываю проект, который начал делать еще прошлой осенью, когда вы от нас ушли. Моя часть программы вся под досом. винды нет совсем, конечно проект в целом содержит винду и программирование на высоком уровне тоже есть, но у меня все под досом на с++ борланд 3.0 и ассемблере. На ассемблере 1 программа, это драйвер для Lpt порта ( так случайно оказалось, что в компе на котором я провожу работу, имеется только один сом порт), поэтому пришлось задействовать lpt порт. Еще на этом компе стоит интерфейсная плата для которой поставлялся драйвер на с++ под досом, его я просто обрезал и у меня получилась короткая программка на с++ для передачи данных с моего компа, на внешнее устройство, и получение оттуда ответных данных. Вот и мне теперь нужно настроить аппаратный драйвер по 10й ноге Lpt порта по приему синхроимпульсов с генератора, и по этому сигналу запускать несколько раз программку на с++, проанализировать полученные данные и по сом порту отправить протокол анализа этих данных в другой копм ( эта программка у меня уже написана). Вот и все. Эсли все это изложить кратко, то получается одна программа на ассемблере, которая внимательно следит за синхроимпульсом на входе, затем сперва несколько раз запускает одну программку на с++ под досом, а потом в самом конце посчитает ошибки и выдаст протокол в другую программу тоже на с++ под досом и на этом закончит свою работу.

Последний раз редактировалось седьмой; 01.06.2017 в 14:34.
седьмой вне форума Ответить с цитированием
Старый 01.06.2017, 15:20   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

седьмой,
могу посоветовать две книги Р.Джордейн "справочник программиста пересональных компьютеров типа IBM PC, XT и AT" и В.Кулаков "Программирование на аппаратном уровне". В Джордейне глава 7 "Ввод/вывод" рассмотрен доступ к последовательному порту через порты 3F8h-3FEh (2F8h-2FEh). В Кулакове в 7 главе программирование принтера через прерывание 13h и работа с регистрами параллельного порта:
  • 378h (278h) регистр данных,
  • 379h (279h) регистр состояния,
  • 37Ah (27Ah) регистр управления
Я и остальные на форуме wasm.in
Mikl___ вне форума Ответить с цитированием
Старый 01.06.2017, 15:41   #5
седьмой
Форумчанин
 
Регистрация: 17.07.2012
Сообщений: 140
По умолчанию

Цитата:
Сообщение от Mikl___ Посмотреть сообщение
Я и остальные на форуме wasm.in
Спасибо, помню где то регистрировался, но вылетело... а по поводу запуска с++ из ассемблера, вот нашел хорошую статью девушка хорошо все изложила с примерами и по порядку, правда для винды, нужно как то заголовочные файлы теперь поменять на досовские и должно наверно пойти. Книги это конечно хорошо, но сколько я не пытался использовать код из книг напрямую, не из одной еще не получилось, или например как братья фроловы используют не стандартные заголовочные файлы, а какие то свои, или в книге не указывается для какого компилятора код и в результате ни один код не идет, а документация идет не всегда последовательно, скачет с пятое на десятое, и найти что то полезное в книге бывает очень долго, поэтому книги использую только сразу все одновременно, делаю по ним расширенный поиск и ищу сразу по всем то что нужно, а листать каждую, что бы найти там для себя какой то частный случай, это мне кажется очень долго и не производительно. Но все равно спасибо, что нашли время ответить.
седьмой вне форума Ответить с цитированием
Старый 01.06.2017, 16:07   #6
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

седьмой
Возьмите официальный справочник по досу там всё описано
http://bitsavers.trailing-edge.com/p...uide_Jan95.pdf
А пример вызова есть в книге Питер Абель "Ассемблер и программирование для IBM PC". глава 22

Что касается Фроловых, то у них всё норм. У них указано каким компилятором собирать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 01.06.2017 в 16:18. Причина: Опять рководство по досу переложили. Поправил на новую ссылку.
Pavia вне форума Ответить с цитированием
Старый 01.06.2017, 16:12   #7
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от седьмой Посмотреть сообщение
вот нашел хорошую статью девушка хорошо все изложила
Подпрограмма, это синоним к словам функция и процедура. А не то о чём вы подумали.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 02.06.2017, 07:03   #8
седьмой
Форумчанин
 
Регистрация: 17.07.2012
Сообщений: 140
По умолчанию

Спасибо большое за ответ.
Цитата:
Сообщение от Pavia Посмотреть сообщение
Подпрограмма, это синоним к словам функция и процедура. А не то о чём вы подумали
Как вам удается мысли читать? Какое отношение операционная система дос имеет к ассемблеру, почему вы предложили почитать книгу по досу, если мне нужно из ассемблера запустить код на си? Никто на форуме код не выложит на блюдечке с голубой каемочкой, бесплатный сыр только в мышеловке, но не всегда получается разгадать ребус, который заложен в ответ/совет на форуме. У фроловых про компилятор норм, согласен, но они используют свои заголовочные файлы, а не стандартные сишные, поэтому часть книги является частным случаем и для использования малопригодна. Я ни в коем случае не претендую на абсолютно правильное суждение, нет конечно мое мнение субьективное, но лично для меня книги Фролова именно так представляются как я написал.
Цитата:
Сообщение от Pavia Посмотреть сообщение
А пример вызова есть в книге Питер Абель "Ассемблер и программирование для IBM PC". глава 22
посмотрю, спасибо.

Вы оказались правы книга Абеля интересная и последовательная, но читатель оказался видимо туповат, не могли бы дать комментарий к этому коду, толку не хватает полностью понять как эта программа работает?
Код:
TITLE EXDOS (EXE) Функция DOS 4BH для выполнения DIR
CSEG GMENT PARA 'Code'
ASSUME CS:CSEG,DS:CSEG,ES:CSEG
BEGIN: JMP SHORT MAIN
;----------------------------------------------------------
PARAREA DW ? ;Адрес строки вызова
DW OFFSET DIRCOM ;Указатель
; на командную строку
DW CSEG
DW OFFSET FCB1 ;Указатель на FCB2
DW CSEG
DIRCOM DB 17,'/C DIR D:',13,0
FCB1 DB 16 DUP(0)
FCB2 DB 16 DUP(0)
PROGNAM DB 'D:COMMAND.COM',0
; ---------------------------------------------------------
MAIN PROC FAR
MOV AH,4AH ;Получить 64K памяти
MOV BH,100H ; в параграфах
INT 21H
JC E10ERR ;Нет памяти?
MOV DI,2CH ;Получить сегментный адрес
MOV AX,[DI] ; строки вызова
LEA SI,PARAREA ; и записать его в
MOV [SI],AX ; 1 слово блока параметров
MOV AX,CS ;Загрузить в DS и ES
MOV DS,AX ; адрес CSEG
MOV ES,AX
MOV AH,4BH ;Функция загрузки
MOV AL,00 ; и выполнения
LEA BX,PARAREA ; COMMAND.COM
LEA DX,PROGNAM
INT 21H ;Вызвать DOS
JC E20ERR ;Ошибка выполнения?
MOV AL,00 ;Нет кода ошибки
JMP X10XIT
E10ERR:
MOV AL,01 ;Код ошибки 1
JMP X10XIT
E20ERR:
MOV AL,02 ;Код ошибки 2
JMP X10XIT
E10XIT:
MOV AH,4CH ;Функция завершения
INT 21H ;Вызвать DOS
MAIN ENDP
CSEG ENDS
END
__________________________________________________________________________
я понял так, что должен запуститься на выполнение файл COMMAND.COM?

Последний раз редактировалось седьмой; 02.06.2017 в 11:28.
седьмой вне форума Ответить с цитированием
Старый 03.06.2017, 12:02   #9
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

седьмой
Есть два пути решения вашей задачи.
1) Первый путь. Тут несколько вариантов.
а) Пишем на Си используем встроенный ассемблер
Код:
// Заглушки для необрабатываемых
// аппаратных прерываний.

void iret0(void) {	// первый контроллер прерываний
	asm {
		push	ax
		mov	al,EOI
		out	MASTER8259A,al
		pop	ax
		pop bp
		iret
	}
}
Служебное слова могут отличаться в зависимости от компилятор где:
asm
__asm
__asm__
emit
А так же не забываем что у ассемблера бывает 2 синтаксиса Intel и AT&T.

б) Компилируем код в объектный файл и подключаем к программе
Используем слова extern и import public, export. Всё это зависит от ваших компиляторов.
Но тут ещё придётся повозиться с линкером. Так как компиляторы могут выдавать разные по формату *.obj файлы.
в) Тоже самое что б) но в обратную сторону.
Код:
PUBLIC	_beep
...
; --------------------------
; Выдача звукового сигнала
; --------------------------

PROC	_beep	NEAR

	push	ax bx cx

	in	al,KBD_PORT_B
	push	ax
	mov	cx,80

beep0:

	push	cx
	and	al,11111100b
	out	KBD_PORT_B,al
	mov	cx,60

idle1:

	loop	idle1
	or	al,00000010b
	out	KBD_PORT_B,al
	mov	cx,60

idle2:

	loop	idle2
	pop	cx
	loop	beep0

	pop	ax
	out	KBD_PORT_B,al

	pop	cx bx ax
	ret

ENDP	_beep
Вызов на Си.
Код:
...
extern void beep(void);
...
void Beeper(void) 
{

// Периодически выдаём звуковой сигнал
for(int i; i<100; i++) {
		beep();
                      Sleep(1);
	}
2)
Что-бы не изобретать велосипед с квадратными колёсами мы повторно используем готовый код.
Фреймворк, библиотека, заголовочные файлы, API OS.
Как не парадоксально, но даже вы в первом сообщение вызываете API OS.
int 17h - это API BIOS. (Interface)

Где BIOS там и DOS они всегда работают в паре. BIOS ничего не знает про программы и то как их вызывать зато это знает DOS.

Для запуска EXE у доса нет команды. Но есть для запуска COM. Так как загрузка EXE сложнее чем COM. То Проще всего загрузить COMMAND.COM и передать ему в параметрах имя файла который он запустит. COMMAND.COM уж сам разберётся с EXE файлом.

Как запустить COMMAND.COM? Как и любой другой COM файл. Нам нужно выделить 64 кб памяти. Далее вызываем апи доса, и в параметрах передаём что грузим и какой блок данных следует передать COM. Этот блок PARAREA содержит параметры командной строки которую COMMAD.COM получит и интрпертирует для запуска. В примере это DIR но тут вы можете подставить свою программу на СИ.

Код:
MOV AH,4BH ;Функция загрузки
MOV AL,00 ; и выполнения
int 21h
Описание функции смотри в справочнике по DOS. Описание структур PARAREA, PROGNAM то же смотри в справочнике DOS. Для тренировки можно их переписать на манер Си через Struct - так вам будет проще их понять.

Далее обработка результата возврата. Любая программа возвращает код возврата обычно 1 успех и 0 неуспех. Но тут так как параметров больше, возвращается всё по другому. 0 успех 1 недостаточно памяти для запуска COM. 2 - ошибка внутри Command.COM или DIR.

Код:
MOV AH,4CH ;Функция завершения
INT 21H ;Вызвать DOS
Это корректный выход из программы.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 03.06.2017 в 12:13.
Pavia вне форума Ответить с цитированием
Старый 05.06.2017, 08:28   #10
Argogo
Пользователь
 
Регистрация: 28.03.2013
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Для запуска EXE у доса нет команды. Но есть для запуска COM. Так как загрузка EXE сложнее чем COM. То Проще всего загрузить COMMAND.COM и передать ему в параметрах имя файла который он запустит. COMMAND.COM уж сам разберётся с EXE файлом.
Это шутка такая?
Лянчер
Код:
.model tiny
.data
EPB     STRUC
EnvSeg  dw      ?
cLineO  dw      ?
cLineS  dw      ?
Fcb1_O  dw      ?
Fcb1_S  dw      ?
Fcb2_O  dw      ?
Fcb2_S  dw      ?
EPB     ENDS
cr=0Dh
lf=0Ah

ParBlk          EPB     <0,CmdLine,0,5Ch,0,6Ch,0>
ProcName        db      'hellow.exe', 0
CmdLine         db      0, cr
MsgErrResize    db      'Resize MemBlk Error', cr, lf, 24h
MsgErrUnexp     db      'ERROR: unexpected return code', cr, lf, 24h
MsgErrExec      db      'EXEC Error', cr, lf, 24h
MsgOk           db      'OK!', cr, lf, 24h
.code
	org	100h
Begin	PROC	NEAR
        mov     bx, 1000h
        mov     ah, 4ah
        int     21h
        jnc     @F
        mov     dx, offset MsgErrResize
        jmp     @@disp_exit
@@:
        mov     ax, cs
        mov     [ParBlk.cLineS], ax
        mov     [ParBlk.Fcb1_S], ax
        mov     [ParBlk.Fcb2_S], ax

        mov     bx, offset ParBlk
        mov     ax, offset ProcName
        call    Process_Execute
        jnc     @F
        mov     dx, offset MsgErrExec
        jmp     @@disp_exit
@@:
        mov     ah, 4dh
        int     21h
        cmp     al, 'W'
        je      @F
        mov     dx, offset MsgErrUnexp
        jmp     @@disp_exit
@@:
        mov     dx, offset MsgOk
@@disp_exit:
        mov     ah, 9
        int     21h

        mov     ax, 4c00h
        int     21h
Begin	ENDP
;---------------------------
; Вход:
;       DS:AX -> programm to execute  (ASCIIZ)
;       DS:BX -> EPB
;
EVEN
Process_Execute         PROC    NEAR
                        push    cx
                        push    dx
                        push    bx
                        push    bp
                        push    si
                        push    di
                        push    ds
                        push    es

                        mov     cs:[@@ss], ss
                        mov     cs:[@@sp], sp

                        mov     dx, ax
                        mov     ax, ds
                        mov     es, ax
                        mov     ax, 4b00h
                        int     21h

                        cli
                        mov     ss, cs:[@@ss]
                        mov     sp, cs:[@@sp]
                        sti

                        pop     es
                        pop     ds
                        pop     di
                        pop     si
                        pop     bp
                        pop     bx
                        pop     dx
                        pop     cx
                        ret
EVEN
@@sp                    dw      0
@@ss                    dw      0
Process_Execute         ENDP
;---------------------------
        END     Begin
И, собственно, запускаемый файл:
Код:
.MODEL  SMALL
.STACK  256
.DATA
MsgHel  db      'EXE: Hellow, world!', 0dh, 0ah, 24h
.CODE
Begin:
        mov     ax, @data
        mov     ds, ax
        mov     dx, offset MsgHel
        mov     ah, 9
        int     21h
        mov     ax, 4c00h+'W'
        int     21h
        END     Begin
exelaunch.png
Argogo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
может кто может помочь написать программу наC++ Мираслава Помощь студентам 1 16.04.2017 16:41
Написать программу вычисления в ассемблер Rageded Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 09.12.2015 18:47
Где и как скачать программу Delphi. Может кто нибудь может помочь мне - без скачивания из интернета. IZOPGRAM Общие вопросы Delphi 4 16.06.2012 18:12
Девушка просит помощи у мудрых программистов (ассемблер).... помогите,кто чем может Tomogochi Помощь студентам 0 10.06.2009 20:31
разработать ассемблер программу Diman365 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 07.06.2009 21:20