Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.89
rigodigo
0 / 0 / 0
Регистрация: 08.10.2009
Сообщений: 5
#1

Связь С++ с программой на ассемблере - C++

08.10.2009, 19:55. Просмотров 2351. Ответов 1
Метки нет (Все метки)

Помогите пожалуйста!
Не удается создать связь Borland C++ v5.02 с программой на ассемблере через стек.
при удалении строк с вызовом внешней функции и компилированием всё работает.
при компилировании с ключом -S вызов функции в Pfar идет near..

программа на С++
файл zad77.cpp
C++
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
/*  Главная программа на языке Си для сопряжения
  с подпрограммой на Ассемблере.
 
Получить средние арифметические левой и правой половин массива. 
;Каждую половину массива умножить на свое среднее. 
;Результаты записать в массив двойных слов. */
#include <stdio.h>
#define nm 8
     /* Функция на языке СИ              */
//void PC(long & ao, int & ai, int k)
void PC(long *ao, int  *ai, int k)
{
  int suml=0; int sumr=0;
  int j,s;
  long sumll=0;
  long sumrl=0;
  s=nm;
 
  for(j=0;j < k; j++)
  {
     if (j<(s/2)) {suml=suml+ai[j];}
        else {sumr=sumr+ai[j];}
    }
    
 
    suml=suml/(s-s/2);
    sumr=sumr/(s/2);
    sumll=suml;
    sumrl=sumr;
    
  for(j=0;j < k; j++)
  {
    if (j<s/2)
         { ao[j]=(ai[j])*sumll;
 
     }
    else { ao[j]=(ai[j])*sumrl; }
 
   } 
} // подпрограммы
   /* Прототип внешней подпрограммы на ассемблере  */
    extern  "C" { int Pfar(long *ao, int *ai, int k); }
    
    /*  Главная программа                */
 
void main(void)
{
 
  int n=nm,i;
  int mass1[nm] = {15,49,-86,430,9,3678,-213,-1462 };
  long mass2[nm],mass3[nm];
  n=nm;
  printf("Входной массив\n");
  for (i=0; i < n; i++) printf("%10d",mass1[i]);
  printf("\nПодпрограмма на Си\n");
  PC(mass2,mass1,n);   /* Обращение к функции PC    */
 
  for (i=0; i < n; i++) printf("%20ld",mass2[i]);
  printf("\n");
  printf("\nПодпрограмма на Ассемблере\n");
  Pfar(mass3,mass1,n);   /* Обращение к функции Pfar    */
  for (i=0; i < n; i++) printf("%20ld",mass3[i]);
  printf("\nКонец программы\n");
}
файл mod7.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
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
;  Модуль дальней подпрограммы для сопряжения
;  с главной программой на языке C++
 
    title   mod7
model large 
 
 
    page    52,72
    public _Pfar
Segfar  segment public
    assume  CS:Segfar
    
_Pfar proc far
    
; Здесь алгоритм
;   Пролог
; Алгоритм подпрограммы 
 
    push    bp  ; Сохранить старый BP в стеке
    mov bp,sp   ; Определить новую базу в стеке
    sub sp,10   ; Место для локальных переменных
    push    DS
    push    SI
    push    DI  
    push    DS ;не знаю для чего, сохраняем DS
    ; Алгоритм подпрограммы
        lds    SI,[BP+10] ; в SI адрес массива mass1     mov SI,offset mass1     
        mov cx,[BP+14]  ; установка счетчика цикла n2
        mov     word ptr[BP-8],0  ; обнуление счетчика левой    mov ml,0 
        mov     word ptr[BP-10],0  ; обнуление счетчика правой mov  mr,0        
 
        
        mov ax,[si]
        mov AX,CX
        shr AX,1 ; сдвиг вправо, получили значение половинного элемента 
        mov     word ptr[BP-10],AX ; сохранили значение в m 
        
    mov AX,0    ; обнуление сумматора  левой половины массива
    mov DX,0    ; обнуление сумматора правой половины массива
        
 
            
;   тело цикла      
    lp11: mov BX,[SI] ;  элемент массива заносим в BX         
        cmp cx,[BP-10]; cmp cx,m
        jle lp12 ;переход, если элемент массива находится в левой половине
        add ax,[si]
        
        jmp lp13
    lp12:   add dx,[si]
        
    lp13:add    SI,2    ; в SI адрес следующего элемента  массива
;   проверка окончания и выход из цикла
    loop    lp11
; Запись полученных сумм в память
    mov [BP-2],AX   ; запись в память суммы левой половины массива suml
    mov [BP-4],DX   ; запись в память суммы правой половины массива sumr
    
; Подсчет среднего арифметического положительных
    mov bx,[BP+14] ;bx,n
    sub bx,[BP-10]   ;sub bx,m
    mov AX,[BP-2] ; сумма в регистр AX для делимого mov ax,suml
    cwd ; расширение делимого до двойного слова
    idiv    bx
    mov [BP-2],AX   ; запись частного в память suml
; Подсчет среднего арифметического для правой половины
 
    mov AX,[BP-4]      ;mov AX,sumr
    cwd
    idiv  word ptr[BP-10]       ; деление на количество
    mov [BP-4],AX   ;sumr
    
 
    
; Цикл умножения массива на свое среднее
; и запись в массив двойных слов
; начальная установка
    lds SI,[BP+10]   ; в SI адрес массива mass1     mov SI,offset mass1     
    mov DI,[bp+6] ; mass13
        mov CX,[BP+14]  ; установка счетчика цикла     mov  CX,n
;       тело цикла
      ;  mov bx,0 зачем??
lp14:   mov AX,[SI]
    ;inc bx
    cmp CX,[BP-10];m
    jle lp15
    imul word ptr [BP-2] ;suml
    jmp lp16
lp15:
    imul word ptr [BP-4];sumr
 
    
 
lp16:   mov word ptr [DI],AX
        mov word ptr [DI+2],DX
;       изменение
    add SI,2
    add DI,4
        dec CX
        cmp cx,0
;    проверка окончания и возврат или выход из цикла
    jg  lp14    
    
    
; Эпилог
    pop DI
    pop SI
    pop DS
    mov SP,BP   ; Очистить стек от локальных переменных
    pop BP  ; Восстановить старый ВР
    ret     ; Выход из подпрограммы
_Pfar   endp
Segfar  ends
    end
при компилировании
bcc -LC:\bc5\include -LC:\bc5\lib -ml -r C:\bc5\bin\zad77.cpp mod7.asm
отрабатывает только часть программы С++ до третьего элемента массива и аварийно завершает работу.
Вложения
Тип файла: rar zad77.rar (2.2 Кб, 45 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.10.2009, 19:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Связь С++ с программой на ассемблере (C++):

Записать программой #1 и прочитать программой #2 - C++
Всем привет! Столкнулся с проблемой: Программа #1 пишет в бинарник инфу, программа #2 читает этот бинарник и работает с получеными...

Связь паскаль - ассемблер. Написать процедуру на ассемблере - Assembler
Задача В матрице NxM найти максимальный элемент и заменить его на среднее арифметическое строки, в которой он находится... оформить в...

Связь типа файла со своей программой - C++ Builder
Подскажите как связать формат *.jpg со своей программой. Чтобы при нажатии на картинку в моем компьютере, она загружалась через мою...

maple и .net (связь с программой, написанной на c#) - Maple
здравствуйте форумчане, меня волнует такой вопрос, можно ли в . net, ну например в своей программке написанной на c#,взаимодействовать с...

Создать связь с другой программой (процесс) - Delphi
Здравствуйте уважаемые форумчане! Опять нужна ваша помощь)) Пишу что та типа лаунчера игры, мне надо как то создать связь между...

Стандартный импорт таблицы (связь) из каталога с программой - MS Access
Добрый вечер. Связываю файл txt/xls с базой через стандартный инструмент импорта (создать связанную таблицу). Возможно ли таким способом...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
rigodigo
0 / 0 / 0
Регистрация: 08.10.2009
Сообщений: 5
09.10.2009, 18:26  [ТС] #2
прошу прощения, в спешке оказался невнимателен, в mod7.asm в стек лишний раз положил DS, теперь все работает, можно закрыть тему.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2009, 18:26
Привет! Вот еще темы с ответами:

Связь подпрограмм на ассемблере с программами на языках выс. уровня. PASKAL - Assembler
Имеется программа на паскале(borland pascal version 7 1992 год) и подпрограмма на ассемблере вроде все норм, но ничего не работает, в чем...

Связь приложения с консольной программой, написанной на SWI Prolog - Delphi
Господа, АЛАРМ! Пишу прогу на Delphi. Она должна связаться с консольной программой, написанной на SWI Prologe. но....не связывается....

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

связь CPU-314SC и WINDOWS где посмотреть обмен данными и вообще связь - Контроллеры PLC
между двумя системами.


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru