Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование ассемблера в с++ проекте 
:(
    Опции темы
РагнаР
Дата 29.5.2011, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 29.5.2011

Репутация: нет
Всего: нет



Помогите,пожалуйста.
Нужно написать программу, состоящую из ассемблерной функции в одном файле( файл полностью на ассемблере, то есть *.asm) и вызове её в главном файле (*. cpp). 
Программа пока сделана только как один файл с ассемблерной вставкой.
Помогите её разбить на 2 файла.
Возможны проблемы при запуске проекта в 2010 студии
Код

#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;
}



Это сообщение отредактировал(а) РагнаР - 29.5.2011, 23:58
PM MAIL   Вверх
РагнаР
Дата 30.5.2011, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 29.5.2011

Репутация: нет
Всего: нет



Вот что я сделал, но выдается ошибка
Функция вызывается в таком файле
Код C++
Код

#include<iostream>
using namespace std;
extern "C" char* __stdcall sorting(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++];
        
                
                cout<<sorting(stroka,new_str,N);
return 0;
}


Но при компиляции выдает ошибку
Error    1    error PRJ0019: A tool returned an error code from "Assembling..."    assembler_podrogramm


Код функции
Код

.386
PUBLIC _sorting@12
.model flat
.code
_sorting@12 proc
                push ebp
                mov ebp, esp
                mov esi,[esp+8]
                mov edi,[esp+12]                
                
                xor edx,edx ; edx - номер элемента новой строки, с которой работает программа
beg:
                xor eax,eax ;ah-  начало слова,al- конец
                xor ebx,ebx ; bh- начало минимального слова ; bl - его длина
                xor ecx,ecx ;ecx- номер элемента, с которым в данный момент работает программа
                mov bl,-1
                mov al,-1
min_word :
                cmp cx,[esp+16]
                je ende
                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
ende:
                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 beg
full_end:
                mov[edi][edx],'\0'
                mov eax,edi  
                
                mov esp,ebp
                pop ebp
                ret 12
        _sorting@12 endp
        end


Как это исправить?
Заранее благодарен

Это сообщение отредактировал(а) РагнаР - 30.5.2011, 15:48
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0421 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.