簡體   English   中英

C程序中的asm指令替代

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

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