当前位置: 首页 > 知识库问答 >
问题:

如何在asm内联语句中请求通用寄存器?

翁凯定
2023-03-14
asm("load_immediate_value %%r5,0;"
    /* ... */
    "add_immediate_value %%r5,%%r5,42"
    /* ... */
    :
    :
    : "r5");

在本例中,我选择register r5,并通过clobber列表告诉gcc我正在使用它。但是如果r5是ABI寄存器呢?!我需要一种方法,简单地要求一个登记册,而不需要自己命名。

共有1个答案

田志尚
2023-03-14

通常这样做的方式是:

static __inline__ void set_archctrl0(unsigned long val) {
    register unsigned long archctrl0 __asm__("archctrl0") = val;

    __asm__ __volatile__("" : "+r"(archctrl0) : : "cc", "memory");
}

空的asm语句的存在只是为了迫使编译器不优化整个过程。

或者,一个更实际的示例,读取stackpointer寄存器可以执行如下操作:

static __inline__ void * getSP(void) {
    register void * sp asm("sp");
    asm ("" : "=r"(sp));
    return sp;
}
static __inline__ void set_archctrl0(unsigned long val) {
    __asm__ __volatile__("setarchctrl0 %0" : : "r"(val) : "cc", "memory");
}
 类似资料:
  • 问题内容: 如何在JavaScript中使用内联语句?是否也有内联语句? 像这样: 问题答案: 您不一定需要jQuery。仅JavaScript就能做到这一点。 该变量将是如果该值,并且如果该值是。 这称为条件(三元)运算符。

  • 我正在为一个操作系统分配编写内联汇编代码。我有一些关于内联汇编和gcc编译器将其转换为机器代码的问题。 null

  • 我正在尝试同时处理MSVC和GCC编译器,同时更新这个代码库以在GCC上工作。但我不确定GCCs内联ASM是如何工作的。现在我并不擅长将ASM转换为C,否则我就会使用C而不是ASM。 我假设ROR13的工作方式类似于,但代码不会产生相同的输出。 什么是将这个内联ASM翻译成GCC的正确方法,或者这个代码的C翻译是什么?

  • 6.1.2 段寄存器的说明语句 在汇编语言源程序中可以定义多个段,每个段都要与一个段寄存器建立一种对应关系。建立这种对应关系的说明语句格式如下: ASSUME 段寄存器名:段名[,段寄存器名:段名, ……] 其中:段寄存器是CS、DS、ES、SS、FS和GS,段名是在段定义语句说明时的段名。 在一条ASSUME语句中可建立多组段寄存器与段之间的关系,每种对应关系要用逗号分隔。例如, ASSUME