C中内联汇编调用的返回值

问题描述 投票:0回答:1

我正在通过以下步骤实现棋盘算法:

  1. 将十六进制值0xAAAAAAAA移动到寄存器中
  2. 测试该值是否被写入
  3. 将十六进制值0x55555555移动到寄存器中
  4. 测试该值是否被写入

我需要使用内联汇编gcc调用,而且我很努力地将值从汇编返回到C(如果有任何不相等,则返回1,相等时,则返回0)。我无法在汇编中编写整个函数,这只是函数的一部分。感谢您的提前帮助!

int retval = 0;
    __asm__("mov %r0,$0xAAAAAAAA\n\t"
            "cmp %r0, 0xAAAAAAAA\n\t"
            "bne error\n\t"
            "mov %r0, $0x55555555\n\t"
            "cmp %r0, $0x55555555\n\t"
            "bne error\n\t"
            "mov (retval), $0\n\t"
            "b exit\n\t"
            "error:\n\t"
            "mov (retval), $1\n\t"
            "exit:\n\t"
    );
c gcc assembly arm inline
1个回答
0
投票

使用extended inline assembly

int retval;
__asm__("mov r0, #0xAAAAAAAA;"
        "cmp r0, #0xAAAAAAAA;"
        "bne .Lerror_%=;"
        "mov r0, #0x55555555;"
        "cmp r0, #0x55555555;"
        "bne .Lerror_%=;"
        "mov %0, #0;"
        ".Lerror_%=:;"
        "mov %0, #1;"
        : "=r"(retval) : : "r0");

请注意,代码仍然有缺陷:如果没有错误发生,您将不会在.Lerror_%=部分中跳转,因此retval最终将始终设置为1。它也不会在ARM模式下编译,您必须将编译器设置为Thumb模式,因为在ARM模式下不能像这样使用立即使用的立即数。

© www.soinside.com 2019 - 2024. All rights reserved.