簡體   English   中英

內聯匯編程序:可以使用哪些臨時寄存器?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM