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

标签 c assembly arm elf

我能否通过在运行的 C 代码中生成有效的 native 可执行汇编指令来执行它?

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

最佳答案

安全地做你想做的事在技术上是不可能的;执行一条汇编指令。问题是“上下文”或机器状态。您需要像这样扩展 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这是一个试图保持性能并保证内存访问的概念。它也不像虚拟机那样受到专利保护(目前)。

关于c - ARM - 如何从 C 函数中执行单个汇编指令(机器代码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47209843/

相关文章:

assembly - 如何修复 "ld: warning: arm64 function not 4-byte aligned"警告?

assembly - 为什么 x86 和 ARM 之间的 GNU 语法不同?

适用于 iPhone 的 MySQL C API 库

c - 从长度未知的字符串中读取所有 double

macos - Mac OS X : YASM: error: macho: sorry, 无法在 64 模式下应用 32 位绝对重定位

c - Cstring 中的 Bool Palidrome 函数?

c - 为什么retarget.o归档到静态库中时,retarget.c中的 "_write"等函数没有链接?

assembly - ARM Cortex A8 基准测试 : can someone help me make sense of these numbers?

c - 每次调用后都会重置全局变量

c - 声明 Int 变量会导致段错误?