我試圖理解在程序集中寫入代碼的語法,以便第一次正確寫入代碼並且第二次有效。 在這個例子中它示出了使用"=r"
::「r」vs:「= r」程序集說明
asm volatile ("MRS %0, PMUSERENR_EL0\n": "=r"(value));
此讀入值的變量寄存器,並將其存儲的值的例子。另一示例使用::"r"
asm volatile ("MSR PMUSERENR_EL0, %0\n":: "r"(value));
此寫入值變量設置爲PMUSERENR_ELO寄存器。這是另一個例子:How to measure program execution time in ARM Cortex-A8 processor?。
當我試圖編譯一個簡單的測試代碼與上述兩個命令我得到的錯誤::9:2: error: output operand constraint lacks '='
如果我添加「=」並刪除一個「:」它會編譯,但是當我測試它時,它只是說Illegal instruction
如果有人可以請解釋一下會有幫助的區別,許多程序集教程顯示的格式相同但沒有解釋。它在64位的arm平臺上提供任何見解。謝謝。
你確定使用了兩個冒號嗎? ('::') – Jester
請參閱[此鏈接到GNU C inline asm的集合](http://stackoverflow.com/questions/34520013/using-base-pointer-register-in-c-inline-asm/34522750# 34522750),包括解釋輸入與輸出約束的[官方gcc文檔](https://gcc.gnu.org/onlinedocs/gcc/Using-Assembly-Language-with-C.html)的鏈接。 –
這不是程序集這是特定於一個編譯器的內聯程序集,基本上這是一個C/C++問題而不是程序集問題。 –