内存
计算机存储数据的有cpu的寄存器、内存、外存
为了找到内存中存储的数据,把内存每个字节编号,32位的计算机就编号从00000000~FFFFFFFF,也叫地址,因此32位计算机内存为4G。
但是计算机也分不清哪些是数据,哪些是地址,因此当我们使用地址的时候加中括号如[0x00000000]、[0xFFFFFFFF]表示地址编号,0xFFFFFFFF表示数据
汇编语言中指令:
mov word ptr DS:[0x12345678] ,0xFFFF
mov eax,dword ptr ds:[0x12345678]
lea eax,dword ptr ds:[0x12345678]取地址(编号)12345678//lea指令是取地址并存到第一个寄存器(eax)中
指定内存的方法:
地址编号一[0xFFFFFFFF]
地址编号二 [reg] 如:[ECX]ecx里边的值就是地址编号
地址编号三[ECX+4/8...]
地址编号四[eax+ecx*4]
地址编号四[eax+ecx*4+4/8...]
通用寄存器
32位计算机中有8个通用寄存器,用途是人为规定的,可以直接看作8个可以使用的容器
当然,除了32位的寄存器,还有早期的16位,8位等,我们的寄存器需要向下兼容
对应16进制的八个寄存器是AX、CX、DX、BX、SP、BP、SI、DI
8进制又把AX、CX、DX、BX分为八个寄存器AH、AL、CH、CL、DH、DL、BH、BL
例如32位保存数据0xAABBCCDD到EAX中,其中AX就是CCDD,AH=CC,AL=DD
汇编语言中指令:
mov r/m 数据/r
mov r m/数据
r表示寄存器
m表示内存
总结不能把数据直接从m移到m,使用时要确定好数据宽度,如16位的数存到16位的ax中
add
sub
xor
not
堆栈
堆栈是内存中的一块区域,用来存一些数据,在堆栈中存数据读取插入等速度比较快。
| | 栈顶 [esp]
| |
| |
| | 栈底 [ebp]
存取数据时栈底不变,栈顶变
栈底-4-4-4-4-4栈顶
栈顶,栈底都用一个寄存器记录,寄存器保存栈顶(ESP),栈底(EBP)的地址
栈里边保存数据
汇编语言中指令:
push 12345678;把数据存入栈
push eax;;把数据从栈顶压入栈中,栈顶上移(减)
pop eax;把数据从栈顶弹出栈,并存入eax,栈顶下移(加)