gpt4 book ai didi

c - 将 GCC 内联汇编与采用立即值的指令一起使用

转载 作者:太空狗 更新时间:2023-10-29 16:46:09 26 4
gpt4 key购买 nike

问题

我正在为 ARM Cortex-M3 处理器开发自定义操作系统。要与我的内核交互,用户线程必须生成一个 SuperVisor Call (SVC) 指令(以前称为 SWI,用于软件中断)。这条指令在ARM ARM中的定义是:

enter image description here

这意味着该指令需要一个立即数 参数,而不是寄存器值。

这让我很难以可读的方式构建我的界面。它需要如下代码:

asm volatile( "svc #0");

当我更喜欢类似的东西时

svc(SVC_YIELD);

但是,我无法构造这个函数,因为 SVC 指令需要立即参数,而当值通过寄存器传入时我无法提供。

内核:

作为背景,svc指令在内核中解码如下

#define SVC_YIELD   0
// Other SVC codes

// Called by the SVC interrupt handler (not shown)
void handleSVC(char code)
{
switch (code) {

case SVC_YIELD:
svc_yield();
break;
// Other cases follow

这个案例陈述很快就失控了,但我看不出有什么办法可以解决这个问题。欢迎提出任何建议。

我尝试过的

带有寄存器参数的 SVC

我最初考虑过

__attribute__((naked)) svc(char code)
{
asm volatile ("scv r0");
}

但这当然行不通,因为 SVC 需要寄存器参数。

蛮力

解决问题的蛮力尝试如下所示:

void svc(char code)
switch (code) {
case 0:
asm volatile("svc #0");
break;
case 1:
asm volatile("svc #1");
break;
/* 253 cases omitted */
case 255:
asm volatile("svc #255");
break;
}
}

但是那有一股难闻的代码味道。这当然可以做得更好。

动态生成指令编码

最后的尝试是在 RAM 中生成指令(其余代码从只读闪存运行)然后运行它:

void svc(char code)
{
asm volatile (
"orr r0, 0xDF00 \n\t" // Bitwise-OR the code with the SVC encoding
"push {r1, r0} \n\t" // Store the instruction to RAM (on the stack)
"mov r0, sp \n\t" // Copy the stack pointer to an ordinary register
"add r0, #1 \n\t" // Add 1 to the address to specify THUMB mode
"bx r0 \n\t" // Branch to newly created instruction
"pop {r1, r0} \n\t" // Restore the stack
"bx lr \n\t" // Return to caller
);
}

但这也感觉不对。此外,它不起作用 - 我在这里做错了什么;也许我的指令没有正确对齐,或者我没有设置处理器以允许在此位置从 RAM 运行代码。

我该怎么办?

我必须处理最后一个选项。但是,感觉我应该能够做类似的事情:

__attribute__((naked)) svc(char code)
{
asm volatile ("scv %1"
: /* No outputs */
: "i" (code) // Imaginary directive specifying an immediate argument
// as opposed to conventional "r"
);
}

但我没有在文档中找到任何此类选项,而且我无法解释如何实现此类功能,因此它可能不存在。我应该怎么做?

最佳答案

您想使用约束来强制将操作数分配为 8 位立即数。对于 ARM,这是约束 I。所以你想要

#define SVC(code) asm volatile ("svc %0" : : "I" (code) )

有关所有约束的摘要,请参阅 GCC 文档——您需要查看特定于处理器的注释以了解特定平台的约束。在某些情况下,您可能需要查看 gcc 源中体系结构的 .md(机器描述)文件以获取完整信息。

还有一些很好的特定于 ARM 的 gcc 文档 here .在“输入和输出操作数”标题下的几页中,它提供了所有 ARM 约束的表格

关于c - 将 GCC 内联汇编与采用立即值的指令一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11377453/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com