var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-333696-1']); _gaq.push(['_trackPageview']); _gaq.push(['_trackPageLoadTime']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();
  • 2008年08月25日

    基础汇编(3)

    分类:

    拷贝一个字节(byte)进双字(dword)寄存器,得这样:

    MOV  BL, AL

    MOV  byte ptr [b], AL  ; static bool b = func()

    MOVZX reg, reg/mem – move with zero extend,是386扩展指令集,扩展时最高有效部位用零填充:

    MOVZX   CX,   AL     如果   AL=79hCX=0079h

     

    [ebp-XXX] 局部变量

    [ebp+XXX] 函数参数

     

    LEA (load effective address)指令

    lea  eax,[ebp-0x8] 等同于:

    mov  eax,ebp

    sub  eax,0x8

     

    Intel x86处理器定义了4个不同优先级(Privilege levels)Intel的术语为Ring,分别从Ring0-Ring3Ring0优先级最高,Ring3最低。Windows Kernel mode使用了Ring0,而User mode使用了Ring3Windows之所有只使用这二个级别,是因为一些其它的硬件架构(ALPHA处理器)只实现了二个优先级,为了兼容性。RING0的代码段可以访问RING1RING2RING3的数据内存单元;RING3的代码段只能访问RING3的数据内存单元,但可以通过调用门或中断门调用RING0RING1RING2的代码,反之则不行。

     

    内存中的数组和结构

    通常内存指虚拟内存。

    地址模式

    [EAX] [base]

    [EAX+0x5A] [base+displacement]

    [EAX+ECX*4+0x5A] [base+index*scale+displacement]

    scale = 1, 2, 4, 8

     

    地址模式-基于栈的数组

    [EBP]

    [EBP-0x56]

    [EBP+ECX*4-0x56]

     

    数组和指针的关系规则

    数组通常被作为一个指针传递给第一个数组元素

    通常数组和指针是不可转换的,因为数组是右值编译时约束没有它自己的地址,而指针是左值有它自己的地址,见区别

     

    索引数组和指针规则

    Type array[N];

    Type *pType;

    int i;

    pType + i;   *(pType + i) ~ pType[i]

    array + i;    *(array + i) ~ array[i]

     

    内存对齐

     

    阅读声明的规则

    l  括号优先

    l  如果你看见'[]'读出该内容并加上数组的

    l  左读取并且如果你看见'*'加上指向或者加上''并放上类型名

    如:int *(*apap[N])[N]; // array of pointers to array of pointers to int 

     

    符号文件(Symbol)

    好的符号文件

    Disassembly: 75c4bfc5 ff154013c175 call dword ptr [comctl32!_imp__FindResourceExW (75c11340)]{kernel32!FindResourceExW (77e50223)} ds:0023:75c11340=77e50223

    Stack: 0012e56c 75c4fb1d comctl32!_RealPropertySheet(       struct PROPDATA * ppd = 0x000604fe)+0xe9 [d:\winmain\shell\comctl32\v6\prsht.cpp @ 4762]

    不正确的符号文件

    Disassembly:  75c4bfc5 ff154013c175 call dword ptr [75c11340]

    Stack: msenv!VStudioMain+0x6cbc7

     

    x64平台使用64位寄存器:RAX,RDX,…,R10,R11,…

    Quadword(64bit)

    Dword (32bit)

    Word (16bit)

    Lowest Byte

    RAX

    EAX

    AX

    AL

    RBX

    EBX

    BX

    BL

    RCX

    ECX

    CX

    CL

    RDX

    EDX

    DX

    DL

    RDI

    EDI

    DI

    DIL

    RSI

    ESI

    SI

    SIL

    RBP

    EBP

    BP

    BPL

    RSP

    ESP

    SP

    SPL

    R8

    R8D

    R8W

    R8L

    R9

    R9D

    R9W

    R9L

    R10

    R10D

    R10W

    R10L

    R11

    R11D

    R11W

    R11L

    R12

    R12D

    R12W

    R12L

    R13

    R13D

    R13W

    R13L

    R14

    R14D

    R14W

    R14L

    R15

    R15D

    R15W

    R15L

     
    为了编译链接为64位程序,在Visual C++中需设置成x64平台

     

    【资源】

    Intel® 64 and IA-32 Architectures Software Developer's Manuals

    AMD64 Architecture Tech Docs

    分享到:

    历史上的今天:

    Excel 自动填充时间 2011年08月25日