数据宽度、逻辑运算与通用寄存器

一、数据宽度

数学中的数字可以无限大,但在计算机中,数据受硬件限制,都有长度限制。超出宽度的部分会被直接丢弃。

1. 4 位宽度表示:假设计算机只能存储4位2进制数

假设计算机只能存储 4 位二进制数,所有可能的值如下:

1
2
3
4
0000    0001    0010    0011    0100    0101    0110    0111    
0 1 2 3 4 5 6 7
1000 1001 1010 1011 1100 1101 1110 1111
8 9 A B C D E F

通过圆圈图理解有符号数和无符号数:

8 7 B C 4 3 F 0
无符号数:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
有符号数:
正数:0,1,2,3,4,5,6,7
负数:-1,-2,-3,-4,-5,-6,-7,-8
    F, E, D, C, B, A, 9, 8

计算机并不区分有无符号,它只存储二进制。如何解释这些二进制,是程序员自己的事。

2. 8 位宽度表示:假设计算机只能存储8位2进制数

80 7F BF C0 40 3F FF 0
无符号数:0 ~ FF
有符号数:
正数:0 ~ 7F
负数:-1 ~ -128
    FF, FE, FD, FC, ..., 80

3. 16位宽度表示:假设计算机只能存储16位2进制数

8000 7FFF BFFF C000 4000 3FFF FFFF 0
无符号数:0 ~ FFFF
有符号数:
正数:0 ~ 7FFF
负数:-1 ~ -32768
    FFFF, FFFE, ..., 8000

4. 32 位宽度表示:假设计算机只能存储32位2进制数

80000000 7FFFFFFF BFFFFFFF C0000000 40000000 3FFFFFFF FFFFFFFF 0
无符号数:0 ~ FFFFFFFF
有符号数:
正数:0 ~ 7FFFFFFF
负数:-1 ~ -2147483648
    FFFFFFFF, FFFFFFFE, ..., 80000000

5. 重要的计量单位

1
2
3
BYTE     字节     8 bits
WORD 字 16 bits (2 字节)
DWORD 双字 32 bits (4 字节)

二、逻辑运算

CPU 的本质是无数个开关的组合,所有运算最终都由基本的逻辑运算完成。

1. 或运算(OR)

规则:只要有一个 1,结果就为 1
汇编指令:OR
C 语言符号:|

1
2
3
4
    1010 0011
OR 1100 1010
——————————————
1110 1011

2. 与运算(AND)

规则:两个都为 1,结果才为 1
汇编指令:AND
C 语言符号:&

1
2
3
4
    1010 0011
AND 1100 1010
——————————————
1000 0010

3. 异或运算(XOR)

规则:不相同为 1,相同为 0
汇编指令:XOR
C 语言符号:^

1
2
3
4
    1010 0011
XOR 1100 1010
——————————————
0110 1001

4. 非运算(NOT)

规则:1 变 0,0 变 1
汇编指令:NOT
C 语言符号:!

1
2
3
NOT 1010 0011
——————————————
0101 1100

5. 逻辑运算的具体应用

(1) 计算机如何计算 2 + 3

计算机只能做逻辑运算和移位,2+3 的过程如下(假设 4 位宽度):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
   X = 2 (0010)
Y = 3 (0011)

① 异或求“不考虑进位的和”:
0010 XOR 0011 = 0001 → 存入 R

② 与运算后左移一位求“进位”:
0010 AND 0011 = 0010
0010 << 1 = 0100 → 存入 Y

③ 判断 Y 是否为 0,不为 0 则重复:
新 X = R (0001)
新 Y = 进位 (0100)

④ 再次异或:
0001 XOR 0100 = 0101 → R = 0101

⑤ 再次求进位:
0001 AND 0100 = 0000
0000 << 1 = 0000 → Y = 0,结束

结果:R = 0101 = 5

(2) 获取某个二进制位的值

如要测试 8F(1000 1111)的第 4 位(从右数,起始为 0):

1
2
3
4
    1000 1111
AND 0000 1000 ← 只有第 3 位(0起点)为 1
——————————————
0000 1000 ≠ 0,说明该位为 1

(3) 最简单的加密:异或

加密:数据 XOR 密钥 = 密文
解密:密文 XOR 密钥 = 数据

示例:明文 2026,密钥 68

1
2
3
4
    0010 0000 0010 0110  (2026)
XOR 0110 1000 0110 1000 (6868)
————————————————————————————————————
0100 1000 0100 1110 (484E) → 密文

解密时再用 6868 异或一次,即得回 2026。


三、通用寄存器

1. 32 位通用寄存器表

寄存器 主要用途 编号 存储数据范围
EAX 累加器 0 0 - 0xFFFFFFFF
ECX 计数 1 0 - 0xFFFFFFFF
EDX I/O指针 2 0 - 0xFFFFFFFF
EBX DS段的数据指针 3 0 - 0xFFFFFFFF
ESP 堆栈指针 4 0 - 0xFFFFFFFF
EBP SS段的数据指针 5 0 - 0xFFFFFFFF
ESI 字符串操作的源指针;SS段的数据指针 6 0 - 0xFFFFFFFF
EDI 字符串操作的目标指针;ES段的数据指针 7 0 - 0xFFFFFFFF

记住顺序:EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI(编号 0~7)。这 8 个是 32 位通用寄存器,每个能存 4 字节。

2. MOV 指令

格式:MOV 目标操作数, 源操作数
功能:将源操作数的值复制到目标操作数中。

示例

1
2
3
MOV EAX, 0x1          ; 将 1 放入 EAX
MOV ECX, 0x12345678 ; 将 0x12345678 放入 ECX
MOV EDX, EBX ; 将 EBX 的值复制到 EDX

四、课后作业

  1. 八进制数2-5在计算机中的结果是:1 777 777 777 777 777 777 775 ,为什么?
  2. 使用异或对87AD6进行加密后再进行解密,解密密钥:5
  3. 只用逻辑运算计算2-3?(涉及内容:逻辑运算、移位、数据宽度)
  4. 按照顺序记住8个通用寄存器的名称
  5. 使用MOV指令修改8个寄存器的值,单步执行观察修改后的结果

数据宽度、逻辑运算与通用寄存器

https://blog.c8h10n4o2.asia/55c31270/

作者

萌新知

发布于

2026-07-14

更新于

2026-07-20

许可协议