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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Метод сортировки выбором!!! http://www.cyberforum.ru/cpp-beginners/thread55220.html
ВАРИАНТ 21 Написать программу, которая методом сортировки выбором сортирует введенный пользователем массив слов. Также найти количество операций сравнения и перестановок (присвоений) необходимых ...
C++ Проверка символа на принадлежность к буквам русского алфавита Дан символ. Проверить: является ли данный символ гласной буквой русского алфавита(независимо от регистра). Объясните, пожалуйста, как решить задачу, еще только познаю азы программирования :) http://www.cyberforum.ru/cpp-beginners/thread55178.html
Результат запуска ракеты в зависимости от скорости C++
Народ помогите пожалуста решить практическую работу, то я многого еще не понимаю. 1. Построить блок-схему, алгоритм и проверить правильность выполнения алгоритма: Составьте алгоритм вычисления...
Proc C++
Описать функцию SumRange (A,B) целого типа, находящую сумму всех целых чисел от А до В включительно (А и В-целые). если А>B, то функция возвращает 0. С помощью этой функции найти суммы чисел от А до...
C++ создание функции http://www.cyberforum.ru/cpp-beginners/thread55146.html
помогите описать функцию меняющую местами максимальные элементы матриц А и В произвольного порядка.
C++ Вопрос про mkdir У меня уже есть идея реализации но мне кажется есть способ проще! И так к делу вот часть кода точнее строчка WinExec("cmd /c mkdir d:\\MyFolder\\",0); мне надо так чтобы пользаватель мог задавати... подробнее

Показать сообщение отдельно
rigodigo
0 / 0 / 0
Регистрация: 08.10.2009
Сообщений: 5

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

08.10.2009, 19:55. Просмотров 2363. Ответов 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
отрабатывает только часть программы С++ до третьего элемента массива и аварийно завершает работу.
0
Вложения
Тип файла: rar zad77.rar (2.2 Кб, 45 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru