Найти наименьшее в массиве из 10-ти двухбайтных чисел - Assembler
Формулировка задачи:
Помогите написать прогу . Дан массив из 10 двухбайтовых чисел. Найти среди них наименьшее и вывести на экран в символьной форме . Прога должна состоять из сегментов данных, кода и стека . Оченб надо . Спасибо
Решение задачи: «Найти наименьшее в массиве из 10-ти двухбайтных чисел»
textual
Листинг программы
.386 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\msvcrt.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\msvcrt.lib .data mas dw 142,138,214,596,745,124,5432,235,753,895 length_mas equ ($-mas)/2 msg db "min = %d",0 s db 60 dup(0) .code Main proc LOCAL hOutPut :DWORD ;хэндл для вывода LOCAL nWriten :DWORD ;напечатано байт invoke GetStdHandle, STD_OUTPUT_HANDLE mov hOutPut, eax xor ebx, ebx lea esi, mas mov ecx, length_mas mov bx, word ptr [esi] _l: lodsw cmp ax, bx jnb _no mov bx, ax _no: loop _l _out: invoke wsprintf, offset s, offset msg, ebx invoke lstrlen, addr s inc eax mov nWriten, eax invoke WriteConsole, hOutPut, addr s, nWriten, addr nWriten, NULL invoke ExitProcess,0 Main endp end Main
Объяснение кода листинга программы
- .386 - это идентификатор версии ассемблера.
- .model flat, stdcall - это описание модели памяти и сегментации кода.
- option casemap :none - это настройка соответствия регистровых и регистровых символов.
- include \masm32\include\windows.inc - это включение файла с определениями функций Windows API.
- include \masm32\include\user32.inc - это включение файла с определениями функций API пользовательского режима.
- include \masm32\include\kernel32.inc - это включение файла с определениями функций API ядра Windows.
- include \masm32\include\msvcrt.inc - это включение файла с определениями функций API стандартной библиотеки C.
- includelib \masm32\lib\user32.lib - это подключение библиотеки функций API пользовательского режима.
- includelib \masm32\lib\kernel32.lib - это подключение библиотеки функций API ядра Windows.
- includelib \masm32\lib\msvcrt.lib - это подключение библиотеки функций API стандартной библиотеки C.
- .data - это раздел данных.
- mas dw 142,138,214,596,745,124,5432,235,753,895 - это определение массива из 10 двухбайтных чисел.
- length_mas equ ($-mas)/2 - это вычисление длины массива.
- msg db
min = %d
,0 - это строка, которая будет выводиться на экран после нахождения минимума. - s db 60 dup(0) - это буфер для вывода.
- .code - это раздел кода.
- Main proc - это определение главной функции программы.
- invoke GetStdHandle, STD_OUTPUT_HANDLE - это получение дескриптора стандартного вывода.
- mov hOutPut, eax - это сохранение дескриптора в переменной.
- xor ebx, ebx - это обнуление рабочего регистра.
- lea esi, mas - это установка указателя на начало массива.
- mov ecx, length_mas - это установка счетчика длины массива.
- mov bx, word ptr [esi] - это загрузка первого элемента массива в рабочий регистр.
- _l: - это метка цикла.
- lodsw - это загрузка двухбайтного числа в рабочий регистр.
- cmp ax, bx - это сравнение текущего и предыдущего элементов массива.
- jnb _no - это переход к следующему элементу, если текущий больше предыдущего.
- mov bx, ax - это обновление предыдущего элемента.
- loop _l - это цикл до тех пор, пока не будут пройдены все элементы массива.
- _out: - это метка выхода из цикла.
- invoke wsprintf, offset s, offset msg, ebx - это форматирование строки с минимумом из массива.
- invoke lstrlen, addr s - это определение длины отформатированной строки.
- inc eax - это увеличение счетчика количества выведенных символов.
- invoke WriteConsole, hOutPut, addr s, eax, addr nWriten, NULL - это вывод отформатированной строки на экран.
- invoke ExitProcess,0 - это завершение работы программы.
- Main endp - это окончание определения главной функции программы.
- end Main - это завершение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д