可以訪問C中的32位寄存器嗎?如果是,如何?如果沒有,那麼是否有任何方法將彙編代碼嵌入到C中?順便說一句,我使用MinGW編譯器。 在此先感謝!是否可以訪問C中的32位寄存器?
回答
可用在C嵌入組件,其從維基
的extern INT錯誤號
http://en.wikipedia.org/wiki/Inline_assembler
例子;
int funcname(int arg1, int *arg2, int arg3)
{
int res;
__asm__ volatile(
"int $0x80" /* make the request to the OS */
: "=a" (res) /* return result in eax ("a") */
"+b" (arg1), /* pass arg1 in ebx ("b") */
"+c" (arg2), /* pass arg2 in ecx ("c") */
"+d" (arg3) /* pass arg3 in edx ("d") */
: "a" (128) /* pass system call number in eax ("a") */
: "memory", "cc"); /* announce to the compiler that the memory and condition codes have been modified */
/* The operating system will return a negative value on error;
* wrappers return -1 on error and set the errno global variable */
if (-125 <= res && res < 0) {
errno = -res;
res = -1;
}
return res;
}
我不認爲你可以直接做。您可以做內聯彙編有類似的代碼:
asm (
"movl $0, %%ebx;"
"movl $1, %%eax;"
);
如果你是一個32位處理器,並使用適當的編譯器,那麼肯定的。確切的手段取決於你正在編程的特定系統和編譯器,當然這會使你的代碼變得不可移植。
在使用MinGW的情況下,您應該看看GCC's inline assembly syntax。
謝謝很多鏈接!很有用。 – C4theWin 2010-06-11 14:20:46
你想訪問哪些寄存器?
通用寄存器通常不能從C中訪問。您可以在函數中聲明寄存器變量,但不指定使用哪個特定的寄存器。此外,大多數編譯器會忽略register關鍵字並自動優化寄存器使用情況。
在嵌入式系統中,通常需要訪問外設寄存器(如定時器,DMA控制器,I/O引腳)。這樣的寄存器通常是存儲器映射的,因此它們可以由C被訪問...
通過定義一個指針:
volatile unsigned int *control_register_ptr = (unsigned int*) 0x00000178;
,或者使用預處理器:
#define control_register (*(unsigned int*) 0x00000178)
或者,您可以使用匯編程序。
對於使用彙編語言,有(至少)三種可能性:
- 與所述節目鏈接的單獨.ASM源文件。像常規函數一樣從C調用匯編例程。這可能是最常用的方法,它具有hw依賴函數與應用程序代碼分開的優點。
- 聯機彙編
- 執行單個彙編語言指令的內部函數。這具有彙編語言指令可以直接訪問任何C變量的優點。
你怎麼能得到0x00000178號碼? – Garmekain 2016-09-05 17:21:42
- 1. 是否可以從SRTM訪問TPM的本地2寄存器?
- 2. 是否可以使用C++訪問CPU中的溢出標誌寄存器?
- 3. 負載32位寄存器
- 4. 32位寄存器將64位分成兩個32位寄存器
- 5. 是否可以在實模式下使用32位寄存器/指令?
- 6. 是否可以從32位應用程序訪問64位dll?
- 7. 32位寄存器作爲8位寄存器
- 8. 將兩個x86 32位寄存器存儲到128位xmm寄存器中
- 9. 32位架構的DS段寄存器
- 10. 從DX:AX寄存器移動到單個32位寄存器
- 11. 是否有可能訪問CPU寄存器,如LR,PC
- 12. (Assembly newbie)無法從GDB訪問x86-64中的32位寄存器
- 13. 訪問32位內存地址c#
- 14. 是否可以通過內聯彙編訪問硬件寄存器
- 15. 是否可以使用64位Python解釋器的32位ctypes?
- 16. 32位寄存器的範圍是如何定義的?
- 17. 是否與非相鄰的寄存器進行32位寫操作?
- 18. 展位乘法器在64位寄存器的高32位中放置1
- 19. 是否可以訪問WebView緩存?
- 20. 32位MCU的數據線是否可以超過32?
- 21. 零輸出64位寄存器的前32位
- 22. 大會:與32位寄存器的64位乘法
- 23. 在32位窗口下的64位寄存器
- 24. 在保護模式x86下可以訪問16位寄存器嗎?
- 25. 訪問移位寄存器中的最新數據
- 26. 在實模式和解引用中的32位寄存器
- 27. NASM - 如何將8位寄存器移動到完整的32位寄存器中?
- 28. 如何取消存儲在32位寄存器對中的64位整數?
- 29. 是否可以在bash腳本中檢測32位與64位?
- 30. 使用32位而不是64位來減少寄存器的數量
告訴我們更多關於您的需求:您爲什麼要訪問CPU寄存器? – 2010-06-11 10:46:24
你可以使用GetThreadContext和它的兄弟SetThreadContext間接獲取和設置窗口上的寄存器,不需要任何asm:http://msdn.microsoft.com/en-us/library/ms679362%28VS.85%29.aspx – Necrolis 2010-06-13 07:06:44