Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты по данной тематике Номер выпуска: | 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! Вот Вам программа. Будут вопросы, спрашивайте в мини-форуме. Но сначала постарайтесь разобраться самостоятельно.
Код : ;----------------------------------------------------------------- ;В сегменте данных задан массив из 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 Консультирует Зенченко Константин Николаевич (Модератор): Здравствуйте, Посетитель - 397588!
Смотрите приложение. Использованы только функции описанные в методичке. ps:вопросы задавайте в мини-форум. Удачи! Приложение:
Оценить выпуск | Задать вопрос экспертам главная страница | стать участником | получить консультацию техническая поддержка | восстановить логин/пароль Дорогой читатель! Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно! МЫ РАБОТАЕМ ДЛЯ ВАС! |
Комментариев нет:
Отправить комментарий