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

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


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

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

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

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

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

Номер выпуска:1548
Дата выхода:26.10.2013, 20:30
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:45 / 23
Вопросов / ответов:1 / 2

Консультация # 187584: Уважаемые эксперты! Пожалуйста, ответьте на вопрос:Здравствуйте. Необходимо написать программу, которая удовлетворяет данному условию: В сегменте данных задан массив из 10 однобайтовых чисел. Написать процедуру вычисления среднего арифметического этих чисел. Результат вычисления вывести на монитор в символьной форме. Программа должна со...


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

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:Здравствуйте. Необходимо написать программу, которая удовлетворяет данному условию: В сегменте данных задан массив из 10 однобайтовых чисел. Написать процедуру вычисления среднего арифметического этих чисел. Результат вычисления вывести на монитор в символьной форме. Программа должна состоять из сегментов данных, кода и стека.

Нужно использовать 32-х разрядные API функции, 32-х разрядные регистры, предпочтительно использовать ассемблер MASM

Дата отправки: 23.10.2013, 19:54
Вопрос задал: Посетитель - 397588 (Посетитель)
Всего ответов: 2
Страница онлайн-консультации »


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

Здравствуйте, Посетитель - 397588!
Вот Вам программа. Будут вопросы, спрашивайте в мини-форуме.
Но сначала постарайтесь разобраться самостоятельно. smile

Код :
;-----------------------------------------------------------------
;В сегменте данных задан массив из 10 однобайтовых чисел. 
;Написать процедуру вычисления среднего арифметического этих чисел. 
;Результат вычисления вывести на монитор в символьной форме. 
;Программа должна состоять из сегментов данных, кода и стека.
;-----------------------------------------------------------------
	.386
;модел памяти и соглашение для передачи параметров, 
;необходимые для работы в среде Windows
model	flat, stdcall 
;различаем большие и малые буковки
option	casemap :none 

;подключаем необходимые inc-файлы
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
CalcMiddle	PROTO	:DWORD, :DWORD

;стек
	.stack	1024

;сегмент данных
	.data
;данные, считаем беззнаковыми
A	db	123, 23, 67, 0, 34, 45, 3, 2, 1, 35
lenA	equ	($-A)		;количество данных
sMiddle	db	'Middle = ',0	;строка для вывода
format	db	'%d',0ah,0	;формат для преобразования числа в строку

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

;выводим "Middle = "
	invoke	StdOut, addr sMiddle	

;считаем среднее арифметическое, результат в EAX
	invoke	CalcMiddle, addr A, lenA
	
;преобразуем число в строку
	invoke	wsprintf, addr buffer, addr format, eax
;выведем строку-число
	invoke	StdOut, addr buffer
;выход	
	invoke	ExitProcess, NULL
main	endp

;подсчет среднего арифметического
;параметры: адрес массива беззнаковых байт и длина массива
;результат в EAX
;используемые регистры EBX, ECX, EDX в начале сохраняются в стеке, 
;перед выходом восстанавливаются
CalcMiddle	proc uses ebx ecx edx, pArray:DWORD, iCount:DWORD
	mov	edx, pArray	;адрес массива
	mov	ecx, iCount	;его длина
	xor	eax, eax	;накапливаемая сумма
CalcSumLoop:
	movzx	ebx, byte ptr[edx]	;преобразовываем очередной байт в DWORD
	inc	edx		;смещаем адрес на следующий элемент
	add	eax, ebx	;накапливаем сумму
	loop	CalcSumLoop	;по всем
	cdq			;подготавливаемся к делению eax -> edx:eax
	div	iCount		;edx:eax / iCount, EAX - искомое среднее арифметическое
				;EDX - остаток, его мы отбрасываем
	ret
CalcMiddle	endp

;вывод строки на стандартное выходное устройство
;параметр - адрес строки
StdOut		proc lpszText:DWORD
;локальные переменные в стеке
LOCAL	hOutPut	:DWORD		;описатель стандартного выходного устройства
LOCAL	bWritten:DWORD		;количество выведенных символов
LOCAL	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

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

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


Консультирует Зенченко Константин Николаевич (Модератор):

Здравствуйте, Посетитель - 397588!

Смотрите приложение.
Использованы только функции описанные в методичке.
ps:вопросы задавайте в мини-форум.
Удачи!

Приложение:

Консультировал: Зенченко Константин Николаевич (Модератор)
Дата отправки: 24.10.2013, 17:32
Рейтинг ответа:

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


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

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

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



В избранное