课件来源:cod 版 Slide 371–412。共 18 题:课件原题 9 题(100% 收录课件中的例题/示例)+ 考点补充题 9 题。计算题均给出全部步骤;课件存疑处已标注。
指令字长 16 位,每个地址码 4 位,采用扩展操作码技术。课件方案中三地址、二地址、一地址、零地址指令各最多多少条?写出各级操作码的二进制范围;并说明:三地址操作码每减少一种,可多构成多少种二地址指令?二地址操作码每减少一种呢?
解答:
要点:短操作码不能是长操作码的前缀,故每级必须保留全 1 编码作扩展窗口。
设指令字长 32 位、操作码固定 8 位。分别求四地址、三地址、二地址、一地址指令的地址码位数、寻址范围和访存次数;并说明 PC 代替 A4、A3 用 A1 或 A2 代替、结果存于 ACC、ACC 代替 A1(或 A2)各得到什么格式。
解答:
| 地址数 | 地址码位数计算 | 每段地址位数 | 寻址范围 | 访存次数(含取指) |
|---|---|---|---|---|
| 四地址 | (32−8)/4 = 6 | 6 | 2⁶ = 64 | 4(取指1+取数2+存结果1) |
| 三地址 | (32−8)/3 = 8 | 8 | 2⁸ = 256 | 4(同上) |
| 二地址 | (32−8)/2 = 12 | 12 | 2¹² = 4 K | 4;结果存 ACC 时 3(取指1+取数2) |
| 一地址 | 32−8 = 24 | 24 | 2²⁴ = 16 M | 2(取指1+取数1,结果写 ACC) |
| 零地址 | 无地址码 | — | — | 操作数隐含(堆栈/ACC) |
演化:四地址中 PC 代替 A4(下条指令地址自动给出)→ 三地址;三地址中 A3 用 A1 或 A2 代替(结果覆盖源操作数)→ 二地址;二地址中 ACC 代替 A1(或 A2)且结果存 ACC → 一地址;操作数全隐含 → 零地址(课件 p.375–376)。
地址 305 处为指令 SKP DZ(D=0 则跳,D 为完成触发器),306、307 为后续两条指令。问 D=0 和 D=1 时,下一条执行的指令地址各是多少?
解答:
读课件指令寻址示例图(0: LDA 1000;1: ADD 1001;2: DEC 1200;3: JMP 7;4: LDA 2000;5: SUB 2001;6: INC;7: STA 2500;8: LDA 1100),写出实际执行流中每次取指后 PC 的内容及所用的指令寻址方式。
解答:
| 执行顺序 | 指令地址 | 指令 | 取指后 PC | 获得下条指令的寻址方式 |
|---|---|---|---|---|
| 1 | 0 | LDA 1000 | 1 | 顺序 (PC)+1→PC |
| 2 | 1 | ADD 1001 | 2 | 顺序 |
| 3 | 2 | DEC 1200 | 3 | 顺序 |
| 4 | 3 | JMP 7 | 4,执行后 PC=7 | 跳跃(由转移指令指出) |
| 5 | 7 | STA 2500 | 8 | 顺序 |
| 6 | 8 | LDA 1100 | 9 | 顺序 |
即执行流 0→1→2→3→7→8→9;地址 4、5、6 的指令被跳过(课件 p.386)。
课件"间接寻址编程举例"中,主程序在 80 与 201 两处调用同一子程序,返回地址分别为 81 与 202。说明如何利用间接寻址实现子程序返回,为什么不必修改子程序中的指令。
解答:
设数据块首地址为 D,求 N 个数的平均值。分别用直接寻址和变址寻址编写程序,统计指令条数并比较。
解答:
(本题助记符沿用课件模型机,如 LDA/STA/LDX/INX/CPX/BNE,非 8086 语法。)
直接寻址(课件 p.397):
LDA D ; 取第 1 个数
ADD D+1 ; 加第 2 个数
ADD D+2 ; 加第 3 个数
; ……
ADD D+(N-1) ; 加第 N 个数
DIV #N ; 除以 N(立即数)
STA ANS ; 存平均值
条数 = 1 + (N−1) + 1 + 1 = N+2 条,随 N 线性增长。
变址寻址(X 为变址寄存器,D 为形式地址,课件 p.397):
LDA #0 ; ACC 清 0(累加器)
LDX #0 ; 变址寄存器 X 清 0
M: ADD X, D ; EA=(X)+D,累加第 (X)+1 个数
INX ; (X)+1→X
CPX #N ; (X) 与 #N 比较
BNE M ; 结果不为零则转 M,循环 N 次
DIV #N ; 求平均
STA ANS ; 存结果
共 8 条,与 N 无关。结论:变址寻址把"变化的地址"交给寄存器,形式地址 D 不变,特别适合数组/循环处理(课件 p.396–397)。
课件相对寻址举例:M: ADD X, D;M+1: INX;M+2: CPX #N;M+3: BNE M(相对寻址特征 *)。课件给出位移量 −3、EA = (M+3) − 3 = M。解释该位移量的含义,并说明为什么程序浮动时位移量不变。
解答:
按字节寻址。当前指令地址 PC = 2000H,指令 JMP *+8 为二字节指令,转移目的地址为 2008H。求该指令第二字节(位移量)的十六进制值。
解答:
课件堆栈寻址举例:栈底 200H,栈向低地址生长。PUSH A 前 ACC=15、SP=200H、(200H)=X;POP A 前 ACC=Y。写出 PUSH A 后与 POP A 后 ACC、SP 及相关主存单元的内容,并说明进栈/出栈的操作顺序。
解答:
| 状态 | ACC | SP | 主存 |
|---|---|---|---|
| PUSH A 前 | 15 | 200H | (200H)=X |
| PUSH A 后 | 15 | 1FFH | (1FFH)=15,(200H)=X |
| POP A 前 | Y | 1FFH | (1FFH)=15 |
| POP A 后 | 15 | 200H | (1FFH)=15(保留),(200H)=X |
操作顺序(课件 p.401–402):
一次间接寻址在执行阶段的访存次数为( )。 A. 1 B. 2 C. 3 D. 4
解答:选 B。
填写下表的有效地址表达式与执行阶段访存次数(软堆栈按每次进/出栈计)。
| 寻址方式 | EA | 执行阶段访存 |
|---|---|---|
| 立即 | ① | ② |
| 直接 | ③ | 1 |
| 隐含 | 隐含于操作码(不设空) | 视指令(如 ADD A 为 1) |
| 间接(一次) | ④ | ⑤ |
| 寄存器 | ⑥ | 0 |
| 寄存器间接 | ⑦ | ⑧ |
| 基址 | ⑨ | 1 |
| 变址 | ⑩ | 1 |
| 相对 | ⑪ | 1 |
| 堆栈 | ⑫ | 1 |
解答:① 无 EA,操作数即形式地址 A;② 0;③ A;④ (A);⑤ 2;⑥ Ri;⑦ (Ri);⑧ 1;⑨ (BR)+A;⑩ (IX)+A;⑪ (PC)+A(PC 为取指后内容);⑫ (SP)。(课件 p.387–403)
基址寻址与变址寻址的 EA 公式形式相同,简述两者的区别(寄存器内容谁设定、执行中谁可变、典型用途)。
解答(评分要点):
指令字长 16 位,每段地址码 4 位。要求三地址指令 12 条、二地址指令 62 条、一地址指令 30 条,问零地址指令最多可有多少条?给出一组可行的操作码分配。
解答:
答:零地址指令最多 32 条。校验:12 + 62/16 + 30/256 + 32/4096 = 12/16 + 62/256 + 30/4096 + 32/65536 = 0.75+0.2421875+0.00732421875+0.00048828125 = 1,编码空间恰好用完,方案可行。
按字编址、每指令 1 字。当前指令地址 100,取指后 PC=101,形式地址 A=200。已知 (200)=300、(300)=400、(1200)=600、(250)=700、(301)=800;(R1)=300、(BR)=1000、(IX)=50。求立即、直接、间接、寄存器、寄存器间接、基址、变址、相对八种方式下的有效地址(或操作数来源)与操作数。
解答:
| 寻址方式 | EA 计算 | EA | 操作数 |
|---|---|---|---|
| 立即 | 操作数=A,无 EA | — | 200 |
| 直接 | EA=A | 200 | (200)=300 |
| 间接 | EA=(A)=(200) | 300 | (300)=400 |
| 寄存器 | EA=R1 | R1 | (R1)=300 |
| 寄存器间接 | EA=(R1) | 300 | (300)=400 |
| 基址 | EA=(BR)+A=1000+200 | 1200 | (1200)=600 |
| 变址 | EA=(IX)+A=50+200 | 250 | (250)=700 |
| 相对 | EA=(PC)+A=101+200 | 301 | (301)=800 |
要点:① 相对寻址必须用取指后 PC=101,用 100 会错得 EA=300;② 间接与寄存器间接 EA 相同但地址来源不同(主存 vs 寄存器);③ 括号一律表示"取内容"。
栈向低地址生长、SP 指向栈顶。初值 SP=2000H。① 按字节编址、存储字长 32 位:连续 3 次进栈、再 2 次出栈后 SP 为多少?栈顶地址?② 若改为按字编址,同样操作后 SP 为多少?
解答:
① 按字节编址、字长 32 位:每次进栈 (SP)−4→SP,出栈 (SP)+4→SP(课件 p.403)。
② 按字编址:每次 ±1(课件 p.403)。进栈:1FFFH、1FFEH、1FFDH;出栈:1FFEH、1FFFH;最终 SP=1FFFH。
结论:SP 修改量 = 一个存储字的字节数(按字编址时为 1 个地址单位),与编址方式直接相关。
简述 RISC 的主要特征(至少 5 条),并指出 RISC 相对 CISC 的一个主要缺点。
解答(评分要点,课件 p.410–412):
下列 8086 指令中,指令字长为 4 字节的是( )。 A. ADD AX, BX B. ADD AX, 3048H C. ADD AX, [3048H] D. INC AX
解答:选 C(课件 p.408)。
某机 7 条指令的使用频度依次为 0.40、0.20、0.15、0.10、0.08、0.05、0.02。① 构造哈夫曼操作码,给出各指令码长与一种编码;② 求平均码长;③ 与等长操作码比较,并说明为何实际机器不全部采用哈夫曼操作码。
解答:
① 哈夫曼合并过程(每次合并两个最小频度):
一种编码(左 0 右 1):I1(0.40)=0;I4(0.10)=100;I3(0.15)=101;I2(0.20)=111;I5(0.08)=1101;I7(0.02)=11000;I6(0.05)=11001。码长依次为 1、3、3、3、4、5、5 位(任一编码均非其他编码的前缀)。
② 平均码长 L = Σ pᵢ×l = 0.40×1 + 0.20×3 + 0.15×3 + 0.10×3 + 0.08×4 + 0.05×5 + 0.02×5 = 0.40+0.60+0.45+0.30+0.32+0.25+0.10 = 2.42 位/指令。
③ 等长操作码需 ⌈log₂7⌉ = 3 位;哈夫曼平均节省 3−2.42 = 0.58 位/指令。但哈夫曼操作码长度不规则,译码硬件复杂、不利于流水与规整格式,故实际机器多用等长扩展操作码折中(课件 p.373–374 只讲等长扩展;哈夫曼为补充常识)。