【30天精通汇编】Day 1: 计算机基础与二进制
📅 学习时间:3-4小时
🎯 学习目标:理解计算机底层原理,掌握二进制运算
💡 难度:★☆☆☆☆
📋 前置要求:零基础可学
📌 为什么要学汇编?
学会汇编,你将获得: 1. 🔍 看透程序本质 - 理解高级语言如何变成机器码 - 知道程序"真正在做什么" 2. 🛡️ 安全攻防能力 - 逆向工程 - 漏洞挖掘与利用 - 恶意软件分析 3. ⚡ 极致性能优化 - 手写关键代码 - 理解编译器优化 4. 🔧 底层开发能力 - 操作系统开发 - 驱动程序开发 - 嵌入式系统1. 计算机如何"思考"
1.1 计算机只认识0和1
为什么是0和1? 计算机是电子设备,只能识别两种状态: - 高电压 → 1 - 低电压 → 0 这就像开关:开=1,关=0 所有复杂的程序、图片、视频, 在计算机眼里都是一串串的0和1!1.2 一个简单的类比
想象你只能用手势交流: - 竖起大拇指 = 1 - 握拳 = 0 用10个手指,你能表示多少种状态? 答案:2^10 = 1024种! 这就是二进制的力量。2. 二进制基础
2.1 什么是二进制
十进制(我们日常用的): 每位有0-9共10种可能 123 = 1×100 + 2×10 + 3×1 = 1×10² + 2×10¹ + 3×10⁰ 二进制(计算机用的): 每位只有0和1两种可能 1011 = 1×8 + 0×4 + 1×2 + 1×1 = 1×2³ + 0×2² + 1×2¹ + 1×2⁰ = 8 + 0 + 2 + 1 = 11(十进制)2.2 二进制转十进制
方法:从右往左,每位乘以2的幂次,然后相加 二进制:1101 位3: 1 × 2³ = 1 × 8 = 8 位2: 1 × 2² = 1 × 4 = 4 位1: 0 × 2¹ = 0 × 2 = 0 位0: 1 × 2⁰ = 1 × 1 = 1 合计 = 13 所以:1101(二进制) = 13(十进制)2.3 十进制转二进制
方法:不断除以2,记录余数,然后倒序排列 把13转成二进制: 13 ÷ 2 = 6 余 1 6 ÷ 2 = 3 余 0 3 ÷ 2 = 1 余 1 1 ÷ 2 = 0 余 1 ↑ 从下往上读 答案:1101 验证:8 + 4 + 0 + 1 = 13 ✓2.4 常用的2的幂次
记住这些数字,会让你更快! 2⁰ = 1 2¹ = 2 2² = 4 2³ = 8 2⁴ = 16 2⁵ = 32 2⁶ = 64 2⁷ = 128 2⁸ = 256 2⁹ = 512 2¹⁰ = 1024 (1K) 2¹⁶ = 65536 (64K) 2²⁰ = 1048576 (1M) 2³² = 4294967296 (4G)3. 十六进制
3.1 为什么需要十六进制
问题:二进制太长了! 比如:11111111111111111111111111111111 这是32位的二进制数,写起来太麻烦 解决方案:十六进制(Hexadecimal,简称Hex) 十六进制用0-9和A-F表示16种值: 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 153.2 二进制与十六进制转换
技巧:4位二进制 = 1位十六进制 二进制 十六进制 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 例子: 二进制:1111 0000 1010 1011 十六进制: F 0 A B 所以:1111000010101011(二进制) = F0AB(十六进制)3.3 十六进制表示法
不同语言中的十六进制表示: C/C++/Java: 0xFF, 0x1234 汇编(Intel): 0FFh, 1234h 汇编(AT&T): $0xFF Python: 0xFF HTML颜色: #FF0000 常见例子: 0xFF = 255 0x100 = 256 0xFFFF = 65535 0xFFFFFFFF = 42949672954. 数据单位
4.1 位和字节
位 (bit, b): 最小的数据单位 只能是0或1 字节 (Byte, B): 8个位组成1个字节 1 Byte = 8 bits 一个字节能表示:2⁸ = 256种值(0-255) 例子: 01001000 = 72(十进制) = 0x48(十六进制) = 'H'(ASCII字符)4.2 更大的单位
1 KB (Kilobyte) = 1024 Bytes = 2¹⁰ B 1 MB (Megabyte) = 1024 KB = 2²⁰ B 1 GB (Gigabyte) = 1024 MB = 2³⁰ B 1 TB (Terabyte) = 1024 GB = 2⁴⁰ B 注意:硬盘厂商常用1000进制(所以标称容量比实际小)4.3 字(Word)
字的大小取决于CPU架构: 16位CPU:1 Word = 2 Bytes (16 bits) 32位CPU:1 Word = 4 Bytes (32 bits) 64位CPU:1 Word = 8 Bytes (64 bits) 其他术语: 双字 (DWORD) = 4 Bytes (32位) 四字 (QWORD) = 8 Bytes (64位)5. 有符号数与无符号数
5.1 无符号数
无符号数:只能表示非负整数 8位无符号数范围:0 ~ 255 16位无符号数范围:0 ~ 65535 32位无符号数范围:0 ~ 42949672955.2 有符号数(补码表示)
问题:如何表示负数? 解决方案:补码(Two's Complement) 规则:最高位是符号位 - 0 表示正数 - 1 表示负数 8位有符号数例子: 0111 1111 = +127(最大正数) 0000 0001 = +1 0000 0000 = 0 1111 1111 = -1(全1表示-1) 1111 1110 = -2 1000 0000 = -128(最小负数) 8位有符号数范围:-128 ~ +1275.3 如何计算负数的补码
方法:取反加1 例子:求-5的8位补码 1. 写出5的二进制:0000 0101 2. 取反(0变1,1变0):1111 1010 3. 加1:1111 1011 验证:1111 1011 = -5 反向验证:-5 + 5 应该等于0 1111 1011 (-5) + 0000 0101 (+5) = 1 0000 0000 (溢出的1被丢弃,结果是0) ✓6. 位运算
6.1 基本位运算
AND(与):都是1才是1 1010 & 1100 = 1000 OR(或):有1就是1 1010 | 1100 = 1110 XOR(异或):不同为1 1010 ^ 1100 = 0110 NOT(非):取反 ~ 1010 = 01016.2 移位运算
左移(<<):相当于乘以2 0011 << 1 = 0110 (3 → 6) 0011 << 2 = 1100 (3 → 12) 右移(>>):相当于除以2 1100 >> 1 = 0110 (12 → 6) 1100 >> 2 = 0011 (12 → 3)6.3 位运算的妙用
1. 判断奇偶 n & 1 == 0 → 偶数 n & 1 == 1 → 奇数 2. 乘以2 n << 1 等于 n × 2 3. 除以2 n >> 1 等于 n ÷ 2 4. 交换两个数(不用临时变量) a = a ^ b b = a ^ b a = a ^ b 5. 清除最低位的1 n & (n - 1) 6. 保留最低位的1 n & (-n)7. 练习题
练习1:进制转换(难度:★☆☆☆☆)
把下列数转换:
- 二进制 10110 → 十进制?
- 十进制 42 → 二进制?
- 二进制 11011110 → 十六进制?
练习2:补码计算(难度:★★☆☆☆)
计算8位补码表示的-10。
练习3:位运算(难度:★★☆☆☆)
计算:0xAB & 0x0F = ?
8. 小结
[二进制基础] 1. 计算机只认识0和1 2. 二进制转十进制:权重相加 3. 十进制转二进制:除2取余 [十六进制] 4. 4位二进制 = 1位十六进制 5. 用0-9和A-F表示 [数据单位] 6. 1 Byte = 8 bits 7. 字的大小取决于CPU [有符号数] 8. 补码表示:取反加1 9. 最高位是符号位 [位运算] 10. AND, OR, XOR, NOT 11. 左移、右移💡 小白提示
不要急于求成! 二进制和位运算是汇编的基础。 如果这部分还没完全理解, 建议多做几遍练习再继续。 记住:1024个小时的练习, 造就1024种可能!下一篇预告:Day 2 - CPU架构与寄存器
我们将学习CPU是如何工作的,以及最重要的寄存器。
练习题答案将在 Day 2 开头公布