我正在尝试使用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
^
请为此提供一些帮助。
答案 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));
的内容。