корректный запуск своей же функции с помощью jmp. как?

Тема в разделе "WASM.BEGINNERS", создана пользователем Arisu, 10 авг 2007.

  1. Arisu

    Arisu Алиса Селезнёва

    Публикаций:
    0
    Регистрация:
    10 апр 2007
    Сообщения:
    89
    Вобщем понадобилось мне в моём же модуле вызвать функцию, но не с помощью call а с помощью jmp....

    Адрес функции у меня естественно есть, но вот беда:
    1) я не знаю как в случае jmp передать функции параметры
    2) как заставить функцию корректно завершится по всем законам физики и вернутся туда откуда она была вызвана.

    конечно извращенски выглядит, но может подскажите хотябы в какую сторону копать? асм я знаю весьма относительно. А вышепреведённые манипуляции хочу сделать в Си программе.
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Затолкать в обратном порядке параметры в стек, затем затолкать туда же адрес возврата (адрес инструкции, следующей за jmp). И делать себе jmp на здоровье.

    Код (Text):
    1. push param3
    2. push param2
    3. push param1
    4. lea eax, _ret_addr
    5. push eax
    6. jmp my_func_addr
    7. _ret_addr:
     
  3. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Arisu
    Проще вызвать любую функцию с параметрами через call, остановиться в самом ее начале и посмотреть, что и в каком порядке лежит на стеке. Так будет тебе яснее. Ну а вообще, cresta уже все рассказал...
     
  4. Arisu

    Arisu Алиса Селезнёва

    Публикаций:
    0
    Регистрация:
    10 апр 2007
    Сообщения:
    89
    спасибо. про адрес возврата я как раз и не знал.

    но вот беда: как мне этот адрес узнать? ведь на пример если бы всё это происходило в пределах одного ассемблерного файла, то я бы мог воспользоватся меткой, но у меня не один и не ассемблейрный файл (как писал выше - пишу на Си). И метки стало быть из одного модуля в другой не видны. Как мне поступить ?
     
  5. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Arisu
    есть орехи :)
    Код (Text):
    1. /**
    2. ***
    3. **/
    4.  
    5. #include <stdio.h>
    6.  
    7. int main() {
    8.   const char * foo = "hello, fucking world!\n";
    9.   __asm {
    10.     int 3
    11.     mov eax, printf
    12.     push foo
    13.     call $+5
    14. x:  pop ecx
    15.     sub ecx, offset x
    16.     add ecx, offset l
    17.     push ecx
    18.     jmp eax
    19. l:  add esp, 4
    20.   }
    21.   return 0;
    22. }
     
  6. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    можно сделать функцию с таким же прототипом а в теле делать прыжок на нужнyю. что-то вроде
    Код (Text):
    1. void j_func(int a, int b)
    2. {
    3.        __asm jmp func    
    4. }
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Arisu
    О какой видимости меток идёт речь? В стек помещается не метка, а число (адрес возврата). Метка же нужна, чтобы получить адрес, и используется она только в том месте, где происходит jmp. Поэтому тебя не должна заботить видимость метки. Там где нужно, она видима, а в твоей процедуре будет в стеке не метка, а число.