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.这个内存的读取方式有个学名:堆栈
堆栈的优点:临时存储大量的数据,便于查找。