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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2008, 13:22   #1
макс07
 
Регистрация: 24.04.2008
Сообщений: 9
По умолчанию вставки из ассемблера

КАК сделать ассемблеровскую вставку в си???
макс07 вне форума Ответить с цитированием
Старый 09.05.2008, 13:24   #2
макс07
 
Регистрация: 24.04.2008
Сообщений: 9
По умолчанию

#include <iostream.h>
#include <string.h>
void main(void)
{
int i,j,s=0,k;
char a[4][3];
char b[30]={'у','е','ы','а','о','э','я','и',' ю'};
cout<<"Введите символы:";
cout<<endl;
for(i=0;i<4;i++)
for(j=0;j<3;j++)
cin>>a[i][j];
cout<<"Полученный массив:";
cout<<endl;
for(i=0;i<4;i++)
{
cout<<endl;
for(j=0;j<3;j++)
cout<<" "<<a[i][j]<<" ";
}
for(k=0;k<30;k++)
{
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
if(a[i][j]==b[k]) s++;
}
}
cout<<endl;
cout<<endl;
cout<<"Число гласных букв="<<s;

}
как сделать подсчёт гласных с помощью ассемблера(вставкой) !!! кто знает помогите пожалуйста!!!!
макс07 вне форума Ответить с цитированием
Старый 09.05.2008, 17:29   #3
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Блоки asm:
Код:
#include <stdio.h>

int main()
{
	long v1, v2, *p1 = &v1;

	// вариант 1
	__asm {
			mov		eax, 100
			mov		v1, eax
			add		eax, 200
			mov		v2, eax
			xor		eax, eax
	}

	// вариант 2
	__asm	mov		eax, v1
	__asm	mov		ebx, v2
	__asm	add		eax, ebx
	__asm	mov		ebx, p1
	__asm	mov		[ebx], eax

	printf("%d\n", v1);
	return 0;
}
Многие компиляторы понимают и __asm, и просто asm, многие реализации не поддерживают блоки asm вообще. С чем именно помочь по второму вопросу, Вы не знаете, как это написать или что?
B_N вне форума Ответить с цитированием
Старый 09.05.2008, 21:23   #4
макс07
 
Регистрация: 24.04.2008
Сообщений: 9
По умолчанию

Дело в том что в моей программе на си нужно сделать вставку из ассемблера которая делает подсчёт гласных в массиве потом си делает вывод на экран эту сумму. помогите со вставкой ??????
макс07 вне форума Ответить с цитированием
Старый 10.05.2008, 11:21   #5
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Когда речь заходит об ассемблере, стоит уточнять процессор, режим его работы, а зачастую и ОС. Я, конечно, понимаю, что вряд ли здесь речь про моторолу или "микрошу", но, тем не менее, даже для DOS'а и Windows на x86 код может заметно различаться. Так что данный вариант - под Win32. Алгоритм Ваш, хотя он и не является оптимальным для такой задачи.

Код:
#include <iostream>

void main(void)
{
	long unsigned const N = 4;
	long unsigned const M = 3;
	
	long i, j, s=0, k;
	char a[N][M];
	char b[]={'A','E','I','O','U','a','e','i','o', 'u'};
	long unsigned b_size = sizeof b;
	
	std :: cout << "Введите символы:" << std :: endl;
	for(i=0;i<4;i++){
		for(j=0;j<3;j++){
			std :: cin >> a[i][j];
		}
	}
	
	std :: cout << "Полученый массив:" << std :: endl;
	for(i = 0; i < 4; i ++){
		for(j = 0; j < 3; j ++) std :: cout << " " << a[i][j] << " ";
		std :: cout << std :: endl;
	}
	
	__asm {
			MOV		EAX, N
			IMUL	EAX, M
			MOV		EDX, EAX		// EDX - размер таблицы ( M * N )
			LEA		ESI, a			// ESI - адрес таблицы

l_next_char:

// проверяем следующий символ из таблицы
// сначала убеждаемся, что таблица ещё не кончилась
			TEST	EDX, EDX
			JZ		l_end

// загружаем в AL испытуемый символ, в ECX - размер массива
// гласных, в EBX - адрес массива гласных
			LODSB
			MOV		ECX, DWORD PTR b_size
			LEA		EBX, b

l_test_char:
// сравниваем символ из таблицы с текщим символом в массиве гласных
			CMP		AL, BYTE PTR [EBX]
			JE		l_found
// если они совпадают, переходим по метке l_found
// иначе переходим к следующему символу в массиве гласных
			INC		EBX
			LOOP	l_test_char
// весь массив гласных пройден, переходим к следующему символу таблицы
			DEC		EDX
			JMP		l_next_char
l_found:
// текущий символ найден в массиве гласных, увеличиваем счётчик гласных 
// и уменьшаем счётчик оставшихся для проверки символов
			INC		DWORD PTR s
			DEC		EDX
// и переходим к следующему символу
			JMP		l_next_char
l_end:
	}

	std :: cout << std :: endl << "Число гласных букв=" << s << std :: endl;
	return;
}
B_N вне форума Ответить с цитированием
Старый 12.05.2008, 14:47   #6
макс07
 
Регистрация: 24.04.2008
Сообщений: 9
По умолчанию

матрицу ввожу,а почему то саму сумму не выдаёт???? это зависит от версии с++?
макс07 вне форума Ответить с цитированием
Старый 13.05.2008, 14:40   #7
макс07
 
Регистрация: 24.04.2008
Сообщений: 9
По умолчанию

подскажите пожалуйста!
макс07 вне форума Ответить с цитированием
Старый 13.05.2008, 19:19   #8
макс07
 
Регистрация: 24.04.2008
Сообщений: 9
По умолчанию

на какой версии си вы писали программу???????
макс07 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ассемблерные вставки в Delphi Jupiter Общие вопросы Delphi 2 24.08.2008 16:41
Изучение ассемблера, начало Lich Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 18.06.2008 14:16
Ассемблерные вставки Assassin Помощь студентам 1 26.05.2008 08:19
Сравнение Си и Ассемблера... Sota Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 25.07.2007 16:15
asm-вставки demon_sv Общие вопросы Delphi 1 14.02.2007 18:33