2026年春第一次作业:
教材第19页,第2题;
教材第47页,第5题;
教材第48页,第6题。
第 2 题
一个字节可以用两个十六进制数来表示。填写下表中缺失的项,给出不同字节模式的十进制、二进制和十六进制值。
| 十进制 | 二进制 | 十六进制 |
|---|---|---|
| 0 | 0000 0000 | 0x00 |
| 167 | 1010 0111 | 0xA7 |
| 62 | 0011 1110 | 0x3E |
| 188 | 1011 1100 | 0xBC |
| 55 | 0011 0111 | 0x37 |
| 136 | 1000 1000 | 0x88 |
| 243 | 1111 0011 | 0xF3 |
| 82 | 0101 0010 | 0x52 |
| 172 | 1010 1100 | 0xAC |
| 231 | 1110 0111 | 0xE7 |
解题过程:
转换方法说明:
- 十进制 → 十六进制:将十进制数除以 16,商为高位,余数为低位。余数 10~15 分别用 A~F 表示。
- 二进制 → 十六进制:将二进制每 4 位一组,分别转换为一个十六进制数字(
0000=0,0001=1, …,1001=9,1010=A,1011=B,1100=C,1101=D,1110=E,1111=F)。- 十六进制 → 二进制:将每个十六进制数字展开为 4 位二进制。
- 十六进制 → 十进制:高位 × 16 + 低位。
已知十进制,求二进制和十六进制:
- 167:
- 二进制:167 = 128 + 32 + 4 + 2 + 1 = 2⁷ + 2⁵ + 2² + 2¹ + 2⁰ →
1010 0111 - 十六进制:167 ÷ 16 = 10 余 7 → 高位 A,低位 7 →
0xA7
- 二进制:167 = 128 + 32 + 4 + 2 + 1 = 2⁷ + 2⁵ + 2² + 2¹ + 2⁰ →
- 62:
- 二进制:62 = 32 + 16 + 8 + 4 + 2 = 2⁵ + 2⁴ + 2³ + 2² + 2¹ →
0011 1110 - 十六进制:62 ÷ 16 = 3 余 14 → 高位 3,低位 E →
0x3E
- 二进制:62 = 32 + 16 + 8 + 4 + 2 = 2⁵ + 2⁴ + 2³ + 2² + 2¹ →
- 188:
- 二进制:188 = 128 + 32 + 16 + 8 + 4 = 2⁷ + 2⁵ + 2⁴ + 2³ + 2² →
1011 1100 - 十六进制:188 ÷ 16 = 11 余 12 → 高位 B,低位 C →
0xBC
- 二进制:188 = 128 + 32 + 16 + 8 + 4 = 2⁷ + 2⁵ + 2⁴ + 2³ + 2² →
已知二进制,求十进制和十六进制:
- 0011 0111:
- 十进制:32 + 16 + 4 + 2 + 1 = 55
- 十六进制:
0011= 3,0111= 7 →0x37
- 1000 1000:
- 十进制:128 + 8 = 136
- 十六进制:
1000= 8,1000= 8 →0x88
- 1111 0011:
- 十进制:128 + 64 + 32 + 16 + 2 + 1 = 243
- 十六进制:
1111= F,0011= 3 →0xF3
已知十六进制,求十进制和二进制:
- 0x52:
- 十进制:5 × 16 + 2 = 82
- 二进制:
5=0101,2=0010→0101 0010
- 0xAC:
- 十进制:A(10) × 16 + C(12) = 160 + 12 = 172
- 二进制:
A=1010,C=1100→1010 1100
- 0xE7:
- 十进制:E(14) × 16 + 7 = 224 + 7 = 231
- 二进制:
E=1110,7=0111→1110 0111
第 5 题
假设寄存器%eax的值为 x,%ecx的值为 y。填写下表,指明下面每条汇编代码指令存储在寄存器%edx中的值。
| 指令 | 结果 |
|---|---|
leal 6(%eax), %edx | x + 6 |
leal (%eax,%ecx), %edx | x + y |
leal (%eax,%ecx,4), %edx | x + 4y |
leal 7(%eax,%eax,8), %edx | 7 + 9x |
leal 0xA(,%eax,4), %edx | 10 + 4x |
leal 9(%eax,%ecx,2), %edx | 9 + x + 2y |
解题过程:
leal(Load Effective Address) 指令计算地址表达式的值,但不访问内存,而是将计算出的地址值直接存入目标寄存器。
通用格式:leal imm(base, index, scale), dest→dest = imm + base + index × scale
leal 6(%eax), %edx:edx = 6 + eax =x + 6leal (%eax,%ecx), %edx:edx = eax + ecx =x + yleal (%eax,%ecx,4), %edx:edx = eax + ecx × 4 =x + 4yleal 7(%eax,%eax,8), %edx:edx = 7 + eax + eax × 8 = 7 + 9 × eax =7 + 9xleal 0xA(,%eax,4), %edx:edx = 0xA + eax × 4 =10 + 4xleal 9(%eax,%ecx,2), %edx:edx = 9 + eax + ecx × 2 =9 + x + 2y
第 6 题
假设下面的值存放在指定的存储器地址和寄存器中:
| 地址 | 值 |
|---|---|
| 0x100 | 0xFF |
| 0x104 | 0xAB |
| 0x108 | 0x13 |
| 0x10C | 0x11 |
| 寄存器 | 值 |
|---|---|
| %eax | 0x100 |
| %ecx | 0x1 |
| %edx | 0x3 |
填写下表,给出下面指令的效果,说明将被更新的寄存器或存储器位置,以及得到的值。
| 指令 | 目的 | 值 |
|---|---|---|
addl %ecx, (%eax) | 0x100 | 0x100 |
subl %edx, 4(%eax) | 0x104 | 0xA8 |
imull $16, (%eax,%edx,4) | 0x10C | 0x110 |
incl 8(%eax) | 0x108 | 0x14 |
decl %ecx | %ecx | 0x0 |
subl %edx, %eax | %eax | 0xFD |
解题过程:
addl %ecx, (%eax):将 %ecx 加到 M[%eax] 上。目的地址 = %eax = 0x100,值 = M[0x100] + %ecx = 0xFF + 0x1 =0x100十六进制加法详解:0xFF + 0x1 = 0x100
十六进制加法与十进制加法规则相同,区别在于逢 16 进 1(十进制是逢 10 进 1)。
按位从低位到高位相加:
- 最低位:F + 1 = 15 + 1 = 16 =1 × 16 + 0,写下0,向高位进1
- 次低位:F + 0 + 进位 1 = 15 + 1 = 16 =1 × 16 + 0,写下0,向高位进1
- 最高位:0 + 0 + 进位 1 =1,写下1
拼合结果:0x100
直观理解:0xFF 是一个字节能表示的最大值(十进制 255),加 1 后溢出为 0x100(十进制 256),类似十进制中 99 + 1 = 100 的进位过程。
subl %edx, 4(%eax):从 M[%eax+4] 中减去 %edx。目的地址 = 0x100 + 4 = 0x104,值 = M[0x104] - %edx = 0xAB - 0x3 =0xA8imull $16, (%eax,%edx,4):将 M[%eax + %edx×4] 乘以 16。目的地址 = 0x100 + 0x3 × 4 = 0x10C,值 = M[0x10C] × 16 = 0x11 × 0x10 =0x110十六进制乘法详解:0x11 × 0x10 = 0x110
十六进制乘法与十进制乘法规则相同,逢 16 进位。
乘以 0x10(即十进制 16)等价于左移一位,末尾补 0,类似十进制中乘以 10 的效果:
- 0x11 × 0x10 → 在 0x11 末尾补一个 0 →0x110
验证(转为十进制):0x11 = 1×16 + 1 = 17,0x10 = 16,17 × 16 = 272 = 1×256 + 1×16 + 0 = 1×16² + 1×16¹ + 0×16⁰ =0x110✓
incl 8(%eax):将 M[%eax+8] 加 1。目的地址 = 0x100 + 8 = 0x108,值 = M[0x108] + 1 = 0x13 + 1 =0x14decl %ecx:将 %ecx 减 1。目的 = %ecx,值 = 0x1 - 1 =0x0subl %edx, %eax:从 %eax 中减去 %edx。目的 = %eax,值 = 0x100 - 0x3 =0xFD