Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Использование ассемблера в с++ проекте


Автор: РагнаР 29.5.2011, 23:53
Помогите,пожалуйста.
Нужно написать программу, состоящую из ассемблерной функции в одном файле( файл полностью на ассемблере, то есть *.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;
}


Автор: РагнаР 30.5.2011, 15:24
Вот что я сделал, но выдается ошибка
Функция вызывается в таком файле
Код 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


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)