當前位置:首頁 » 存儲配置 » 讀取0X0處存儲的值

讀取0X0處存儲的值

發布時間: 2022-06-23 16:06:39

c語言中如何讀取一個已知地址中存儲的變數

直接用
(char*)(0x000)
補充一下,不同類型的變數占的存儲單元(位元組)是不同的,char*只是該位元組的值,而int*則是該位元組和後面3個位元組(總共4個位元組)的值,你要確定到底一次讀多少位元組,選擇合適類型的指針。

Ⅱ 單片機中,知道地址0x3fc,如何讀出這個地址中存儲的值

採用間接定址方式,先將SRAM中的值讀取到臨時寄存器中

Ⅲ 我是電腦菜鳥,高手幫忙啊!我的電腦總彈出"0x00dc107d"指令引用的"0x00d"內存.該內存不能讀取.怎麼回事啊

這種情況偶爾出現,沒什麼關系,不用管他。點擊『取消』就可以了。
經常出現就危險了,弄不好就得重裝系統了。
該內存不能read written常見原因
使用Windows操作系統的人有時會遇到這樣的錯誤信息:「0X????????指令引用的0x00000000內存,該內存不能written」,然後應用程序被關閉。如果去請教一些「高手」,得到的回答往往是「Windows就是這樣不穩定」之類的義憤和不屑。其實,這個錯誤並不一定是Windows不穩定造成的。本文就來簡單分析這種錯誤的常見原因。

一、應用程序沒有檢查內存分配失敗
程序需要一塊內存用以保存數據時,就需要調用操作系統提供的「功能函數」來申請,如果內存分配成功,函數就會將所新開辟的內存區地址返回給應用程序,應用程序就可以通過這個地址使用這塊內存。這就是「動態內存分配」,內存地址也就是編程中的「指針」。
內存不是永遠都招之即來、用之不盡的,有時候內存分配也會失敗。當分配失敗時系統函數會返回一個0值,這時返回值「0」已不表示新啟用的指針,而是系統向應用程序發出的一個通知,告知出現了錯誤。作為應用程序,在每一次申請內存後都應該檢查返回值是否為0,如果是,則意味著出現了故障,應該採取一些措施挽救,這就增強了程序的「健壯性」。
若應用程序沒有檢查這個錯誤,它就會按照「思維慣性」認為這個值是給它分配的可用指針,繼續在之後的運行中使用這塊內存。真正的0地址內存區保存的是計算機系統中最重要的「中斷描述符表」,絕對不允許應用程序使用。在沒有保護機制的操作系統下(如DOS),寫數據到這個地址會導致立即死機,而在健壯的操作系統中,如Windows等,這個操作會馬上被系統的保護機制捕獲,其結果就是由操作系統強行關閉出錯的應用程序,以防止其錯誤擴大。這時候,就會出現上述的「寫內存」錯誤,並指出被引用的內存地址為「0x00000000」。
內存分配失敗故障的原因很多,內存不夠、系統函數的版本不匹配等都可能有影響。因此,這種分配失敗多見於操作系統使用很長時間後,安裝了多種應用程序(包括無意中「安裝」的病毒程序),更改了大量的系統參數和系統文件之後。
二、應用程序由於自身BUG引用了不正常的內存指針
在使用動態分配的應用程序中,有時會有這樣的情況出現:程序試圖讀寫一塊「應該可用」的內存,但不知為什麼,這個預料中可用的指針已經失效了。有可能是「忘記了」向操作系統要求分配,也可能是程序自己在某個時候已經注銷了這塊內存而「沒有留意」等等。注銷了的內存被系統回收,其訪問權已經不屬於該應用程序,因此讀寫操作也同樣會觸發系統的保護機制,企圖「違法」的程序唯一的下場就是被操作終止運行,回收全部資源。計算機世界的法律還是要比人類有效和嚴厲得多啊! 像這樣的情況都屬於程序自身的BUG,你往往可在特定的操作順序下重現錯誤。無效指針不一定總是0,因此錯誤提示中的內存地址也不一定為「0x00000000」,而是其他隨機數字。
如果系統經常有所提到的錯誤提示,下面的建議可能會有幫助:
1.查看系統中是否有木馬或病毒。這類程序為了控制系統往往不負責任地修改系統,從而導致操作系統異常。平常應加強信息安全意識,對來源不明的可執行程序絕不好奇。
2.更新操作系統,讓操作系統的安裝程序重新拷貝正確版本的系統文件、修正系統參數。有時候操作系統本身也會有BUG,要注意安裝官方發行的升級程序。
3.試用新版本的應用程序。

希望能夠對你有幫助!

Ⅳ 請問如何讀取系統內存中任意地址的數據,如0x100,用C語言實現。

首先要明確windows 的內存管理方式, (在 windows XP 非 3GB enabled)。 ring3程序也就是用戶空間的進程可以用的空間地址是 virtual address 0x00000000 - 0x7FFFFFFF ,注意virual address 呵呵,而 0x80000000 以後為內核使用 都是 virtual address啊。ring3 進程不能讀取 0x80000000 以後的地址。0x0000000 - 0x7FFFFFFF 也並不是都可以讀取的。這個空間中會根據系統需要由系統分配一定的 region 或一系列的 regions。只有位於這些 regions 的地址是可以被ring3 進程讀取的。所以比如任意地址 如 0x100 若這個地址不再任何一個 region 當中。就會出錯(指定地址無內存)。實際上即是說,系統沒有為 0x100 這個地址建立頁表映射,也就不可讀。 若你所說想要實現讀取內核地址空間,也只能讀取已經建立了頁表映射的地址。不然同樣要出錯。若想要判斷一個地址是否是有效的,如你所擔心的,用戶可能傳給你一個非法地址。可以用一些api 判斷合法性。如 VirtualQuery 更強大的還有VirtualQueryEx。 http://msdn.microsoft.com/en-us/library/aa366902(VS.85).aspx。 也可以用異常處理歷程。 try except (c++),c也有異常處理 不過不好用。

Ⅳ 怎樣通過程序讀內存地址中的值

不能這樣讀,你讀的內存具有保護屬性,產生了非法訪問。
如果要讀其他進程的內存數據,可以調用WINDOWS API 函數ReadProcessMemory
當然,讀取的內存必須具有可讀的屬性。

Ⅵ 匯編語言如何讀取一個地址中存儲的變數

匯編語言讀取一個地址的變數有專門的指令,比如51單片機的幾種讀取方法表述如下:
1、讀取程序存儲器地址中的變數數據
MOV DPTR,#1000H
CLR A
MOVC A,@A+DPTR
2、讀取外部數據存儲器中的變數數據
MOV DPTR,#1000H
MOVX A,@DPTR
MOV R0,#80H
MOVX A,@R0

Ⅶ c語言怎樣讀取指定RAM存儲單元的數據出來 比如我要讀取0XF0 RAM地址的值應如何實現.

int result = *(*int)oxfo; //讀取四位元組數據

Ⅷ 單片機告訴一個地址,怎樣用C語言編程讀取地址處的值

參考一下吧:
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義

#define DataPort P0 //定義數據埠 程序中遇到DataPort 則用P0 替換
#define KeyPort P1

sbit LATCH1=P2^2;//定義鎖存使能埠 段鎖存
sbit LATCH2=P2^3;// 位鎖存

unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};// 顯示段碼值0~F
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對應相應的數碼管點亮,即位碼
unsigned char TempData[8]; //存儲顯示值的全局變數

void DelayUs2x(unsigned char t);//us級延時函數聲明
void DelayMs(unsigned char t); //ms級延時
void Display(unsigned char FirstBit,unsigned char Num);//數碼管顯示函數
unsigned char KeyScan(void);//鍵盤掃描
unsigned char KeyPro(void);
void Init_Timer0(void);//定時器初始化
/*------------------------------------------------
主函數
------------------------------------------------*/
void main (void)
{
unsigned char num,i,j;
unsigned char temp[8];
Init_Timer0();

while (1) //主循環
{

num=KeyPro();
if(num!=0xff)
{
if(i<8)
{
temp[i]=dofly_DuanMa[num];
for(j=0;j<=i;j++)
TempData[7-i+j]=temp[j];
}
i++;
if(i==9)//多出一個按鍵輸入為了清屏 原本應該為8
{
i=0;
for(j=0;j<8;j++)//清屏
TempData[j]=0;
}
}
//Display(0,8); //顯示全部8位
//主循環中添加其他需要一直工作的程序

}
}
/*------------------------------------------------
uS延時函數,含有輸入參數 unsigned char t,無返回值
unsigned char 是定義無符號字元變數,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
長度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延時函數,含有輸入參數 unsigned char t,無返回值
unsigned char 是定義無符號字元變數,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編
------------------------------------------------*/
void DelayMs(unsigned char t)
{

while(t--)
{
//大致延時1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
顯示函數,用於動態掃描數碼管
輸入參數 FirstBit 表示需要顯示的第一位,如賦值2表示從第三個數碼管開始顯示
如輸入0表示從第一個顯示。
Num表示需要顯示的位數,如需要顯示99兩位數值則該值輸入2
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
static unsigned char i=0;

DataPort=0; //清空數據,防止有交替重影
LATCH1=1; //段鎖存
LATCH1=0;

DataPort=dofly_WeiMa[i+FirstBit]; //取位碼
LATCH2=1; //位鎖存
LATCH2=0;

DataPort=TempData[i]; //取顯示數據,段碼
LATCH1=1; //段鎖存
LATCH1=0;

i++;
if(i==Num)
i=0;

}
/*------------------------------------------------
定時器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
//TH0=0x00; //給定初值
//TL0=0x00;
EA=1; //總中斷打開
ET0=1; //定時器中斷打開
TR0=1; //定時器開關打開
}
/*------------------------------------------------
定時器中斷子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
TH0=(65536-2000)/256; //重新賦值 2ms
TL0=(65536-2000)%256;

Display(0,8); // 調用數碼管掃描

}

/*------------------------------------------------
按鍵掃描函數,返回掃描鍵值
------------------------------------------------*/
unsigned char KeyScan(void) //鍵盤掃描函數,使用行列逐級掃描法
{
unsigned char Val;
KeyPort=0xf0;//高四位置高,低四位拉低
if(KeyPort!=0xf0)//表示有按鍵按下
{
DelayMs(10); //去抖
if(KeyPort!=0xf0)
{ //表示有按鍵按下
KeyPort=0xfe; //檢測第一行
if(KeyPort!=0xfe)
{
Val=KeyPort&0xf0;
Val+=0x0e;
while(KeyPort!=0xfe);
DelayMs(10); //去抖
while(KeyPort!=0xfe);
return Val;
}
KeyPort=0xfd; //檢測第二行
if(KeyPort!=0xfd)
{
Val=KeyPort&0xf0;
Val+=0x0d;
while(KeyPort!=0xfd);
DelayMs(10); //去抖
while(KeyPort!=0xfd);
return Val;
}
KeyPort=0xfb; //檢測第三行
if(KeyPort!=0xfb)
{
Val=KeyPort&0xf0;
Val+=0x0b;
while(KeyPort!=0xfb);
DelayMs(10); //去抖
while(KeyPort!=0xfb);
return Val;
}
KeyPort=0xf7; //檢測第四行
if(KeyPort!=0xf7)
{
Val=KeyPort&0xf0;
Val+=0x07;
while(KeyPort!=0xf7);
DelayMs(10); //去抖
while(KeyPort!=0xf7);
return Val;
}
}
}
return 0xff;
}
/*------------------------------------------------
按鍵值處理函數,返回掃鍵值
------------------------------------------------*/
unsigned char KeyPro(void)
{
switch(KeyScan())
{
case 0x7e:return 0;break;//0 按下相應的鍵顯示相對應的碼值
case 0x7d:return 1;break;//1
case 0x7b:return 2;break;//2
case 0x77:return 3;break;//3
case 0xbe:return 4;break;//4
case 0xbd:return 5;break;//5
case 0xbb:return 6;break;//6
case 0xb7:return 7;break;//7
case 0xde:return 8;break;//8
case 0xdd:return 9;break;//9
case 0xdb:return 10;break;//a
case 0xd7:return 11;break;//b
case 0xee:return 12;break;//c
case 0xed:return 13;break;//d
case 0xeb:return 14;break;//e
case 0xe7:return 15;break;//f
default:return 0xff;break;
}
}

Ⅸ c語言中如何讀取地址為0x000中的變數,或者如何將一個地址賦給一個指針變數

讀取的話直接
*(0x0000)就是讀取0x0000的值,但是一般0x0000的地方會有內存保護機制,不讓讀取,所以請慎重。至於將地址付給指針變數類型強轉就可以了。
比如說 char *p;現在想讓p指向地址為0x6780的地址。這樣寫就好
p=(char*)(0x6780);

熱點內容
伺服器訪問不了網站 發布:2022-07-05 14:02:11 瀏覽:31
sql返回值的存儲過程 發布:2022-07-05 13:58:58 瀏覽:230
管理linux文件 發布:2022-07-05 13:58:50 瀏覽:747
詛咒密碼聲望是哪裡的 發布:2022-07-05 13:57:44 瀏覽:918
材料壓縮 發布:2022-07-05 13:57:37 瀏覽:785
安卓山寨機怎麼刷機 發布:2022-07-05 13:55:26 瀏覽:87
win7系統ftp伺服器 發布:2022-07-05 13:49:01 瀏覽:626
瑞納安卓導航大屏哪個牌子好 發布:2022-07-05 13:46:10 瀏覽:30
php批量插入數據 發布:2022-07-05 13:44:33 瀏覽:598
創建雲伺服器ECS實例時不需要選擇什麼 發布:2022-07-05 13:42:40 瀏覽:555