2010-7-26

Aim:   
1、ASM language 第二章
2、瞭解I1864s的功能和結構,查看自己是否OK

Learn:
1、ASM 基礎文字說明
EAX:the extended accumulator register(額外的累加計數器),自動被乘法和除法應用.
ECX:the extended count register,被CPU自動作爲循環計數器使用
ESP:the extended stack pointer register,地址數據在堆棧中(a system memory structure).不能被用作普通算法和數據偏移.
ESI和EDI:the extended source index and extended destination index registers,被用作高速內存偏移指令.
EBP:the extended frame pointer register被用作堆棧上的高級語言的形參和臨時變量,除非在高級編程中,否則不應被用作平常算法或數據偏移.

Segment Registers(段寄存器):被用作預分配內存,一些段管理代碼指令,一些管理變量,還有個堆棧段管理臨時變量和形參
EIP:instruction pointer register 包含下一個執行指令的地址。一些機器指令操作這個地址,致使程序跳到一個新的地址
EFLAGS Register:又單獨的二進制bit組成,二進制bit管理CPU操作或者一些CPU操作的輸出。有機器指令可以測試和操作進程flags
Control Flags:在EFLAGS寄存器中的單獨的bit可以控制CPU操作
Status Flags:反應CPU算法和邏輯操作的輸出。
    CF(Carry flag):當一個未標識的算法操作太大超出目的地時被設置
    OF(Overflow flag):當一個標識的算法操作太大或太小溢出時被設置
    SF(Sign flag):當算法或邏輯操作產生結果爲負時被設置
    ZF(zero flag):當算法或邏輯操作產生結果爲零時被設置
    AC(Auxiliary Carry flag):當算法或邏輯操作在一個8-bit操作時,將一個carry從bit3移到bit4時被設置
    PC(Parity flag):統計一個數據中的設置bit位,提示結果爲奇數或偶數
FPU(Floating-Point Unit):表示高速浮點算法。8個浮點數據寄存器:ST(0),...,ST(7)

2、說明
在20-bit線性地址機器中,將地址使用16-bit段和16-bit偏移來表示:
16-bit段:CS(code segment), DS(data segment), SS(Stack segment), ES(segment),
16-bit偏移

IA-32支持分頁,允許段被分成4096-byte的一塊塊,可使程序同一時間使用所有內存(比機器實際物理內存要大很多)。機器分配的頁面被稱爲虛擬內存

分頁技術是爲了虛擬內存,分段是爲了保護各自獨立數據(如類中的私有成員)


Questions
1、vector和list使用的條件分別是什麼
vector可視作數組,可以直接操作指定序列數據,便於讀取數據;
list可視作雙向鏈表,插入和刪除比較方便。

2、CRC結果爲何是不重複數據
T(x) = A(x)g(x)                 //A(x)爲x的K次數據表達式,  g(x)爲x的R次數據表達式
       = (x^R)*m(x) + r(x) //m(x)爲x的K次表達式,r(x)爲x 的R-1次數據表達式

 (x^R)*m(x)%g(x) = r(x) 爲定值`


//X5代表Bit5,X12代表Bit12,1 自然是代表 Bit0,X16 比較特別,是指移位寄存器移出的數據,即圖中的DATA OUT。
//可以這樣理解,與數據位做XOR運算的是上次 CRC值的 Bit15
USHORT crc16l(UCHAR *pData,CHAR len)        // ptr 爲數據指針,len 爲數據長度
{
    UCHAR *ptr = pData ;
    USHORT crc= 0;
    UCHAR i;
    while(len--)
    {
        for(i=0x80; i!=0; i>>=1) //0x80=1000 0000 binary,比較最高位
        {
            if((crc&0x8000)!=0) //最高位爲1則作異或,否則往左偏移一位
            {
                crc<<=1;
                crc^=0x1021;
            }        //1-1  
            else
                crc<<=1;                     //1-2
           
            if((*ptr&i)!=0)        //若數據最高位爲1則作異或,否則進入下一次比較
                crc^=0x1021;                       //1-3  
        }
        ptr++;
    }
    return crc;
}
其中一種,CRC-CCITT,初始值爲0x00。CCITT比較後不同結果原因在於初始值的選擇不同而已

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章