Найти позицию последнего вхождения числа 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

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

  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
Похожие ответы