1.为什么8位寄存器只能放2个十六进制的数?
01010101(8位寄存器)
一个十六进制的数需要四个二进制数表示0101表示一个十六进制数,0101表示另一个十六进制数,所以8位寄存器只能存放2个十六进制数。
2.内存单元、字节,每个字节有个编号,成为内存地址。
每一个内存编号对应一字节
寻址公式一:[立即数]
读取内存的值:
MOV EAX,DWORD PTR DS:[0x13FFC4]
MOV EAX,DWORD PTR DS:[0x13FFC8]
向内存中写入数据:
MOV DWORD PTR DS:[0x13FFC4]
MOV DWORD PTR DS:[0x13FFC8]
获取内存编号:
LEA EAX,DWORD PTR DS:[0x13FFC4]
LEA EAX,DWORD PTR DS:[ESP+8]
寻址公式二:[reg] reg代表寄存器,可以是8个通用寄存器中的任意一个
读取内存的值:
MOV ECX,0x13FFD8
MOV EAX,DWORD PTR DS:[ECX]
向内存中写入数据:
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]
向内存中写入数据:
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}+立即数]
读取内存的值:
MOV EAX,13FFC4
MOV ECX,2
MOV EDX,DWORD PTR DS:[EAX+ECX*4+4]
向内存中写入数据:
MOV EAX,13FFC4
MOV ECX,2
MOV DWORD PTR DS:[EAX+ECX*4+4],87654321
获取内存编号:
LEA EAX,DWORD PTR DS:[EAX+ECX*4+4]
六.堆栈
1.主要用于临时存储一些数据,如果数量很少就放到寄存器中
2.能够记录存了多少数据
3.能够非常快速的找到某个数据
- BASE,TOP是2个32位的通用寄存器,里面存储的是内存单元编号(内存地址)
- BASE里面也存储了一个地址,记录的是起始地址。
- TOP里面也存储了一个地址,记录的是结束的地址。
- 存入数据的时候,TOP的值减4(为方便演示,每次存取都是4个字节)
- 释放数据的时候,TOP的值加4(为方便演示,每次存取都是4个字节)
- 若果要读取中间的某个数据的时候可以通过TOP或者BASE加上偏移的方式去读取
- 这种内存的读取方式有个学名:堆栈
堆栈的优点:临时存储大量的数据,便于查找。