[英]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
。 你可以簡單地直接分配esi
給s
。 您已經檢查了地址,但是請檢查段寄存器值(實模式)/段選擇器(保護模式),確保段寄存器值正確,並且在處理程序中時, esi
的地址與同一段一起使用,以及描述字符串的位置。 可能會有所幫助。
正如其他人指出的那樣,您可以立即使用r->esi
初始化s
,而無需中間變量p
。 雖然需要強制類型轉換,所以初始化應該看起來像是unsigned char* s = (unsigned char *) r->esi;
。
但是,關於代碼的某些事情引起了些許懷疑。 寄存器名稱看起來像x86平台上的32位寄存器的名稱。 您的指針也是32位嗎? 即您將代碼編譯為32位代碼?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.