Итак, я создал библиотеку генерации кода 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]
?
В основном мне нужно как-то жестко закодировать адрес вызова, если это возможно. Заранее спасибо!