|
| 1 | ++++ |
| 2 | +date = '2025-09-07T23:32:42+08:00' |
| 3 | +draft = false |
| 4 | +title = '0906学习日志' |
| 5 | + |
| 6 | +categories="log" |
| 7 | + |
| 8 | +tags=["计算机组成原理","指令系统","RISC","CISC","程序的机器级代码表示","汇编语言","常用指令"] |
| 9 | + |
| 10 | ++++ |
| 11 | + |
| 12 | +## 计算机组成原理-死去的RISC-V突然攻击我 |
| 13 | + |
| 14 | +### 程序的机器级代码表示 |
| 15 | + |
| 16 | +1. 常用汇编指令介绍 |
| 17 | + |
| 18 | + 1. 相关寄存器 |
| 19 | + |
| 20 | + | 16bit | 32bit | 说明 | |
| 21 | + | ----- | ----- | --------------------------- | |
| 22 | + | AX | EAX | 累加器(Accumulator) | |
| 23 | + | BX | EBX | 基地址寄存器(Base Register) | |
| 24 | + | CX | ECX | 计数寄存器(Count Register) | |
| 25 | + | DX | EDX | 数据寄存器(Data Register) | |
| 26 | + | | ESI | 变址寄存器(Index Register) | |
| 27 | + | | EDI | 变址寄存器(Index Register) | |
| 28 | + | | EBP | 堆栈基指针(Base Pointer) | |
| 29 | + | | ESP | 堆栈顶指针(Stack Pointer) | |
| 30 | + |
| 31 | + 2. 汇编指令格式 |
| 32 | + |
| 33 | + 1. AT&T 格式简介 |
| 34 | + |
| 35 | + - 主要用于 **GNU Assembler (GAS)**,即 `gcc` 默认输出。 |
| 36 | + |
| 37 | + - 语法较“繁琐”,但严格、明确,容易让编译器处理。 |
| 38 | + |
| 39 | + - 特点:寄存器有 `%` 前缀,立即数 `$` 前缀,操作数顺序是 `源, 目的`。 |
| 40 | + |
| 41 | + 示例: |
| 42 | + |
| 43 | + ```asm |
| 44 | + movl $5, %eax # 把立即数 5 移动到 eax |
| 45 | + addl %eax, %ebx # ebx = ebx + eax |
| 46 | + movl 8(%ebp), %ecx # 从 [ebp+8] 取数到 ecx |
| 47 | + ``` |
| 48 | +
|
| 49 | + 2. Intel 格式简介 |
| 50 | +
|
| 51 | + - 常见于 **MASM / NASM / Windows 平台**。 |
| 52 | +
|
| 53 | + - 更接近高级语言风格,简洁直观,广泛用于手写汇编和逆向分析。 |
| 54 | +
|
| 55 | + - 特点:操作数顺序 `目的, 源`,寄存器无 `%`,立即数直接写,内存寻址用 `[]`。 |
| 56 | +
|
| 57 | + 示例: |
| 58 | + |
| 59 | + ```asm |
| 60 | + mov eax, 5 ; 把立即数 5 移动到 eax |
| 61 | + add ebx, eax ; ebx = ebx + eax |
| 62 | + mov ecx, [ebp+8] ; 从 [ebp+8] 取数到 ecx |
| 63 | + ``` |
| 64 | + |
| 65 | + |
| 66 | +
|
| 67 | + 3. 对比表:AT&T vs Intel 汇编格式 |
| 68 | +
|
| 69 | + | 特点 | **AT&T 格式** | **Intel 格式** | |
| 70 | + | -------------- | --------------------------------------------------- | ------------------------------------------------------- | |
| 71 | + | **操作数顺序** | 源, 目的 | 目的, 源 | |
| 72 | + | **寄存器** | `%eax`、`%ebx` | `eax`、`ebx` | |
| 73 | + | **立即数** | `$5` | `5` | |
| 74 | + | **内存寻址** | `disp(base, index, scale)` → `8(%ebp, %ecx, 4)` | `[base + index*scale + disp]` → `[ebp + ecx*4 + 8]` | |
| 75 | + | **操作数大小** | 指令后缀:`b`=8位, `w`=16位, `l`=32位, `q`=64位 | `byte ptr`, `word ptr`, `dword ptr`, `qword ptr` | |
| 76 | + | **符号/变量** | `movl $var, %eax` (取地址) `movl var, %eax` (取值) | `mov eax, offset var` (取地址) `mov eax, [var]` (取值) | |
| 77 | + | **汇编器** | GNU Assembler (`gas`) | MASM, NASM, FASM 等 | |
| 78 | + | **常见平台** | Linux/Unix 系统 | Windows、逆向工程 | |
| 79 | +
|
| 80 | + 3. 常用指令 |
| 81 | +
|
| 82 | + * <reg> |
| 83 | + * <mem> |
| 84 | + * <con>,<con32> |
| 85 | +
|
| 86 | + 1. 数据传送指令 |
| 87 | + 1. mov |
| 88 | + 2. push |
| 89 | + 3. pop |
| 90 | + 2. 算术和逻辑运算指令 |
| 91 | + 1. add/sub |
| 92 | + 2. inc/dec |
| 93 | + 3. imul |
| 94 | + 4. idiv |
| 95 | + 5. and/or/xor |
| 96 | + 6. not |
| 97 | + 7. neg |
| 98 | + 8. shl/shr |
| 99 | + 3. 控制流指令 |
| 100 | + 1. jmp |
| 101 | + 2. jcondition: je,jz,jne,jg,jge,jl,jle |
| 102 | + 3. cmp/test |
| 103 | + 4. call/ret |
| 104 | +
|
| 105 | +2. 选择语句的机器级表示 |
| 106 | +
|
| 107 | + ```pseudocode |
| 108 | + if(test_expr) |
| 109 | + then_statement |
| 110 | + else |
| 111 | + else_statement |
| 112 | + ``` |
| 113 | + |
| 114 | + ```pseudocode |
| 115 | + t=test_expr |
| 116 | + if(!t) |
| 117 | + goto false; |
| 118 | + then_statement |
| 119 | + goto done; |
| 120 | + false: |
| 121 | + else_statement |
| 122 | + done; |
| 123 | + ``` |
| 124 | + |
| 125 | +3. 循环语句的机器级表示 |
| 126 | + |
| 127 | + 1. do-while |
| 128 | + |
| 129 | + ```pseudocode |
| 130 | + do |
| 131 | + body_statement |
| 132 | + while(test_expr); |
| 133 | + ``` |
| 134 | +
|
| 135 | + ```pseudocode |
| 136 | + loop: |
| 137 | + body_statement |
| 138 | + t=test_expr; |
| 139 | + if(t) |
| 140 | + goto loop; |
| 141 | + ``` |
| 142 | +
|
| 143 | + 2. while |
| 144 | +
|
| 145 | + ```pseudocode |
| 146 | + while(test_expr) |
| 147 | + body_statement |
| 148 | + ``` |
| 149 | +
|
| 150 | + ```pseudocode |
| 151 | + t=test_expr; |
| 152 | + if(!t) |
| 153 | + goto done; |
| 154 | + loop: |
| 155 | + body_statement; |
| 156 | + t=test_expr; |
| 157 | + if(t) |
| 158 | + goto loop; |
| 159 | + done: |
| 160 | + ``` |
| 161 | +
|
| 162 | + 3. for |
| 163 | +
|
| 164 | + ```pseudocode |
| 165 | + for(init_expr;test_expr;update_expr) |
| 166 | + body_statement |
| 167 | + ``` |
| 168 | +
|
| 169 | + ```pseudocode |
| 170 | + init_expr; |
| 171 | + t=test_expr; |
| 172 | + if(!t) |
| 173 | + goto done; |
| 174 | + loop: |
| 175 | + body_statement |
| 176 | + update_expr; |
| 177 | + t=test_expr; |
| 178 | + if(t) |
| 179 | + goto loop; |
| 180 | + done: |
| 181 | + ``` |
| 182 | +
|
| 183 | +4. 过程调用的机器级表示 |
| 184 | +
|
| 185 | +------ |
| 186 | +
|
| 187 | +
|
| 188 | +
|
| 189 | +### CISC和RISC的基本概念 |
| 190 | +
|
| 191 | +1. 复杂指令系统计算机(CISC) |
| 192 | +
|
| 193 | + - 特点:指令集复杂,每条指令可以完成较复杂的操作,指令长度不固定。 |
| 194 | + - 设计理念:**软件简单化,把更多功能交给硬件来完成**。 |
| 195 | + - 常见架构:x86、VAX、68000。 |
| 196 | +
|
| 197 | +2. 精简指令系统计算机(RISC) |
| 198 | +
|
| 199 | + - 特点:指令集简单,每条指令长度固定,执行时间大多相同。 |
| 200 | + - 设计理念:**硬件简单化,指令执行快,依靠编译器优化来实现复杂功能**。 |
| 201 | + - 常见架构:ARM、MIPS、RISC-V、SPARC。 |
| 202 | +
|
| 203 | +3. CISC和RISC的比较 |
| 204 | +
|
| 205 | + | 特点 | **RISC**(精简指令集) | **CISC**(复杂指令集) | |
| 206 | + | ---------------- | -------------------------- | -------------------------- | |
| 207 | + | **指令数量** | 少,指令集精简 | 多,指令功能复杂 | |
| 208 | + | **指令长度** | 固定(常见 32 位) | 不固定(8~120 字节不等) | |
| 209 | + | **指令执行时间** | 大多数指令 1 个时钟周期 | 指令执行时间差别大 | |
| 210 | + | **寻址方式** | 少(常 3~5 种) | 多(十几种甚至几十种) | |
| 211 | + | **硬件复杂度** | 控制器一般为硬布线(简单) | 控制器常为微程序(复杂) | |
| 212 | + | **编译器依赖性** | 高,复杂操作要由编译器分解 | 低,硬件可直接完成复杂操作 | |
| 213 | + | **性能优化方式** | 通过流水线、寄存器优化 | 通过复杂指令减少代码长度 | |
| 214 | + | **代表架构** | ARM、MIPS、RISC-V | x86、Intel 8086、VAX | |
| 215 | + | **代码密度** | 代码长(指令多) | 代码短(指令少,但复杂) | |
| 216 | +
|
| 217 | +
|
| 218 | +
|
0 commit comments