相关疑难解决方法(0)

如何在iPhone上进行内联汇编?

怎么做?我需要采取哪些步骤以及需要考虑哪些陷阱和陷阱?

iphone assembly inline-assembly

29
推荐指数
2
解决办法
1万
查看次数

Linux 2.6.35上的用户模式中ARM v7处理器缓存的清除和无效

我尝试清除ARM V7处理器高速缓存并使其无效,因为指令代码可以在执行时改变.

为了达到效果,我尝试了两种变体.他们来了:

  1. 我使用了GCC __clear_cache()函数但它没有给出必需的结果.缓存中的指令代码没有变化.

  2. 我查找了GCC的源代码,找到了uclinux-eabi.h文件,在那里我找到了清除缓存的下一个代码:

    /* Clear the instruction cache from `beg' to `end'.  This makes an
       inline system call to SYS_cacheflush.  */
    #undef CLEAR_INSN_CACHE
    #define CLEAR_INSN_CACHE(BEG, END)                                    \
    {                                                                     \
        register unsigned long _beg __asm ("a1") = (unsigned long) (BEG); \
        register unsigned long _end __asm ("a2") = (unsigned long) (END); \
        register unsigned long _flg __asm ("a3") = 0;                     \
        register unsigned long _scno __asm ("r7") = 0xf0002;              \
        __asm __volatile                                                  \
        (                                                                 \ …
    Run Code Online (Sandbox Code Playgroud)

linux arm

9
推荐指数
1
解决办法
1万
查看次数

如何在 ARM GCC 内联汇编中指定单个寄存器作为约束?

在 x86 内联汇编中,我可以这样写:

asm ("cpuid"
            : "=a" (_eax),
              "=b" (_ebx),
              "=c" (_ecx),
              "=d" (_edx)
            : "a" (op));
Run Code Online (Sandbox Code Playgroud)

所以在 matchin 约束中,而不是只写“=r”并让编译器选择寄存器,我可以说我想使用哪个特定的寄存器(=a 例如使用 %eax)

我怎样才能为 ARM 程序集做到这一点?ARM GCC 汇编手册http://www.ethernut.de/en/documents/arm-inline-asm.html指出,例如,我可以将约束“r”用于通用寄存器 R0-R15“w”之一" 对于 VFP 浮点寄存器 S0-S31 之一

但是我怎样才能将一个操作数限制在例如 s1 呢?或特定的通用寄存器?

gcc arm inline-assembly

5
推荐指数
1
解决办法
3561
查看次数

GCC 优化会损坏系统调用存根

GCC 的最新版本(包括版本 12)实现了过程间分析,该分析会严重损坏 ARM/Thumb 上系统调用存根的以下(仅限 GCC)代码。

typedef struct { int sender; int arg; } message;

#define syscall(op)  asm volatile ("svc %0" :: "i"(op))

#define SYS_SEND 9

#define NOINLINE __attribute((noinline))

void NOINLINE send(int dest, int type, message *msg)
{
    syscall(SYS_SEND);
}

void send_int(int d, int t, int v)
{
    message msg;
    msg.arg = v;
    send(d, t, &msg);
}
Run Code Online (Sandbox Code Playgroud)

目的是操作系统的陷阱处理程序将send通过访问参数寄存器的保存值来找到三个参数r0——r2在陷阱的异常帧中。问题显然是优化器在查看 的主体时send认为其消息参数的字段未被使用。msg.arg因此,主体中对 的赋值send_int被删除。这是通过编译上述源代码揭示的

arm-none-eabi-gcc -mcpu=cortex-m0 -mthumb -O -g -Wall -ffreestanding -c …
Run Code Online (Sandbox Code Playgroud)

c optimization gcc arm inline-assembly

2
推荐指数
1
解决办法
124
查看次数

将内联汇编代码插入 C 函数 - I/O 问题

我正在使用 GNU arm-none-eabi 工具链为我的 Cortex M3 微控制器开发嵌入式 C 应用程序。

我计划采用供应商在我的 C 应用程序中实现的汇编子例程。我计划创建一个新的 C 函数,然后在其中使用扩展内联汇编协议编写内联汇编块。在这篇文章中,我计划将此汇编子例程视为黑匣子,并计划向此论坛询问如何构建输入和破坏列表;该例程没有输出。

汇编子例程期望在调用之前预先设置 r0、r1 和 r2。此外,子例程使用寄存器 r4、r5、r6、r7、r8、r9 作为临时寄存器来执行其功能。它写入设备上的一系列内存,由 r0 和 r1 指定,分别是起始地址和停止地址。

所以,我正在检查我的假设是否正确。我的问题如下。

  1. 我认为我应该写的函数是这样的吗?:
void my_asm_ported_func(int reg_r0, int reg_r1, int reg_r2 {
    __asm__ __volatile__ (
        "ldr r0, %0        \n\t",
        "ldr r1, %1        \n\t",
        "ldr r2, %2        \n\t",
        "<vendor code...>  ",
        :  /* no outputs */
        : "r" (reg_r0), "r" (reg_r1), "r" (reg_r2) /* inputs */
        : "r0", "r1", "r2", "r4", "r5", "r6", 
          "r7", "r8", "r9", "memory" /* clobbers …
Run Code Online (Sandbox Code Playgroud)

c arm bare-metal inline-assembly cortex-m

1
推荐指数
1
解决办法
487
查看次数

标签 统计

arm ×4

inline-assembly ×4

c ×2

gcc ×2

assembly ×1

bare-metal ×1

cortex-m ×1

iphone ×1

linux ×1

optimization ×1