LDSET ARM指令作为内联汇编

时间:2017-11-24 11:35:52

标签: c++ assembly inline-assembly

我正在尝试使用Atomic LDSET ARM指令(http://www.keil.com/support/man/docs/armclang_asm/armclang_asm_chi1476202820379.htm)作为C中的内联汇编代码,但不知怎的,我无法弄清楚正确的操作数。 我写了这个

int value = 1024; //operate on this value
int setBit = 7; //set the 7th bit
int initValue = 0; //return the original value in this
asm("ldset %w0, %w2, %x1" : "+r"(value), "=r"(initValue) : "r"(setBit));

并收到此错误:

test-lib.cpp:26:9: error: invalid operand for instruction
  asm("ldset %w0, %w2, %x1" : "+r"(value), "=r"(initValue) : "r"(setBit));
      ^
<inline asm>:1:17: note: instantiated into assembly here
      ldset w9, w10, x10
                     ^

请为此提供一些帮助。

1 个答案:

答案 0 :(得分:2)

根据page you linked,第三个操作数必须是内存引用,而第一个操作数只使用一个没有偏移量的寄存器。 Q constraint is for specifically this purpose,请尝试:

stop_writing_id = ''  # store id of the scheduled call to traduire

def stop_writing(event):
    global stop_writing_id
    main.after_cancel(stop_writing_id)  # cancel previous scheduling of traduire
    stop_writing_id = main.after(1000, traduire)  # wait 1s and execute traduire

这应该会产生类似asm("ldset %w0, %w2, %1" : "+r"(value), "=Q"(initValue) : "r"(setBit)); 的内容。