簡體   English   中英

用絕對內存地址初始化指針

[英]Initializing a pointer with an absolute memory address

我正在我正在處理的自定義OS項目中實現puts(在屏幕上打印字符串)系統調用。 字符串的絕對內存地址由代表esi寄存器的unsigned int變量提供給我,我需要初始化一個指向unsigned char數組的指針以從中讀取字符串。

寄存器內容由以下內容表示:

struct regs
{
    unsigned int gs, fs, es, ds;
    unsigned int edi, esi, ebp, esp, ebx, edx, ecx, eax;
    unsigned int int_no, err_code;
    unsigned int eip, cs, eflags, useresp, ss;
};

我嘗試了以下方法來初始化指向esi地址的指針:

void fault_handler(struct regs *r) {
   void *p = (void*)r->esi;
   unsigned char* s = (unsigned char*)p;
   // take s and print it to the screen
}

但是我沒有得到我應該得到的“ Hello \\ n”,而是得到了垃圾。 我驗證了esi的地址確實指向正確的字符串。 我的問題是初始化指向該地址的指針。

謝謝!

更新:我將關閉此問題並將討論移至新問題,因為原始答案已得到回答。 謝謝大家!

您的代碼正確地將esi分配給p,然后分配給s。 因此,我只能假設您的問題實際上與該步驟無關。

順便說一句,我不明白為什么需要p,只需將esi直接分配給s。

這段代碼還可以,正如@David Heffernan所說,沒有使用p 你可以簡單地直接分配esis 您已經檢查了地址,但是請檢查段寄存器值(實模式)/段選擇器(保護模式),確保段寄存器值正確,並且在處理程序中時, esi的地址與同一段一起使用,以及描述字符串的位置。 可能會有所幫助。

正如其他人指出的那樣,您可以立即使用r->esi初始化s ,而無需中間變量p 雖然需要強制類型轉換,所以初始化應該看起來像是unsigned char* s = (unsigned char *) r->esi;

但是,關於代碼的某些事情引起了些許懷疑。 寄存器名稱看起來像x86平台上的32位寄存器的名稱。 您的指針也是32位嗎? 即您將代碼編譯為32位代碼?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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