一個記憶體資料相減運算的思考
阿新 • • 發佈:2019-01-02
有一塊記憶體區域,其中某兩個地址開始的地方存有兩個32位的無符號整型,現在用程式如何把它們的差相減出來?
一剛開始想,這有何難?寫一個函式就搞寫了唄,象這樣傳入第一地址、第二個地址:
INT32U MemSub(INT32U* src1,INT32U* src2)
{
// INT32U* tmp1=(INT32U*)src1;
// INT32U* tmp2=(INT32U*)src2;
// return *tmp1-*tmp2;
INT32U temp32=0;
temp32=*src1-*src2;//src1=D249,*D249=32824;src2=D239,*D239=32818;但為什麼temp32=1425???
return temp32;}
如以上註釋所說,如果不執行的話,也許永遠發現不了這種奇怪的錯,剛開始我是用前三句,發現結果不對,後來改
成後三句的形形式,還是不對,為什麼?
經過除錯跟蹤,發現IAR編譯器顯示的值是正確的,如註釋上所說,而且查看了這兩個地址的內容,確實是32824和
32818,但為什麼相減後結果不對呢?按理說,src1、src2為兩個地址,而用*src1、*src2取內容運算,應該可以得
到相應的32位整數,而且編譯器780KOR所顯示的值確實也沒變,但相減後結果還是不對。
經過反覆試驗,程式改成下面的形式:
INT32U MemSub(INT32U* src1,INT32U* src2){
INT32U temp1=0;
INT32U temp2=0;
INT32U temp32;
temp1=*src1;//temp1=0x00803800
temp2=*src2;//temp2=0x0080326F
temp1=*(INT32U*) src1;//temp1=0x00803800
temp2=*(INT32U*) src2;//temp2=0x0080326F
temp1=(INT32U) *src1;//temp1=0x00803800
temp2=(INT32U) src2;//temp2=0x000FD239
*&temp1= *src1;
*(&temp2)=* src2;//temp2=0x0080326F
//&temp1=src1;
INT32U* p1=src1;
INT32U* p2=src2;
temp32=*p1-*p2;//temp32=1425???
temp1=*p1;
temp2=*p2;
temp32=*p1-*p2;
memcpy(&temp1,src1,4);
memcpy(&temp2,src2,4);
temp32=temp1-temp2;
return temp32;
}
最後還是想不明白,是IAR編譯器的問題,還是所用的語句不對,暫時還沒有用其它語言驗證過。只有用後面4個語
句才能得到正確的結果,上面用了(INT32U)強制轉換了還是得到的內容和指定的地址的內容不一樣,沒辦法,只有
強制複製過來先用著,再慢慢研究。