2016-04-11 69 views
-2

我試圖理解在程序集中寫入代碼的語法,以便第一次正確寫入代碼並且第二次有效。 在這個例子中它示出了使用"=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平臺上提供任何見解。謝謝。

+0

你確定使用了兩個冒號嗎? ('::') – Jester

+0

請參閱[此鏈接到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)的鏈接。 –

+0

這不是程序集這是特定於一個編譯器的內聯程序集,基本上這是一個C/C++問題而不是程序集問題。 –

回答

1

發現在這本書的答案:https://books.google.com/books?id=Bl0_hWV20TAC&pg=PA370&lpg=PA370&dq=two+colon+%22::%22+in+assembly+language&source=bl&ots=Ha8EkNUJee&sig=p6v6iPOCYjBJdmBBVx2ZdxoRT2I&hl=en&sa=X&ved=0ahUKEwj8xcOElYnMAhVQ_WMKHR-JC7IQ6AEIRjAH#v=onepage&q=two%20colon%20%22%3A%3A%22%20in%20assembly%20language&f=false

If no output values are associated with the assembly code, the section must be blank, but two colons must still separate the assembly code from the input operands.

的,就是因爲這是標準的。一個冒號輸出和兩個輸入。