ARM - 如何从 C 函数中执行单个汇编指令(机器代码)
ARM - how to execute single assembly instruction (machine code) from within a C function
我可以通过在 运行 C 代码中生成有效的本机可执行汇编指令来执行它吗?
void execute_single_asm_instruction(char * ptr_asm, int length)
{
// ptr_asm[] = valid assembly instruction
execute_asm(ptr, length);
}
可以写execute_asm
吗?
这是裸机 ARM 上的 运行,即 RTOS 是自定义的,不是 Linux、QNX、Windows 等
这与我之前的问题有关:
如何在没有 jtag、断点、模拟器、仿真器的情况下在目标上单步执行代码
安全地做你想做的事在技术上是不可能的;执行一条汇编指令。问题是 'context' 或机器状态。您需要像这样扩展 API,
extern void init_asm_context(void* context);
extern void execute_asm(void* context, char * ptr_asm, int length);
// context; global or declared.
// ptr_asm[] = valid assembly instruction
init_asm_context(&context);
execute_asm(&context, ptr, length);
问题在于任何汇编程序指令都可以随机更改 'C' 代码所依赖的寄存器。为此,大部分人自己编了'virtual machine',让机器语言更容易解码。由于您没有 OS,因此很难想出您尝试执行现成代码并在不存在 OS 的情况下使其工作的用例。为此,您将在每次调用时不断进行上下文切换。一次执行多条指令的解决方案将执行得更快,因为您不必 save/restore 上下文与 每个 指令。
如果您有一个安全应用程序并且性能很关键,我建议您研究一下 proof carrying code 这是一个试图保持性能并保证内存访问的概念。它也不像虚拟机那样受到专利保护(目前)。
我可以通过在 运行 C 代码中生成有效的本机可执行汇编指令来执行它吗?
void execute_single_asm_instruction(char * ptr_asm, int length)
{
// ptr_asm[] = valid assembly instruction
execute_asm(ptr, length);
}
可以写execute_asm
吗?
这是裸机 ARM 上的 运行,即 RTOS 是自定义的,不是 Linux、QNX、Windows 等
这与我之前的问题有关:
如何在没有 jtag、断点、模拟器、仿真器的情况下在目标上单步执行代码
安全地做你想做的事在技术上是不可能的;执行一条汇编指令。问题是 'context' 或机器状态。您需要像这样扩展 API,
extern void init_asm_context(void* context);
extern void execute_asm(void* context, char * ptr_asm, int length);
// context; global or declared.
// ptr_asm[] = valid assembly instruction
init_asm_context(&context);
execute_asm(&context, ptr, length);
问题在于任何汇编程序指令都可以随机更改 'C' 代码所依赖的寄存器。为此,大部分人自己编了'virtual machine',让机器语言更容易解码。由于您没有 OS,因此很难想出您尝试执行现成代码并在不存在 OS 的情况下使其工作的用例。为此,您将在每次调用时不断进行上下文切换。一次执行多条指令的解决方案将执行得更快,因为您不必 save/restore 上下文与 每个 指令。
如果您有一个安全应用程序并且性能很关键,我建议您研究一下 proof carrying code 这是一个试图保持性能并保证内存访问的概念。它也不像虚拟机那样受到专利保护(目前)。