逆向:内存地址-堆栈05

1.关于32位、16位、8位通用寄存器
        这几个寄存器的关系可以说是包含的关系,32位寄存器分为上位和下位的话,16位寄存器就是32位寄存器的下位,这几个寄存器不是分开来算的,8位寄存器发生变化,16位、32位寄存器也可能发生变化。

2.寄存器的结构:EAX-AX-AH-AL的对应关系

        这几个寄存器是包含关系
3.为什么8位寄存器只能存放2个十六进制的数?
        因为8位寄存器只能存8位,而一位的十六进制数对应四位二进制数,所以两个16进制数换算成2进制数正好占8位,

4.内存单元:字节。
        每个字节有个编号,称为内存地址,一个字节等于8比特位,也就是一字节等于8位。
每个编号对应一块内存,这个内存就是一个字节
内存中的最小单元就是字节

        内存单元的换算:
        1GB=1024MB
        1MB=1024KB
        1KB=1024B
        1B(字节)=8b yte(位)

        BYTE      字节    =   8BIT          一个字节
        WORD     字     =  16(BIT)   两个字节
        DWORD   双字     32(BIT)    四个字节

5.数据窗口的使用、数据窗口与堆栈窗口的显示方式
        反汇编窗口
        程序是怎么跑的,汇编的执行都在这个窗口

       

         寄存器窗口
        8位的、16位的、32位的寄存器都在这个窗口       

 

        堆栈窗口
        一个特殊的内存窗口
        这个窗口里面的编号是四个字节组成一组进行显示,四个字节换算一下就是32位

                

        

        数据窗口
        在这个窗口可以了解数据

6.寻址方式:
寻址公式一:[立即数]
        读取内存的值:
        MOV EAX,DWORD  PTR  DS:[0x13FFC4]
        MOV EAX,DWORD  PTR  DS:[0x13FFC4]
        也就是将内存单元的数据给显示出来

        向内存中写入数据:
        MOV DWORD PTR DS:[0x13FFC4],eax
        MOV DWORD PTR DS:[0x13FFC4],ebx

        获取内存编号:
        LEA EAX,DWORD PTR DS:[0X13FFC4]
        LEA EAX,DWORD PTR DS:[ESP+8]
        和读取内存的值不一样,这个是把内存单元的编号给显示出来的指令

寻址公式二:[reg]  
        注:reg代表寄存器   可以是8个通用寄存器中的任意一个
        读取内存的值:
        MOV ECX,0x13FFD0
        MOV EAX,DWORD PTR DS:[ECX]
        把地址编号放到ECX这个寄存器里面,然后在通过这个寄存器找到内存,再放到EAX里面

        向内存中写入数据:
        MOV EDX,0x13FFD8
        MOV DWORD PTR DS:[EDX],0x87654321

        获取内存编号:
        LEA EAX,DWORD PTR DS:[EDX]
        MOV EAX,DWORD PTR DS:[EDX]


寻址公式三:[reg+立即数]
        读取内存的值:
        MOV ECX,0x13FFD0
        MOV EAX,DWORD PTR DS:[ECX+4]

        向内存中写入数据:
        MOV EDX,0x13FFD8
        MOV DWORD PTR DS:[EDX+0xC],0x87654321

        获取内存编号:
        LEA EAX,DWORD PTR DS:[EDX+4]
        MOV EAX,DWORD PTR DS:[EDX+4]
寻址公式四:[reg+reg*{1,2,4,8}]
        读取内存的值
        MOV EAX,13FFC4
        MOV ECX,2
        MOV EDX,DWORD PTR DS:[EAX+ECX*4]
        注:1,2,4,8是固定不变的,不要随意改

        向内存中写入数据:
        MOV EAX,13FFC4
        MOV ECX,2
        MOV DWORD PTR DS:[EAX+ECX*4],87654321

        获取内存编号:
        LEA EAX,DWORD PTR DS:[EAX+ECX*4]


寻址公式五:[reg+reg*{1,2,4,8}+立即数]
        和寻址公式四同样的道理

7.堆栈

        1.什么是堆栈
        2.堆栈操作

思考:
        假设我们需要一块内存,有如下的要求:
        1.主要用于临时存储一些数据,如果数量很少就放到寄存器中
        2.能够记录存了多少数据 
        3.能够非常快速的找到某个数据

那么堆栈的原理可以理解为:

        1.BASE,TOP是2个32位的通用寄存器,里面存储的是内存单元编号(内存地址)
        2.BASE里面存储了一个地址,记录的起始地址
        3.TOP里面也存储了一个地址,记录的是结束的地址
        4.存入数据的时候,TOP的值减4(为方便演示,每次存取都是4个字节)
        5.释放数据的时候,TOP的值加4(为方便演示,每次存取都是4个字节)
        6.如果要读取中间的某个数据的时候可以通过TOP或者BASE加上偏移的方式去读取
        7.这个内存的读取方式有个学名:堆栈
        堆栈的优点:临时存储大量的数据,便于查找。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值