Найти позицию последнего вхождения числа M в массив A - Assembler

Узнай цену своей работы

Формулировка задачи:

Дан массив a и число m типа dword, найти позицию последнего вхождения числа m в массив a Постоянно выводит просто последний элемент, а не номер элемента.Помогите пожалуйста.
Листинг программы
  1. TITlE 11
  2. INCLUDE Irvine32.inc
  3. INCLUDELIB Irvine32.lib
  4. INCLUDELIB kernel32.lib
  5. .data
  6. a dword 1,2,3,4
  7. m dword 3
  8. .code
  9. main PROC
  10. mov ebx,m
  11. mov eax ,0
  12. MOV ESI ,offset a
  13. mov ecx ,lengthof a
  14. L1:cmp [esi],m
  15. jn L2
  16. L2: mov eax,esi
  17. add esi,type a
  18. LOOP L1
  19. call DumpRegs
  20. call WaitMsg
  21. main ENDP
  22. END main

Решение задачи: «Найти позицию последнего вхождения числа M в массив A»

textual
Листинг программы
  1. TITlE 11
  2. .386
  3. ; ######
  4. .model  flat, stdcall
  5. option  casemap :none       ; case sensitive
  6.     include \masm32\include\windows.inc
  7.     include \masm32\include\masm32.inc
  8.     include \masm32\include\msvcrt.inc
  9.     include \masm32\macros\macros.asm
  10.     includelib  \masm32\lib\masm32.lib
  11.     includelib  \masm32\lib\msvcrt.lib
  12. .data
  13. a   dd  1,2,3,4,7,6,5,9,3,6,2
  14. a_sz    =   ($ - a)/4
  15. m   dd  3
  16. tpt db  'index=%d',0
  17. .code
  18. main    PROC
  19.     push    ds
  20.     pop es
  21.     mov edi, a_sz
  22.     shl edi,2
  23.     add edi, offset a
  24.     mov eax, [m]
  25.     std
  26.     repe    scasd  
  27.     cld
  28.     sub edi, offset a
  29.     shr edi, 2
  30. ;   inc edi
  31.     invoke  crt_printf, addr tpt, edi
  32.     invoke  crt_exit,0
  33. main ENDP
  34. END main

Объяснение кода листинга программы

  1. .386 - Это версия ассемблера, которая указывает, что код написан для 32-битной системы.
  2. .model flat, stdcall - Это директивы компиляции, которые указывают, что модель памяти должна быть плоской (не фрагментированной), а вызовы функций должны быть стандартными (stdcall).
  3. option casemap:none - Эта директива отключает преобразование регистра символов, что означает, что все символы будут обрабатываться как есть.
  4. include \masm32\include\windows.inc - Эта строка включает в себя библиотеку Windows API.
  5. include \masm32\include\masm32.inc - Эта строка включает в себя некоторые макросы и константы, специфичные для MASM32.
  6. include \masm32\include\msvcrt.inc - Эта строка включает в себя библиотеку CRT (общие библиотеки).
  7. includelib \masm32\lib\masm32.lib - Эта строка включает в себя библиотеку MASM32.
  8. includelib \masm32\lib\msvcrt.lib - Эта строка включает в себя библиотеку CRT.
  9. .data - Это сегмент данных.
  10. a dd 1,2,3,4,7,6,5,9,3,6,2 - Это массив чисел.
  11. a_sz = ($ - a)/4 - Это вычисление длины массива.
  12. m dd 3 - Это число, которое мы ищем.
  13. tpt db 'index=%d',0 - Это строка, которая будет выведена на экран.
  14. .code - Это сегмент кода.
  15. main PROC - Это определение функции main.
  16. push ds - Это сохранение регистра данных.
  17. pop es - Это восстановление регистра данных.
  18. mov edi, a_sz - Это перемещение индекса массива в регистр edi.
  19. shl edi,2 - Это удвоение индекса массива.
  20. add edi, offset a - Это добавление смещения массива к индексу.
  21. mov eax, [m] - Это получение значения числа m в регистр eax.
  22. std - Это выход из функции main.
  23. repe scasd - Это повторение операции сравнения и поиска первого вхождения числа m в массиве.
  24. cld - Это переключение направления поиска.
  25. sub edi, offset a - Это вычитание смещения массива из индекса.
  26. shr edi, 2 - Это деление индекса на 2.
  27. inc edi - Это увеличение индекса на 1.
  28. invoke crt_printf, addr tpt, edi - Это вызов функции printf для вывода результата на экран.
  29. invoke crt_exit,0 - Это вызов функции exit для завершения программы.
  30. main ENDP - Это окончание определения функции main.
  31. END main - Это окончание программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы