Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 21.10.2010
Сообщений: 27

Вызов функций на Ассемблере в программе на С++

28.05.2011, 02:23. Показов 4267. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите,пожалуйста.
Нужно написать программу, состоящую из ассемблерной функции в одном файле и вызове её в главном файле на С++.
Программа пока сделана только как один файл с ассемблерной вставкой.
Помогите её разбить на 2 файла.
Вот код:
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include<iostream>
using namespace std;
int main()
{
    setlocale(LC_ALL,".1251");
    char*stroka=new char[255];
    cout<<"Введите строку длиной не более 255 символов"<<endl;
    cin.getline(stroka,255);
    short int N=strlen(stroka);
    char*new_str=new char[N++];
    _asm
    {
        mov esi,stroka ; исходная строка
        mov edi,new_str ; новая строка
        xor edx,edx ; edx - номер элемента новой строки, с которой работает программа
begin:
        xor eax,eax ;ah-  начало слова,al- конец
        xor ebx,ebx ; bh- начало минимального слова ; bl - его длина
        xor ecx,ecx ;ecx- номер элемента, с которым в данный момент работает программа
        mov bl,-1
        mov al,-1
min_word :
        cmp cx,N
        je end
        cmp [esi][ecx],' '
        je word_end
        cmp [esi][ecx],'\0'
        je word_end
        inc cx
        
        jmp min_word
word_end:
        
        mov ah,al
        inc ah
        mov al,cl
        inc cx
        cmp ah,al
        je min_word
        sub al,ah
        cmp al,0
        jng min_word
        cmp al,bl
        jg new_min_word
        add al,ah
        jmp min_word
new_min_word:
        
        mov bl,al
        add al,ah
        mov bh,ah
        jmp min_word
end:
        cmp bh,bl
        push ebx
        mov bl,bh
        mov bh,0
        mov ecx,ebx
        pop ebx
delete_word:
 
        cmp bl,-1
        je full_end
        cmp bl,0
        je exit_point
        mov ax,[esi][ecx]
        mov [edi][edx],ax
        inc edx
        mov [esi][ecx],' '
        inc ecx
        dec bl
        jmp delete_word
exit_point:
        
        mov[edi][edx],' '
        inc edx
        jmp begin
full_end:
        mov[edi][edx],'\0'
    }
    cout<<"Искомая строка"<<endl;
    cout<<endl<<new_str<<endl;
    return 0;
}
Заранее спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.05.2011, 02:23
Ответы с готовыми решениями:

Итерационные циклы,Определение и вызов функций,Использование библиотечных функций stdio.h
Помогите решить задания: 1.Дано натуральное число n. Найти разность между первой цифрой этого числа и суммой всех остальных. ...

Передача значений функций в главную программу, вызов функций
Здравствуйте! Скорее всего, неправильно передаю значения функциям и в главную программу. Помогите найти ошибку! В итоге выводит...

Вызов функции написанной на ассемблере
Вопрос заключается в следующем, когда я пытаюсь запустить программу, компелятор выдает:&quot;Ошибка сегментации&quot;, и я никак не могу...

2
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
28.05.2011, 10:02
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
65
66
67
68
69
70
71
72
73
//asm_function.cpp
void func(char* stroka,char* new_str,short N){
_asm
        {
                mov esi,stroka ; исходная строка
                mov edi,new_str ; новая строка
                xor edx,edx ; edx - номер элемента новой строки, с которой работает программа
begin:
                xor eax,eax ;ah-  начало слова,al- конец
                xor ebx,ebx ; bh- начало минимального слова ; bl - его длина
                xor ecx,ecx ;ecx- номер элемента, с которым в данный момент работает программа
                mov bl,-1
                mov al,-1
min_word :
                cmp cx,N
                je end
                cmp [esi][ecx],' '
                je word_end
                cmp [esi][ecx],'\0'
                je word_end
                inc cx
                
                jmp min_word
word_end:
                
                mov ah,al
                inc ah
                mov al,cl
                inc cx
                cmp ah,al
                je min_word
                sub al,ah
                cmp al,0
                jng min_word
                cmp al,bl
                jg new_min_word
                add al,ah
                jmp min_word
new_min_word:
                
                mov bl,al
                add al,ah
                mov bh,ah
                jmp min_word
end:
                cmp bh,bl
                push ebx
                mov bl,bh
                mov bh,0
                mov ecx,ebx
                pop ebx
delete_word:
 
                cmp bl,-1
                je full_end
                cmp bl,0
                je exit_point
                mov ax,[esi][ecx]
                mov [edi][edx],ax
                inc     edx
                mov [esi][ecx],' '
                inc ecx
                dec bl
                jmp delete_word
exit_point:
                
                mov[edi][edx],' '
                inc edx
                jmp begin
full_end:
                mov[edi][edx],'\0'
        }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//main.cpp
#include<iostream>
using namespace std;
void func(char*,char*,short);
int main()
{
        setlocale(LC_ALL,".1251");
        char*stroka=new char[255];
        cout<<"Введите строку длиной не более 255 символов"<<endl;
        cin.getline(stroka,255);
        short int N=strlen(stroka);
        char*new_str=new char[N++];
        func(stroka, new_str,N);
        cout<<"Искомая строка"<<endl;
        cout<<endl<<new_str<<endl;
        return 0;
}
кстати код в исходном виде студия не скомпилировала, ибо using namespace std и метка begin: с конфликтным именем.
0
0 / 0 / 0
Регистрация: 21.10.2010
Сообщений: 27
28.05.2011, 11:12  [ТС]
Мне не то нужно.
Нужно разбить проект на 2 файла. Первый - чисто ассемблеровский код( .asm) . Второй - это с++ файл с вызовом функции из первого.
Исходный код у меня компилировался, может быть дело в студии? У меня 2008.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.05.2011, 11:12
Помогаю со студенческими работами здесь

Вызов Си-процедуры из кода на ассемблере
Доброго времени суток. Нужен какой-нибудь простенький пример для понимания взаимодействия программы на ассемблере и внешней процедуры на...

Вызов функций внутри других функций
#include &quot;stdafx.h&quot; #include &quot;stdio.h&quot; #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;iomanip&gt; using namespace std; ...

Ошибка подсчета в программе на ассемблере
Всем привет! Сделал программу на ассемблере которая считает пример: B*(A+B)/(C-D-1) Ввожу тестовые данные: А= -50, B= 100, C= 50,...

Написание функции на ассемблере для использования в программе на С++
Доброго времени суток! По заданию лабы, необходимо написать функцию на ассемблере, которая посчитает сумму элементов в массиве и...

Вызов функций
Помогите разобраться с функциями, мне нужно разобраться как работать с массивом в другой функции int main() { int i, k; ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
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 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru