Найти позицию последнего вхождения числа 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 - Это окончание программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д