ARM - 如何从C函数中执行单汇编指令(机器码)

时间:2017-11-09 19:16:00

标签: c assembly arm elf

我可以通过在运行的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等。

这与我之前提出的问题有关:
 how to single-step code on-target with no jtag, breakpoints, simulator, emulator

1 个答案:

答案 0 :(得分:2)

技术上不可能安全地做你想做的事;执行单个汇编程序指令。问题是“上下文”或机器状态。您需要像这样扩展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'代码所依赖的寄存器。出于这个原因,大多数人组成他们自己的“虚拟机”并使机器语言更容易解码。由于您没有操作系统,因此很难想象您尝试执行现成的代码并在没有现有操作系统时使其工作的用例。为此,您将在每次调用时不断进行上下文切换。一次执行多个指令的解决方案将执行得更快,因为您不必使用每个指令保存/恢复上下文。

如果您有安全应用程序并且性能至关重要,我建议您调查proof carrying code这是一个尝试保持性能并保证内存访问的概念。它也不像虚拟机那样受到专利保护(目前)。