小白进阶之路之汇编2
进制转换基础
- 计算机只认识二进制,汇编中一般使用十六进制表示数据 是为了方便程序员阅读和开发
- 二进制和十六进制转换
0101 1100 1001 0010//二进制(每四个分一组)
5 C 9 2 //每四位二进制数对应一位十六进制表示数据(0~F)
指令集不一样,细节不一样
在x86汇编代码中,十六进制写法如下:
mov(传送、赋值的意思将2000H赋值给ax ) ax,2000H ;h结尾表示十六进制,h不区分大小写
在ARM汇编代码中,十六进制写法如下:
mov R0,#0x2020202A ;使用0x开头表示 #是固定写法
数据单位
- 位:一个二进制位
- 字节:8个二进制位表示一个字节(KB、MB、GB)
由于八个二进制位转换成十六进制后是两位十六进制数,所以两个十六进制数占用一个字节`
0x20 ;占用一个字节(0x2000占用两个字节)
或者
20H ;占用一个字节
在计算机中最小的数据单位是位;在内存中,最小的数据单位是字节,一个内存单元占用一个字节,内存单元就是一个存放数据的容器。
内存单元(一块空间)和地址
每个内存单元中存储两个十六进制数,地址即代表内存单元所处位置,通常使用十六进制表示(也叫物理地址)
CPU想要读写内存中的数据,需要通过地址找需要对应的内存单元,即寻址。<根据物理地址找到内存单元所处位置,用于存储和读取数据>
与内存单元数量有关的因素:
- 内存条容量:内存单元占的空间是固定的,so,内存容量越大,内存单元的数量越多。
地址标号
0x1
0x2
...
0x10
0x20
...
0x100
0x200
...
0x1000
0x2000
...
0xFFFF(对应十进制为65535)
最大值由什么决定
- 内存单元数量
- 地址所填位置的空间大小<地址总线宽度(数量)>
- CPU的运算能力
如果CPU是16位的,且地址总线也是16位,那么最大只能运算表示16位数即0xFFFF;
如果CPU是32位的,且地址总线也是32位,那么最大只能运算表示32位数即0xFFFFFFFF;
如果CPU是64位的,且地址总线也是64位,那么最大只能运算表示64位数即0xFFFFFFFFFFFFFFFF
在8086CPU中,CPU是16位,地质总线是20位,本来最大只能表示16位地址值,为了让它能表示20位地址,使用了段地址*16+偏移地址的形式来表示20位地址。
物理地址=段地址*16+偏移地址
如果要表示一个20位物理地址0xFFFFA,可以有一下四种写法:
0xFFFFA=0xFFFF*16+0x000A//FFFF0 10*10=100(10左移一位)
0xFFFFA=0xFFF0*16+0x00FA
0xFFFFA=0xFF00*16+0X0FFA
0xFFFFA=0xF000*16+0xFFFA
因此计算机的寻址能力不单单和CPU有关还和地址总线有关,32位操作系统对应32位地址总线,so,即便CPU64位如果只装了32位操作系统,无法完全发挥CPU和内存的性能。