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比较后不同结果原因在于初始值的选择不同而已

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