1/2.进制
进制的定义
- 十进制:由10个符号组成,逢9进1
- N进制:由N个符号组成,逢N-1 进一
重要进制
- 16进制4个2进制的简写
- 熟悉数之间的相互转化
利用进制之间转化表
3.数据宽度_逻辑运算
-
数据宽度
-
计算机中的补码、有符号数等只是人为的定义,对于计算机而言,它只知道存了多少个0和1
-
有符号数、无符号数
-
逻辑运算 与或非
CPU如何计算2+3 (视频3 42:00左右)
先异或,再与,最后判断
4位二进制转换,最好硬记!
2进制 | 10进制 |
---|---|
0000 | 0 |
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | A |
1011 | B |
1100 | C |
1101 | D |
1110 | E |
1111 | F |
负数的补码
对于正数,原码、反码、补码都是一致的
负数补码的计算:对应正数取反加一
例子:-1
补码的出现可以简化逻辑运算器,只需要加法器,不需要额外的减法器,大大节省成本和空间
有符号数 / 无符号数
4位二进制情况:
F 为什么对应 -1 ?
F:1111
在有符号情况下,F为补码表示,F的反码为1110,F的原码为1001(减一取反)负数补码的计算:正数下取反加一
理解:F为最大的负数-1,根据这个圆,左半边都是负数
8位二进制情况:
范围:
无符号数:0~FF (0~255)
有符号数:0~7F (0127)、80FF (-128 ~ -1)
80 为什么对应 -128 ?
80 ==>1000 0000
因为是有符号数,这里的符号位在第8位原码 1 000 0000
反码 1 111 1111
补码 1 1000 0000(数值上看出为-128,但符号位超过了8位的限制)
总之,范围就是 -128 ~ 127
作业题
-
八进制
2-5
在计算器的结果为17777777777777777775
,为什么?
得到结果-3的二进制为1111 1101(补码形式),十六进制为FD,八进制就是该值 -
使用异或对87AD6进行加密在进行解密,加解密密钥为5
1000 0111 1010 1101 0110xor 0101 加密密钥
----------------------------------------------------
1000 0111 1010 1101 0011 加密后的值
xor 0101 解密密钥
-----------------------------------------------------
1000 0111 1010 1101 0110 解密后的值,与原值一致 -
只用逻辑运算计算2-3=?(计算机计算2-3)(涉及内容:逻辑运算、移位、数据宽度)
2:0010、-3:1101(补码表示)
0010
xor 1101
----------------
1111(X) 0010
& 1101
----------------
0000(Y)
0000 << 1 == 0000 就不用再循环一次了
1111补 = 1001原 = -1若Y左移后不全为0000,则需要再对XY做相同的逻辑运算处理,直到新的Y=0
4.通用寄存器_内存读写
通用寄存器
按位数区分:
32位 | 16位 | 8位 |
---|---|---|
EAX | AX | AL |
ECX | CX | CL |
EDX | DX | DL |
EBX | BX | BL |
ESP | SP | AH |
EBP | BP | CH |
ESI | SI | DH |
EDI | DI | BH |
AX 包括 AH和AL
MOV 语法
MOV 目标操作数, 源操作数
注意点:
操作数的宽度必须一致
不能同时为内存单元
类似的指令还有
- ADD
- SUB
- AND
- OR
- XOR
- NOT
可以查阅提供的课程笔记
作业题
5.内存
寄存器和内存的区别
寄存器在CPU内部,内存在CPU外部的数据总线上。
寄存器是高速存贮部件,暂时存储指令数据和地址,可对内存数据进行操作。内存是所有运行程序存储的空间
32位计算机
32位计算机中的位数,与寄存器宽度无关而与寻址宽度有关(所能查找的内存编号范围),每一内存编号对应的是1字节。
最大内存范围为0xFFFFFFFF ==> 4,294,967,296(10进制)Byte ==> 4,194,304KB ==> 4096MB ==> 4GB
只要是32位计算机,最多识别的内存为4G?
不对,可以通过打补丁或者拓展寻址范围
操作内存
内存不像寄存器,有固定的数据宽度,在对内存进行读或写时,需要指定内存的大小字节(1、2、4字节 ==> byte、word、dword)
MOV 内存宽度 PTR DS:[内存地址], 数据
MOV BYTE PTR DS:[0X01234567], 0X12
MOV WORD PTR DS:[0X01234567], 0X1234
MOV DWORD PTR DS:[0X01234567], 0X11223344
内存宽度:指定读写改内存的数据宽度
PTR:代表的一个指针,指的是一个地址
DS:段寄存器
0x01234567:内存编号,内存的地址,32位
实验
写入:
MOV DWORD PTR DS:[0X00FF12C2], 0X01234567
读取:
MOV EAX, DWORD PTR DS:[0X00FF12C2]
这里的0x00FF12C2在堆栈内,因为一些内存为禁止访问,不方便做实验,这里就选择堆栈地址做实验
堆栈区:显示4个块为一行,看左边的编号并非连续的,而是间隔4个。
编号的地址为该区最小地址,且从右往左依次增大详情见堆栈部分!