Вобщем понадобилось мне в моём же модуле вызвать функцию, но не с помощью call а с помощью jmp.... Адрес функции у меня естественно есть, но вот беда: 1) я не знаю как в случае jmp передать функции параметры 2) как заставить функцию корректно завершится по всем законам физики и вернутся туда откуда она была вызвана. конечно извращенски выглядит, но может подскажите хотябы в какую сторону копать? асм я знаю весьма относительно. А вышепреведённые манипуляции хочу сделать в Си программе.
Затолкать в обратном порядке параметры в стек, затем затолкать туда же адрес возврата (адрес инструкции, следующей за jmp). И делать себе jmp на здоровье. Код (Text): push param3 push param2 push param1 lea eax, _ret_addr push eax jmp my_func_addr _ret_addr:
Arisu Проще вызвать любую функцию с параметрами через call, остановиться в самом ее начале и посмотреть, что и в каком порядке лежит на стеке. Так будет тебе яснее. Ну а вообще, cresta уже все рассказал...
спасибо. про адрес возврата я как раз и не знал. но вот беда: как мне этот адрес узнать? ведь на пример если бы всё это происходило в пределах одного ассемблерного файла, то я бы мог воспользоватся меткой, но у меня не один и не ассемблейрный файл (как писал выше - пишу на Си). И метки стало быть из одного модуля в другой не видны. Как мне поступить ?
Arisu есть орехи Код (Text): /** *** **/ #include <stdio.h> int main() { const char * foo = "hello, fucking world!\n"; __asm { int 3 mov eax, printf push foo call $+5 x: pop ecx sub ecx, offset x add ecx, offset l push ecx jmp eax l: add esp, 4 } return 0; }
можно сделать функцию с таким же прототипом а в теле делать прыжок на нужнyю. что-то вроде Код (Text): void j_func(int a, int b) { __asm jmp func }
Arisu О какой видимости меток идёт речь? В стек помещается не метка, а число (адрес возврата). Метка же нужна, чтобы получить адрес, и используется она только в том месте, где происходит jmp. Поэтому тебя не должна заботить видимость метки. Там где нужно, она видима, а в твоей процедуре будет в стеке не метка, а число.