zoukankan      html  css  js  c++  java
  • 04.内存地址和堆栈

    1.32位, 16位, 8位通用寄存器
    2.寄存器的结构:EAX-AX-AH-AL的对应关系
    3.为什么8位寄存器只能放2个十六进制的数
    4.内存单元:字节 每个字节有个编号,称为内存地址
    5.如何操作指定的内存:8位内存, 16位内存, 32位内存
    6.数据窗口的使用、数据窗口与堆栈窗口的显示方式

    EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI
    AX, CX, DX, BX, SP, BP, SI, DI
    AL, CL, DL, BL, AH, CH, DH, BH

    OD命令
    以字节形式查看内存
    db 0x12ffdc
    以双字形式查看内存
    dd 0x12ffdc

    每种寻址公式分别实现内存的读、写和取内存地址
    寻址公式1
    [立即数]
    寻址公式2
    [reg]
    寻址公式3
    [reg+立即数]
    寻址公式4
    [reg+reg{1, 2, 4, 8}]
    寻址公式5
    [reg+reg
    {1, 2, 4, 8}+立即数]

    获取内存编号
    LEA EAX, DWORD PTR DS:[0x13FFC4] // 等价于MOV EAX, 0x13FFC4

    堆栈的优点
    1.存储大量临时的数据
    2.快速查找

    window栈
    高地址:栈底
    低地址:栈顶

    常用存栈顶寄存器
    ESP
    常用存栈底寄存器
    EBP

    将数据放入栈顶(压栈)
    PUSH 0x12345678
    PUSH r32
    PUSH r16
    PUSH m16
    PUSH m32
    PUSH imm8/imm16/imm32

    将数据从栈顶取出(出栈)
    POP eax
    POP r32
    POP r16
    POP m16
    POP m32
    POP imm8/imm16/imm32

    本节练习:
    1.使用EBX存储栈底地址,EDX存储栈顶地址,连续存储5个不同的数
    2.分别使用栈底加偏移、栈顶加偏移的方式读取这5个数,并存储到寄存器中
    3.弹出这5个数,恢复栈顶到原来的位置
    4.使用2种方式实现: push ecx
    5.使用2种方式实现: pop ecx
    6.使用2种方式实现: push esp
    7.使用2种方式实现: pop esp

    MOV EBX,53FA7C
    MOV EDX,53FA7C

    MOV DWORD PTR DS:[EDX],11111111
    SUB EDX,4

    LEA EDX,DWORD PTR DS:[EDX-4]
    MOV DWORD PTR DS:[EDX+4],22222222

    MOV EAX,33333333
    MOV DWORD PTR DS:[EDX],EAX
    LEA EDX,DWORD PTR DS:[EDX-4]

    SUB EDX,4
    MOV DWORD PTR DS:[EDX+4],44444444

    MOV DWORD PTR DS:[EDX],55555555
    SUB EDX,4

    MOV EAX,DWORD PTR DS:[EBX]

    MOV ECX,DWORD PTR DS:[EBX-4]

    MOV ESI,DWORD PTR DS:[EDX+4]

    MOV EDI,DWORD PTR DS:[EDX+8]

    MOV EAX,-4
    MOV EAX,DWORD PTR DS:[EBX+EAX*2]

    MOV EAX,DWORD PTR DS:[EDX+4]
    ADD EDX,4

    MOV ECX,DWORD PTR DS:[EDX+4]
    LEA EDX,DWORD PTR DS:[EDX+4]

    ADD EDX,4
    MOV ESI,DWORD PTR DS:[EDX]

    LEA EDX,DWORD PTR DS:[EDX+4]
    MOV EDI,DWORD PTR DS:[EDX]

    MOV EAX,DWORD PTR DS:[EDX+4]
    ADD EDX,4

    PUSH/POP后栈顶移动单位
    根据容器大小(2(16bit), 4(32bit)

    PUSHAD
    将8个通用寄存器值压入栈中
    POPAD
    将8个通用寄存器值从栈中恢复

    OD下断点
    bp MessageBoxA

    函数开始执行时, 栈顶存储的是返回地址

    JE
    标志寄存器Z为1时跳转

    JMP
    无条件跳转

    EFL标志寄存器

    CF
    0, Carry Flag进位标志寄存器, 计算结果中最高位是否进位或借位

    PF
    2, Parity Flag奇偶标志寄存器, 计算结果中"1"的个数奇偶性, "1"的个数为偶数值为1

    AF Auxiliary Carry Flag辅助进位标志寄存器
    4,

    ZF
    6,

    SF
    7,

    OF
    11,

  • 相关阅读:
    java泛型详解
    一条sql语句搞定基于mysql的sql执行顺序的基本理解
    java深拷贝和浅拷贝
    Intelligent idea高效实用总结
    git工具的使用总结
    java注解详解
    实现业务系统中的用户权限管理设计篇
    有创业兴趣的来看看
    System.Web.HttpRequestValidationException:解决方法
    XMLHttpRequest 对象
  • 原文地址:https://www.cnblogs.com/ret688/p/12830757.html
Copyright © 2011-2022 走看看