[英]asm instruction alternative in c program
我正在編寫一個用戶空間C程序來讀取硬盤。
我需要將匯編指令轉換為C程序代碼。 如何才能做到這一點?
mov eax, [rsi+0x0C]
這里eax
可以是任何變量。 但是, rsi
是值為0xc1617000
的基地址寄存器。 該值不變。
您可以在C中為指針分配值。請嘗試以下操作:
uint8_t *rsi = (uint8_t*)(uintptr_t) 0xc1617000; // The uintptr_t cast isn't really needed, but might help portability.
uint32_t value = *(uint32_t *)(rsi + 0x0C);
較短的版本,當然是:
uint32_t value = *(uint32_t *)0xc161700C;
基本上,您可以將該常量解釋為指向uint32_t
的指針,然后取消對其的引用。
遵循http://www.cs.virginia.edu/~evans/cs216/guides/x86.html :
mov eax, [rsi+0x0C]
手段
將地址rsi+0x0C
的4字節字移到EAX
寄存器
這就是匯編程序這一行的意思; 你說
這里eax可以是任何變量
通常,EAX是某些函數的返回值,但我將不再贅述。
由於這很簡單:
int variable = *((unsigned int*) 0xc161700C;
請注意,是否實際復制該值完全取決於您的編譯器-在許多情況下,僅當實際使用variable
的值時,編譯器才能夠這樣做。 如果詢問variable
的地址,則可能是獲得一個新地址,或者實際上是0xc161700C
。
由於這是基本的C語言,因此我不太確定要讓您使用我的硬盤驅動器;)請注意,對於以非特權(非內核模式)運行的程序,通常無法訪問物理內存地址。
編輯
在linux上,訪問該位置時程序崩潰。 可能是因為它超出了進程內存的范圍。 任何想法如何訪問進程內存范圍之外的內存
如我在這里和評論中所述:如果您的代碼作為程序運行(在userland中 ),則您永遠無法訪問原始物理內存地址。 您的進程看到了自己的內存,並且物理內存被映射到頁面中-如果沒有內核模式的幫助,就不可能訪問原始物理內存。 這就是在任何現代CPU上完成的內存映射的美妙之處:程序無法直接與硬件打交道。
在Linux下,事情可能相對容易:以root身份打開或mmap
/dev/mem
並訪問該文件中的正確位置-這是對操作系統直接訪問內存的直接模擬。
但是,您正在做的事情很危險,Linux通常已經盡可能多地支持AHCI -您確定您已經使用了最近十年的linux內核嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.