Почему при передаче параметров в функцию через стек помимо указанных параметров появляется адрес?

Тема в разделе "WASM.BEGINNERS", создана пользователем 2Hard2Forget, 31 июл 2021.

  1. 2Hard2Forget

    2Hard2Forget Member

    Публикаций:
    0
    Регистрация:
    27 авг 2018
    Сообщения:
    86
    Изучаю MASM по книге Кипа Ирвина. В 8 главе вводится директива INVOKE (помимо call) для вызова функции и более удобной передачи параметров через стек. Далее в главе приводится пример:

    Код (ASM):
    1. TITLE      (.asm)
    2.  
    3. ; This program
    4. ; Last update:
    5.  
    6. INCLUDE Irvine32.inc
    7. .data
    8.     array DWORD 10000h,20000h,30000h,40000h,50000h
    9.     theSum DWORD ?
    10. .code
    11. ArraySum PROTO,
    12.             ptrArray:PTR DWORD,
    13.             szArray:DWORD
    14. main PROC
    15.  
    16.     INVOKE ArraySum,
    17.                     ADDR array,
    18.                     LENGTHOF array
    19.     mov theSum,eax
    20.  
    21.  
    22.  
    23.     exit
    24. main ENDP
    25.  
    26. ArraySum PROC USES esi ecx,
    27.             ptrArray:PTR DWORD,
    28.             szArray:DWORD
    29.      
    30.         mov eax,0
    31.         mov esi,ptrArray
    32.         mov ecx,szArray
    33.         cmp ecx,0
    34.         je L2
    35.     L1:
    36.         add eax,[esi]
    37.         add esi,4
    38.         loop L1
    39.     L2:
    40.         ret
    41. ArraySum ENDP
    42.  
    43.  
    44.  
    45. END main
    В момент вызова функции ArraySum из main смотрю как добавляются параметры и адрес возврата из функции. Регистры при этом выглядят так:
    EAX = 0019FFCC EBX = 00399000 ECX = 0040100A EDX = 0040100A ESI = 0040100A EDI = 0040100A EIP = 00401038 ESP = 0019FF68 EBP = 0019FF80 EFL = 00000246
    OV = 0 UP = 0 EI = 1 PL = 0 ZR = 1 AC = 0 PE = 1 CY = 0
    А дамп памяти при этом выглядит так (справа на лево: второй аргумент,первый аргумент и адрес возврата):


    upload_2021-7-31_22-53-15.png



    Потом пушатся два регистра(esi ecx) (из-за USES), но вдруг появляется какой-то непонятный адрес(подчёркнут синим):


    upload_2021-7-31_22-58-3.png






    Откуда взялся этот адрес(подчёркнутый)? Я нашел его в дизассемблере и команда по этому адресу выглядит вот так:
    0019FF80 fdiv st(7),st
    Почему этот адрес появляется при передачи параметров функции?
     

    Вложения:

  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Это значение ebp, которое попало в стек через пролог процедуры "push ebp+"mov ebp,esp". Значение сохраняется в стеке, а в ebp помещается указатель на буфер локальных переменных. Потом возвращается как было инструкцией leave. В этой процедуре локальных переменных нету и как бы оно и не надобно здесь по идее, но видимо макрос proc так устроен.
     
    M0rg0t нравится это.
  3. 2Hard2Forget

    2Hard2Forget Member

    Публикаций:
    0
    Регистрация:
    27 авг 2018
    Сообщения:
    86
    Спасибо, увидел в дизассемблере:
    ArraySum PROC USES esi ecx,
    00401038 push ebp
    00401039 mov ebp,esp
    0040103B push esi
    0040103C push ecx
    ptrArray:PTR DWORD,
    szArray:lol: WORD
     
  4. LastNoob

    LastNoob Member

    Публикаций:
    0
    Регистрация:
    28 янв 2018
    Сообщения:
    80
    Это же адрес возврата, вроде...
     
  5. R81...

    R81... Active Member

    Публикаций:
    0
    Регистрация:
    1 фев 2020
    Сообщения:
    141
    В исходнике директиву .LISTALL , после трансляции смотреть в листинг.