Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Коцюрбенко Алексей aka Жерар
Статус: Профессор
Рейтинг: 2945
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2554
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2113
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1489
Дата выхода:17.11.2011, 12:00
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:189 / 61
Вопросов / ответов:1 / 1

Консультация # 184425: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: В массиве А[1..28] определить максимальное значение. Все элементы, лежащие до максимального, увеличить на первое значение массива, а все числа, после максимального, рассортировать по убыванию. Программу реализовать в виде четырех связок:...


Консультация # 184425:

Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
В массиве А[1..28] определить максимальное значение.
Все элементы, лежащие до максимального, увеличить на
первое значение массива, а все числа, после максимального,
рассортировать по убыванию.
Программу реализовать в виде четырех связок:
1. Ввод-вывод на языке высокого уровня, обработка на языке высокого уровня
2. Ввод-вывод на языке высокого уровня, обработка на языке низкого уровня
3. Ввод-вывод на языке низкого уровня, обработка на языке высокого уровня
4. Ввод-вывод на языке низкого уровня, обработка на языке низкого уровня
Т. е. требуется написать четыре программных модуля:
1. Ввод-вывод на языке высокого уровня
2. Обработка на языке высокого уровня
3. Ввод-вывод на языке низкого уровня
4. Обработка на языке низкого уровня

желательно побольше коментариев, можно делать C++ asm или Pas asm

Дата отправки: 12.11.2011, 11:40
Вопрос задал: Посетитель - 385274 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, Посетитель - 385274!
"Обработка на языке низкого уровня" - doAsm.asm

Код :
	.386
	.model	flat, stdcall
	option	casemap :none 

	.code

;самое маленькое целое число (для поиска максимума)
LONG_MIN	equ	-2147483648

;модуль на Ассемблере
;параметры - адрес массива dword-ов и их количество
public		doAsm
doAsm		proc	uses esi edi ebx, pInt:dword, count:dword
;ищем максимум
	mov	ebx, pInt	;адрес масива
	mov	ecx, count	;количество
	jcxz	doRet		;=0 - ничего не делаем
	xor	esi, esi	;индекс в массиве
	mov	edx, LONG_MIN	;max
maxLoop:
	mov	eax, [ebx+esi*4];очередной элемент
	cmp	eax, edx	;сравниваем
	jle	maxNext		;сохраняем, если больше максимального
	mov	edi, esi	;индекс
	mov	edx, eax	;значение
maxNext:
	inc	esi		;индекс следующего
	loop	maxLoop		;по всем

;прибавим к элементам до максимального значение первого
	mov	ecx, edi	;индекс максимального
	jcxz	sortAfter	;если первый, то ничего не делаем
	mov	eax, [ebx]	;первый
	xor	esi, esi	;индекс
addBefore:
	add	[ebx+esi*4],eax	;добавляем
	inc	esi		;на следующий
	loop	addBefore

;сортируем "пузырьком" по убыванию элементы за максимальным
sortAfter:
	lea	esi, [edi+1]	;начальный индекс области сортировки
	mov	ecx, count	;общее количество
	sub	ecx, esi	;ecx - число сортируемых элементов
	cmp	ecx, 2		;0 и 1 нет смысла сортировать
	jb	doRet
	dec	ecx		;число сравнений
sortLoop:			;цикл по поиску очередного минимального
	lea	edi, [esi+1]	;начинаем со следующего
	push	ecx		;сохраним счетчик
	mov	eax, [ebx+esi*4];текущий минимальный по индексу esi
searchMinLoop:			;цикл по всем последующим
;сравниваем текущий со всеми последующими
	cmp	eax, [ebx+edi*4];если текущий минимальный >= последующего,
	jge	sortNext	; то обходим обмен
;меняем местами элементы
	xchg	eax, [ebx+edi*4];меняем местами
	mov	[ebx+esi*4], eax;по индексу esi и в eax новый минимальный
sortNext:
	inc	edi		;на следующий последующий
	loop	searchMinLoop
	inc	esi		;на следующий текущий
	pop	ecx		;восстановим счетчик сравнений
	loop	sortLoop

doRet:
	ret
doAsm	endp

	end

"Обработка на языке высокого уровня" - doC.cpp
Код :
#define LONG_MIN    -2147483647

//то же самое, что и в модуле на Ассемблере
extern "C" void _stdcall doC(int * pInt, int count)
{
	int	max = LONG_MIN;
	int	i,j,k,idxMax;
	
	if (count)
	{
		//ищем максимальный
		for (i=0; i<count; i++)
		{
			if (pInt[i] > max)
			{
				idxMax = i;	//индекс максимального
				max = pInt[i];	//значение
			}
		}
		j = pInt[0];			//первый
		for (i=0 ; i<idxMax; i++)
			pInt[i] += j;		//добавляем первого до элементов слева
		//сортируем "пузырьком" элементы справа
		for (i=idxMax+1; i<count-1; i++)
		{
			for (j=i+1; j<count; j++)
			{
				if (pInt[i] < pInt[j])
				{
					k = pInt[i];
					pInt[i] = pInt[j];
					pInt[j] = k;
				}
			}
		}
	}
}

"Ввод-вывод на языке низкого уровня" - main.asm c вызовом модуля на Асм
(вызов модуля на С задается заменой вызова doAsm на doC)
Код :
	.386
model	flat, stdcall
option	casemap :none 

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

StdOut	PROTO	:DWORD
doAsm	PROTO	:DWORD, :DWORD

	.data
;данные
A	dd	123, -23, -567, 0, 234, 345, 34, 2, 1, 23, 9, 70, 91, 101
	dd	400, 76, -4, -45, 38, 55, 100, 0, 39, 12, 5, 8, 150, 17
lenA	equ	($-A)/4
sA	db	'A = ',0
format	db	'%d ',0
sEOL	db	0dh,0ah,0

	.code
main	proc
local	buffer[64]:byte			;буфер для преобразования числа в строку

	invoke	doAsm, addr A, lenA	;вызываем модуль на Asm
	invoke	StdOut, addr sA		;выводим "А = "
					;выводим все элементы массива
	mov	ecx, lenA		;длина массива
	xor	esi, esi		;индекс
printLoop:
	push	ecx
;преобразуем один элемент в строку
	invoke	wsprintf, addr buffer, addr format, dword ptr A[esi*4]
;выведем	
	invoke	StdOut, addr buffer
	inc	esi			;индекс слкдующего
	pop	ecx
	loop	printLoop		;по всем
	invoke	StdOut, addr sEOL	;перевод строки
	
	invoke	ExitProcess, NULL
main	endp

StdOut	proc lpszText:DWORD		;вывод строки на стандартное выходное устройство
LOCAL	hOutPut	:DWORD, bWritten:DWORD, len:DWORD

;получаем handle устройства
	invoke	GetStdHandle,STD_OUTPUT_HANDLE
	mov	hOutPut, eax

;получаем длину строки
	invoke	lstrlen,lpszText
	mov	len, eax

;выводим
	invoke	WriteFile,hOutPut,lpszText,len,ADDR bWritten,NULL

	mov eax, bWritten
	ret
StdOut	endp

	end	main

"Ввод-вывод на языке высокого уровня" - main.cpp c вызовом модуля на C
(вызов модуля на Asm задается заменой вызова doC на doAsm)
Код :
#include <stdio.h>

extern "C" void _stdcall doC(int *, int);

//массив
int	A[28] = {123, -23, -567, 0, 234, 345, 34, 2, 1, 23, 9, 70, 91, 101,
			 400, 76, -4, -45, 38, 55, 100, 0, 39, 12, 5, 8, 150, 17};

int	main()
{
	int	count = sizeof(A)/sizeof(int);	//число элементов
	doC(A, count);			//вызываем модуль на С
	
	printf ("A = ");		//выводим "А = "
	for(int i=0; i<count; i++)
	{
		printf("%d ",A[i]);	//выводим все элементы через пробел
	}
	printf("\n");
	return 0;
}


Все четыре проекта - Asm_Cpp.rar (11.3 кб)

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 14.11.2011, 18:19

5
нет комментария
-----
Дата оценки: 17.11.2011, 10:54

Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное