ассемблерная вставка в с++

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
ge4r
Сообщения: 13
Зарегистрирован: 19 янв 2009, 12:28

Приветствую,нужен направляющий пинок по решению задачки
задача в следующем
Разделить массив на две части, поместив в первую эле-менты, большие среднего арифметического их суммы, а во вторую - меньшие (части не сортировать).Обязательно использовать адресную арифметику

На языке высокого уровня естественно пишется за 5 строк кода,но тут надо на асме.

то есть есть метод,в который я передаю массив,предварительно введенный пользователем. далее начинается вставка и вот тут загвоздка. как в асме создать массив и крутить-вертеть его элементами?
ge4r
Сообщения: 13
Зарегистрирован: 19 янв 2009, 12:28

посмотрите,пожалуйста,что накатал. вроде бы все довольно логично,но вот с точки зрения асма не уверен)

Код: Выделить всё

#include "stdafx.h"
#include <iostream>

using namespace std;


void task1(){
	int arr[500],narr[500],k1=0,k2=0;
	int len;
	cout << "Enter array's length" << endl;
	cin >> len;
	cout << "Enter the elements" << endl;
	for(int i = 0; i < len; ++i)
		cin >> arr[i];
	k2=len;

	__asm{
		mov ecx,len //длинну храним в ecx
		xor eax,eax //обнуление регистров eax,ebx
		xor ebx,ebx

cycle1: 
		add eax,arr[ebx] //накапливаем сумму в eax
		add ebx,4 //увеличиваем счетчик
		loop cycle1;

		idiv eax,ecx
		mov edx,eax //помещаем среднее арифметическое в edx
cycle2:
		xor ebx,ebx
		mov eax,arr[ebx] 
		add ebx,4
		cmp eax,edx //сравниваем ср.арифм. и текущий элемент

		JG	point1 // если текущий элемент больше идем на метку 1
		JLE point2 // если текущий элемент меньше идем на метку 2
endcycle2:
		loop cycle2

		jmp quit
point1:
		mov narr[k1],eax //помещаем элемент в левую половину массива
		inc(k1) //смещаем индекс свободной позиции слева
		jmp endcycle2
point2:
		mov narr[k2],eax // помещаем элемент в правую половину массива
		dec(k2) // смещаем индекс свободной позиции спарава
		jmp endcycle2

quit:

}
ge4r
Сообщения: 13
Зарегистрирован: 19 янв 2009, 12:28

вопрос решен
Ответить