二进制到汇编(2)
通用寄存器
寄存器:
存储数据:CPU > 内存 > 硬盘
32位 CPU 8 16 32
64位 CPU 8 16 32 64
通用寄存器:可以存储任意的值
# 32位的通用寄存器只有8个
存值范围0~FFFFFFFF
对于二进制来说,直接修改值
计算机如何向寄存器存值。
mov指令
mov 存的地址,存的数
mov 存的地址1,存的地址1
可以将数字写入寄存器,可以将寄存器中的值写到寄存器。
计算机:计算力!
不同的寄存器
FFFF FF 0000 0000
32位 16位 8位
EAX AX AL
ECX CX CX
EDX DX DX
EBX BX BX
ESP SX AH
ENP NX CH
ESI SX DH
EDI DX BH
8位:L低8位,H高八位
除了这些通用寄存器之外,那么其他的寄存器每一位都有自己特定的功能!
内存
寄存器很小,不够用,所以说,数据放到内存中!
平时买的内存条!
每个应用程序进程都有4GB的内存空间,空头支票。
程序真正运行的时候,才会用到物理内存。
1B = 8bit
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
4GB的 内存,4096m =>最终计算为位,就是这个可以存储的最大容量的。
计算机中内存地址很多,空间很大。
内存地址
存一个数:占用的大小,数据宽度!存到哪里?
计算机中内存地址很多,空间很大,每个空间分配一个地址,名字。
这些给内存起的编号,就是我们的内存地址。32位 8个 16进制的值。
32位:寻址能力!4GB 。
FFFFFFFF+1= 100000000,最大的值。
位是怎么限制内存大小的。
100000000 内存地址 * 8 = 位:800000000
转换为10进制/8 = 4,294,967,296字节
按照规则/1024,最终发现就是4GB!
64位,绰绰有余!
FFFFFFFFFFFFFFFF+1
每个地址都有一个编号!可以通过这个编号向里面存值。
内存如何存值?
数据宽度:byte word dword
地址的位置:0xFFFFFFFF
不是任意的地址都可以写东西的,申请使用的。只有程序申请过得地址我们才可以使用。
汇编如何向内存中写值。
?
mov 数据宽度 内存地址,1
?
mov byte/word/dword/qword,1
?
mov byte ptr ds:[0x19FF70],1
?
传递的值的大小一定要和数据宽度相等。
内存的有多种写法
ds:[0x19FF70+4] 内存地址偏移
ds:[eax] 寄存器
ds:[eax+4] 寄存器偏移
数组[]
ds:[reg+reg*{1,2,4,8}] 数组!
ds:[reg+reg*{1,2,4,8}+4] 偏移 !