[英]Inline Assembler: What scratch registers can be used?
將內聯匯編程序插入到類似C語言的函數中時,關於允許哪些寄存器用於臨時的約定是什么? 在進入asm
塊之前,編譯器是否有責任保存需要保存的所有寄存器的值? 程序員是否有責任將值存儲在這些寄存器中並在退出asm
塊之前恢復它們? 是否有典型的約定,或者這是特定於實現的?
根據定義,內聯匯編是特定於編譯器的。
大多數支持內聯匯編的編譯器都有一個語法,允許您指示程序集修改哪些寄存器。 然后,編譯器可以根據需要保存和恢復這些寄存器。
這是特定於編譯器的。 但是,對於一個現實的例子,讓我們在x86上使用gcc。 格式為:
asm ( assembler template
: output operands (optional)
: input operands (optional)
: list of clobbered registers (optional)
);
在“命令寄存器列表”中,您告訴編譯器您的代碼正在使用哪些寄存器。
這是一個簡單的內存復制代碼:
asm ("movl $count, %%ecx;
up: lodsl;
stosl;
loop up;"
: /* no output */
:"S"(src), "D"(dst) /* input */
:"%ecx", "%eax" ); /* clobbered list */
鑒於這些方向,gcc將不會將eax和ecx用於塊中的其他內容。
更多信息在這里 。
您可以在此處閱讀某些調用約定中的寄存器用法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.