WMmail.ru - сервис почтовых рассылок

четверг, 17 ноября 2011 г.

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

 
Если выпуск не отображается, вы можете прочесть его на сайте Отказаться от рекламы
  
  
Дистанционные курсы немецкого. Все уровни. Пробные уроки бесплатно!
  
  
  

  Мои подписки      Мои группы      Мои новости     
        Автор 
Калашников О.А.
      
  
Компьютеры и интернет   →   Софт   →   Программирование   →   RFpro.ru: Ассемблер? Это просто! Учимся программировать
  
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 благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


 
 
Комментировать выпуск
     В избранное

Прошлые выпуски
RFpro.ru: Ассемблер? Это просто! Учимся программировать    14 ноября 2011, 20:33
RFpro.ru: Ассемблер? Это просто! Учимся программировать    09 ноября 2011, 14:34
RFpro.ru: Ассемблер? Это просто! Учимся программировать    05 ноября 2011, 06:33

Все выпуски рассылки
 
 

Subscribe рекомендует
 
Компьютеры и интернет  →   рассылки   и   группы
  
Новинки Компьютерных Игр
Обзоры последних игровых новинок. Лень покупать и листать игровые журналы? Не интересно толкаться в магазинах с играми? Не хочется ломать глаза, читая описание игры на обложке компакт-диска? Подпишитесь на рассылку!
Подписчиков: 27315
  Электронные книги, pdf и djvu, студентам, Интернет-бизнес.
Новости Электронных версий и копий книг по Информационным технологиям в форматах pdf и djvu, электронные учебно-методические пособия для студентов, идеи - как заработать в Интернет, кратко - об электронной коммерции.
Подписчиков: 1380
  Subscribe. Компьютеры
Дайджест лучших рассылок Subscribe.Ru из раздела Компьютеры, ПО и Интернет - самые интересные, актуальные факты и события, происходящие в мире Интернет, высоких технологий и компьютерного рынка.
Подписчиков: 200269
 
 
 
Подписан адрес: admin10383.deep@blogger.com
Код этой рассылки: comp.prog.assembler
Архив рассылки
Отписаться:  На сайте  Почтой
Поддержка подписчиков
Убрать рекламу
Другие рассылки этой тематики
Другие рассылки этого автора
 
Рассылка производится: Subscribe.Ru / ЗАО «Интернет-Проекты» / О компании / Политика конфиденциальности

Комментариев нет:

Отправить комментарий