就像用來指向頁面目錄的CR3寄存器一樣。 Linux也使用分頁,並用C編寫,但C中如何使用這些寄存器(如何使用C選擇特定的寄存器)?C中如何使用寄存器?
回答
C語言無法訪問特定的處理器寄存器。這完全取決於編譯器。
要訪問特定的寄存器,您必須至少將這部分代碼寫入彙編器。
我的意思是你的回答沒有回答這個問題,你應該將它作爲評論發佈。 –
@MichaelWalz - 但它確實回答了這個問題。 OP在純C的範圍內詢問。純C不允許。因此,這是答案。短暫不會減損它。 – StoryTeller
@StoryTeller好的,也許我會刪除我的評論。 –
您所談論的寄存器不是該語言的屬性,而是您運行程序的硬件的屬性。我相信你在談論x86類型的硬件。 cr0-4和其他特定的regs是操作系統的一個屬性,由它管理,包括分頁表。
因此,該語言不提供訪問這些hw專用寄存器的方法。唯一的方法是編寫彙編代碼(特定於硬件)來操作它們。該語言提供的唯一東西是允許在程序中插入彙編代碼的asm()
運算符。
'__asm__ '是由特定實現提供的*擴展*;它不是標準C語言定義的一部分。 –
@JohnBode對,標準的是'asm()'。我修好了它。 – Serge
'asm'作爲一個通用擴展名在J.5.10下列出,但它不是核心語言或庫的一部分。正如J.5/1中所述:「以下擴展在許多系統中得到廣泛應用,但不適用於所有 實現。」 –
標準C不提供任何工具來直接訪問處理器寄存器。一些實現可能提供擴展,允許您將彙編代碼嵌入到您的C代碼中(例如gcc提供的asm
擴展)。一般來說,如果您需要直接訪問處理器寄存器(或其他特定於硬件的位置),則可以使用匯編器編寫該例程並將其鏈接到較大的程序中。
- 1. 如何在kprobe中使用寄存器?
- 2. 如何使用C/C++映射Modbus寄存器地址
- 3. C++ CPU寄存器的使用
- 4. 在C++中實現寄存器/取消寄存器模式
- 5. IA32-86使用專用寄存器作爲通用寄存器
- 6. 使用FPU和MMX寄存器作爲「通用寄存器」
- 7. 無效使用寄存器
- 8. 在SSE寄存器(GCC,C++)
- 9. 如何在Visual Studio中使用處理器寄存器?
- 10. 如何使用gdb獲取存儲在寄存器中的值? 「p/x $ ebx」因「沒有寄存器」而失敗。
- 11. XOR寄存器,寄存器(彙編)
- 12. C寄存器調用約定
- 13. 通用寄存器
- 14. 如何在LLVM中保留寄存器?
- 15. 在C++中使用寄存器變量可以做多少壞
- 16. 如何將AVX512寄存器zmm26中的QuadWord寫入rax寄存器?
- 17. 如何使用asp.net mvc在jqgrid中刪除多個寄存器?
- 18. 如何在gdb中使用python訪問寄存器
- 19. 如何在Cortex-m0中使用Hi(r8-r12)寄存器?
- 20. 如何使用臨時寄存器 - 返回後保存值?
- 21. 如何保存寄存器VIM
- 22. 如何用c語言初始化寄存器無符號長
- 23. 如何訪問c中的CPU寄存器?
- 24. 如何使用gdb轉儲ARM協處理器寄存器?
- 25. 如何使用github做網頁寄存
- 26. 寄存器JS
- 27. 在CPU寄存器中分配寄存器變量的標準?
- 28. MIPS中的浮點寄存器是哪些數字寄存器?
- 29. 爲什麼使用臨時寄存器將值傳遞給段寄存器?
- 30. 如何使用C/gcc從外設IO寄存器讀取數據?
如果您想直接使用寄存器,則需要使用匯編語言進行編碼。 –
以及宏如何初始化?(我的意思是我已經閱讀了一些宏來選擇寄存器),我還沒有看到Linux中的分頁源代碼中的彙編語言。該代碼如何工作? –
你正在努力達成什麼目標。通常情況下,你不需要在C中使用CPU寄存器,BTW C語言沒有指定如何訪問寄存器。但是許多編譯器都有擴展,允許您直接尋址CPU寄存器。 –