Найти позицию последнего вхождения числа M в массив A - Assembler
Формулировка задачи:
Дан массив a и число m типа dword, найти позицию последнего вхождения числа m в массив a
Постоянно выводит просто последний элемент, а не номер элемента.Помогите пожалуйста.
TITlE 11 INCLUDE Irvine32.inc INCLUDELIB Irvine32.lib INCLUDELIB kernel32.lib .data a dword 1,2,3,4 m dword 3 .code main PROC mov ebx,m mov eax ,0 MOV ESI ,offset a mov ecx ,lengthof a L1:cmp [esi],m jn L2 L2: mov eax,esi add esi,type a LOOP L1 call DumpRegs call WaitMsg main ENDP END main
Решение задачи: «Найти позицию последнего вхождения числа M в массив A»
textual
Листинг программы
TITlE 11 .386 ; ###### .model flat, stdcall option casemap :none ; case sensitive include \masm32\include\windows.inc include \masm32\include\masm32.inc include \masm32\include\msvcrt.inc include \masm32\macros\macros.asm includelib \masm32\lib\masm32.lib includelib \masm32\lib\msvcrt.lib .data a dd 1,2,3,4,7,6,5,9,3,6,2 a_sz = ($ - a)/4 m dd 3 tpt db 'index=%d',0 .code main PROC push ds pop es mov edi, a_sz shl edi,2 add edi, offset a mov eax, [m] std repe scasd cld sub edi, offset a shr edi, 2 ; inc edi invoke crt_printf, addr tpt, edi invoke crt_exit,0 main ENDP END main
Объяснение кода листинга программы
- .386 - Это версия ассемблера, которая указывает, что код написан для 32-битной системы.
- .model flat, stdcall - Это директивы компиляции, которые указывают, что модель памяти должна быть плоской (не фрагментированной), а вызовы функций должны быть стандартными (stdcall).
- option casemap:none - Эта директива отключает преобразование регистра символов, что означает, что все символы будут обрабатываться как есть.
- include \masm32\include\windows.inc - Эта строка включает в себя библиотеку Windows API.
- include \masm32\include\masm32.inc - Эта строка включает в себя некоторые макросы и константы, специфичные для MASM32.
- include \masm32\include\msvcrt.inc - Эта строка включает в себя библиотеку CRT (общие библиотеки).
- includelib \masm32\lib\masm32.lib - Эта строка включает в себя библиотеку MASM32.
- includelib \masm32\lib\msvcrt.lib - Эта строка включает в себя библиотеку CRT.
- .data - Это сегмент данных.
- a dd 1,2,3,4,7,6,5,9,3,6,2 - Это массив чисел.
- a_sz = ($ - a)/4 - Это вычисление длины массива.
- m dd 3 - Это число, которое мы ищем.
- tpt db 'index=%d',0 - Это строка, которая будет выведена на экран.
- .code - Это сегмент кода.
- main PROC - Это определение функции main.
- push ds - Это сохранение регистра данных.
- pop es - Это восстановление регистра данных.
- mov edi, a_sz - Это перемещение индекса массива в регистр edi.
- shl edi,2 - Это удвоение индекса массива.
- add edi, offset a - Это добавление смещения массива к индексу.
- mov eax, [m] - Это получение значения числа m в регистр eax.
- std - Это выход из функции main.
- repe scasd - Это повторение операции сравнения и поиска первого вхождения числа m в массиве.
- cld - Это переключение направления поиска.
- sub edi, offset a - Это вычитание смещения массива из индекса.
- shr edi, 2 - Это деление индекса на 2.
- inc edi - Это увеличение индекса на 1.
- invoke crt_printf, addr tpt, edi - Это вызов функции printf для вывода результата на экран.
- invoke crt_exit,0 - Это вызов функции exit для завершения программы.
- main ENDP - Это окончание определения функции main.
- END main - Это окончание программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д