Звоните по известному адресу без регистрации - PullRequest
0 голосов
/ 06 февраля 2020

Итак, я создал библиотеку генерации кода JIT для C ++ и попытался написать с ней полезный код. Я довольно новичок в программировании на ассемблере, поэтому мне очень трудно все выяснить самостоятельно

Дело в том, что я создал компилятор Brainfuck-to-x64. Одна из инструкций Brainfuck (.) помещает символ в стандартный вывод: я реализовал его, получая адрес putchar на C ++ следующим образом:

#include <cstdio>
uint_least64_t putchar_address = (uint_least64_t)&std::putchar;

И затем генерируя код, который будет вызывать сохраненный адрес на r10, пример:

    movq   r10,     0x7ffe7ef1ab40
    ...
    call   r10

Это прекрасно работает, однако я подумал, что может быть способ перейти к этому адресу, не тратя впустую регистр через всю программу (а также нажимая / выдвигая регистр перед вызовом cdecl, потому что эти clobber r10, r11, et c)

Взглянув на скомпилированный код stdlib, вы увидите, что они используют такие вещи, как call qword ptr [0xsomeaddress]?

В основном мне нужно как-то жестко закодировать адрес вызова, если это возможно. Заранее спасибо!

...