Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2015, 18:30   #1
Koroz147
 
Регистрация: 06.12.2015
Сообщений: 3
По умолчанию Компоновка ассемблерной программы с программой С++

Посчитать количество повторений первого элемента в пятисимвольном массиве.

Инициализацию массива делаю в С++, дальше передаю указатель на массив в ассемблерную функцию
и ожидаю получить результат(количество элементом массива эквивалентных первому).

Не понимаю в чем ошибка, перепробовал уже всё что угодно. В одних случаях возвращает что-то вроде 6543, а сейчас возвращает "1".

Прошу помощи.

Файл obj делаю с помощью ml.exe и подключаю в проект.


Ассемблерная программа:
Код:
.486
.model flat, stdcall
option casemap:none
 
.code
F proc, arr:DWORD
 
        xor ebx,ebx
        xor ecx,ecx
        mov esi,0
 
        mov eax, arr[0]
 
        mov cx, 5
        start_loop:
                mov edx, arr[esi]
                cmp eax, edx
 
                jz M2
 
                M1:
                        inc esi
 
                        loop start_loop
                        jmp end_loop
 
                M2:
                        add ebx,1
                        inc esi
 
                        loop start_loop
 
        end_loop:
                        mov eax,ebx
 
                        RET
                        F endp
end
Код на С++:
Код:
#include <iostream>
#include <Windows.h>
 
using namespace std;
#define USINT unsigned short int
 
unsigned short int arr[5];
unsigned short int num=5;
unsigned short int number=0;
extern "C" int _stdcall F(USINT*);
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    cout << "Введите элементы массива:" << endl;
    for (unsigned short int i = 0; i < 5; i++)
    {
        cout << i << ": ";
        cin >> arr[i];
    }
 
    number=0;
    number=F(arr);
 
    cout<<endl<<"Количество повторений первого элемента = "<<number<<endl;
    system("pause");
    return 0;
}
Koroz147 вне форума Ответить с цитированием
Старый 06.12.2015, 19:22   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

aдские преступления против винды в виде несохранненых ebx, esi.

как вариант

Код:

F proc, arr:DWORD
    PUSH ebx 
    PUSH esi

    MOV ecx, arr
    MOV eax, 5

    MOV esi, [ecx]

    XOR ebx, ebx
    MOV edx, [ecx + 4]
    XOR edx, esi
    SUB ebx, edx
    SBB eax, 0

    XOR ebx, ebx
    MOV edx, [ecx + 8]
    XOR edx, esi    
    SUB ebx, edx
    SBB eax, 0

    XOR ebx, ebx
    MOV edx, [ecx + 12]
    XOR edx, esi    
    SUB ebx, edx
    SBB eax, 0

    XOR ebx, ebx
    MOV edx, [ecx + 16]
    XOR edx, esi    
    SUB ebx, edx
    SBB eax, 0

 
    POP esi
    POP ebx

    RET
F endp
end

Последний раз редактировалось f.hump; 06.12.2015 в 19:38.
f.hump вне форума Ответить с цитированием
Старый 06.12.2015, 20:08   #3
Koroz147
 
Регистрация: 06.12.2015
Сообщений: 3
По умолчанию

Спасибо за то, что откликнулись.
Переделал, но снова считает неправильно. Выводит "1" и иногда "2" ( в ходе тестирования выяснил, что выводит "2" тогда, когда нулевой и второй элементы массива совпадают).
Не подскажите что не так как надо?
Код:
.486
.model flat, stdcall
option casemap:none
 
.code

F proc, arr:DWORD
    PUSH ebx 
    PUSH esi

    MOV ecx, arr
    MOV eax, 5

    MOV esi, [ecx]

    XOR ebx, ebx
    MOV edx, [ecx + 4]
    XOR edx, esi
    SUB ebx, edx
    SBB eax, 0

    XOR ebx, ebx
    MOV edx, [ecx + 8]
    XOR edx, esi    
    SUB ebx, edx
    SBB eax, 0

    XOR ebx, ebx
    MOV edx, [ecx + 12]
    XOR edx, esi    
    SUB ebx, edx
    SBB eax, 0

    XOR ebx, ebx
    MOV edx, [ecx + 16]
    XOR edx, esi    
    SUB ebx, edx
    SBB eax, 0

 
    POP esi
    POP ebx

    RET
F endp
end
Koroz147 вне форума Ответить с цитированием
Старый 06.12.2015, 20:14   #4
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

че-то сразу не заметил, что ты массив short объявил.
выкинь short, и твой вариант тоже будет варианты по интересней выдавать.
f.hump вне форума Ответить с цитированием
Старый 06.12.2015, 20:22   #5
Koroz147
 
Регистрация: 06.12.2015
Сообщений: 3
По умолчанию

Выкинул и получил варианты поинтересней("1" иногда "-1" иногда "-2"), но не те, какие мне нужно))

Код:
#include <iostream>
#include <Windows.h>

using namespace std;

#define USINT unsigned short int


 int arr[5];
 int number=0;
extern "C" int _stdcall F(int*);

int main()
{
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	cout << "Введите элементы массива:" << endl;
	for (unsigned short int i = 0; i < 5; i++)


	{
		cout << i << ": ";
		cin >> arr[i];
	}
			
	number=0;
	number=F(arr);

	cout<<endl<<"Количество повторений первого элемента = "<<number<<endl;
	system("pause");
	return 0;
}
Koroz147 вне форума Ответить с цитированием
Старый 06.12.2015, 20:37   #6
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

значит пришло время воспользоваться дебагером и пошагово пройтись по программе.
f.hump вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
QT компоновка Antej Qt и кроссплатформенное программирование С/С++ 5 26.10.2012 00:30
управлять GUI программой из своей программы mezmay Win Api 4 06.10.2010 17:13
компоновка Serg12 Помощь студентам 0 10.05.2010 09:21