🏷️ 知识点:指令寻址方式
下列寻址方式中,最适合按下标顺序访问一维数组元素的是()。
A. 相对寻址 B. 寄存器寻址 C. 直接寻址 D. 变址寻址
[tag_link]
正确答案:D
在 变址寻址 时,将计算机指令中的地址与变址寄存器中的地址相加,得到有效地址,指令提供数组首地址,由变址寄存器来定位数据中的各元素。所以它最适合按下标顺序访问一维数组元素,故选 D。相对寻址以 PC 为基地址,以指令中的地址为偏移量确定有效地址。寄存器寻址则是在指令中指出需要使用的寄存器。直接寻址是在指令的地址字段直接指出操作数的有效地址。
偏移寻址将某个寄存器内容与一个形式地址相加而生成有效地址。下列寻址方式中,不属于偏移寻址 方式的是()。
A. 间接寻址
B. 基址寻址
C. 相对寻址
D. 变址寻址
[tag_link]
正确答案:A
间接寻址 不需要寄存器,EA = (A)。基址寻址 EA = A + 基址寄存器 BR 内容;相对寻址 EA= A + 程序计数器 PC 内容;变址寻址 EA = A + 变址寄存器 IX 内容。后三者都是将某个寄存器内容与一个形式地址相加而形成有效地址,故选 A。
某计算机采用16 位定长指令字格式,操作码位数和寻址方式位数固定,指令系统有48条指令,支 持直接、间接、立即、相对4种寻址方式,单地址指令中直接寻址方式可寻址范围是()。
A.0~255; B.0~1023; C.-128~127; D.-512~511;
[tag_link]
正确答案:A
参考 指令格式 ,48 条指令需要 6 位操作码字段 ( 2 5 < 48 < 2 6 ), 4 种寻址方式需要 2 位寻址特征位 ( 4 = 2 2 ), 还剩 16 - 6 - 2 = 8 位作为地址码,故直接寻址范围为 0 ~ 255。注意,主存地址不能为负。🚫 常见误区说明: 在 相对寻址 中,可能会有 有符号偏移 ,比如 -128 ~ 127 或 -512 ~ 511 ,那是针对偏移字段的符号解释;直接寻址不需要符号位 ,它就是一个 无符号绝对地址 。
下列关于各种寻址方式获取操作数快慢的说法中,正确的是( )。 Ⅰ. 立即寻址快于堆栈寻址 Ⅱ. 堆栈寻址快于寄存器寻址 Ⅲ. 寄存器一次间接寻址快于变址寻址 Ⅳ. 变址寻址快于一次间接寻址
A. Ⅰ和Ⅳ B. Ⅱ和Ⅲ C. Ⅰ、Ⅲ和Ⅳ D. Ⅲ和Ⅳ
[tag_link]
正确答案:C
Ⅰ. 立即寻址中操作数直接包含在指令中,无需访问内存或寄存器,因此获取速度最快; 堆栈寻址通常需要通过堆栈指针访问内存,涉及内存访问,速度较慢。 故立即寻址快于堆栈寻址,Ⅰ正确。 Ⅱ. 堆栈寻址需要访问内存,而寄存器寻址直接访问CPU内部寄存器,寄存器寻址速度更快。 因此堆栈寻址快于寄存器寻址的说法错误,Ⅱ不正确。 Ⅲ. 寄存器一次间接寻址先从寄存器获取地址,再访问内存一次; 变址寻址需计算地址(基址加偏移量)后再访问内存一次。 由于变址寻址多了地址计算步骤,寄存器一次间接寻址通常更快,Ⅲ正确。 Ⅳ. 变址寻址经过一次地址计算和一次内存访问; 一次间接寻址(通常指内存间接)需两次内存访问(先取地址再取操作数)。 因此变址寻址快于一次间接寻址,Ⅳ正确。 综上,Ⅰ、Ⅲ和Ⅳ正确,对应选项C。
为了缩短指令中某个地址段的位数,有效的方法是采取( )。
A. 立即寻址 B. 变址寻址 C. 间接寻址 D. 寄存器寻址
[tag_link]
正确答案:D
为了缩短指令中地址段的位数,有效的方法是采用寄存器寻址。 在寄存器寻址中,操作数存储在寄存器中,指令中只需指定寄存器编号。 由于寄存器数量有限(例如,32 个寄存器仅需 5 位二进制表示),而内存地址通常需要较多位数(如 32 位或 64 位),因此使用寄存器编号替代内存地址能显著减少地址段所需的位数。
其他选项分析:立即寻址将操作数直接包含在指令中,虽能缩短指令整体长度,但它是消除地址段而非缩短地址段位数; 变址寻址通过寄存器与偏移量组合形成地址,偏移量可能较短,但需额外指定寄存器,不直接优化地址段位数; 间接寻址指令中包含一个间接地址,该地址位数通常与内存地址相近,不能有效缩短地址段位数。 因此,寄存器寻址是最直接有效的方法。
假设寄存器 R 中的数值为 200,主存地址为 200 和 300 的地址单元中存放的内容分别是 300 和 400,则( )访问到的操作数为 200。
A. Ⅰ和Ⅳ B. Ⅱ、Ⅲ C. Ⅲ、Ⅳ D. 只有Ⅰ
[tag_link]
正确答案:D
本题考查各种数据寻址方式的原理。 直接寻址 200 中,200 就是有效地址,所访问的主存地址 200 对应的内容是 300,Ⅰ错误。 寄存器间接寻址(R)的访问结果与Ⅰ一样,Ⅱ错误。 存储器间接寻址(200)表示主存地址 200 中的内容为有效地址,所以有效地址为 300,访问的操作数是 400,Ⅲ错误。 寄存器寻址 R 表示寄存器 R 的内容即为操作数,所以只有Ⅳ正确。 此类题建议画出草图。
下列关于基址寻址和变址寻址的说法中,正确的是( )。 I. 两者都扩大指令的寻址范围 II. 变址寻址适合于编制循环程序 III. 基址寻址适合于多程序设计 IV. 基址寄存器的内容由操作系统确定,在执行的过程中可变 V. 变址寄存器的内容由用户确定,在执行的过程中不可变
A. I、II 和 III B. I、II 和 V C. II 和 III D. II、III、IV 和 V
[tag_link]
正确答案:A
基址寻址和变址寻址都是通过将寄存器内容与指令中的地址字段相加来形成有效地址,这可以突破指令地址字段的长度限制,从而扩大寻址范围,因此说法 I 正确。 变址寻址中,变址寄存器的值可以在程序执行中动态变化,便于遍历数组或重复执行类似操作,非常适合编制循环程序,说法 II 正确。 基址寻址通过基址寄存器实现程序重定位,使操作系统能将程序加载到内存任意位置,利于多道程序设计中的内存管理,说法 III 正确。
说法 IV 错误,因为基址寄存器的内容通常由操作系统在程序加载时设定,但在程序执行过程中一般保持不变,以确保地址翻译的稳定性。 说法 V 错误,变址寄存器的内容由用户程序设定,且在执行过程中经常变化(如在循环中修改),以实现灵活的数据访问。 因此,正确说法为 I、II 和 III,对应选项 A。
假设变址寄存器R 的内容为1000H, 指令中的形式地址为2000H; 地址1000H 中的内容为2000H, 地 址2000H 中的内容为3000H, 地址,3000H 的内容为4000H, 则变址寻址方式下访问到的操作数是()。 A.1000H
A.1000H
B.2000H
C.3000H
D.4000H
[tag_link]
正确答案:D
根据 变址寻址 的方法,变址寄存器的内容(1000H)与形式地址的内容(2000H)相加,得到操作数的实际地址(3000H), 根据实际地址访问内存,获取操作数 4000H。
假设变址寄存器 R 的内容为 1000H,指令中的形式地址为 2000H;地址 1000H 中的内容为 2000H,地址 2000H 中的内容为 3000H,地址 3000H 的内容为 4000H,则变址寻址方式下访问到的操作数是()。
A.1000H
B.2000H
C.3000H
D.4000H
[tag_link] 正确答案:D根据 变址寻址 的方法,变址寄存器的内容(1000H)与形式地址的内容(2000H)相加,得到操作数的实际地址(3000H), 根据实际地址访问内存,获取操作数 4000H。
某计算机有16个通用寄存器,采用32位定长指令字,操作码字段(含寻址方式位)为8位, Store 指 令的源操作数和目的操作数分别采用寄存器直接寻址和基址寻址方式。若基址寄存器可使用任一通用寄存 器,且偏移量用补码表示,则Store 指令中偏移量的取值范围是()。
A.-32768~+32767
B.-32767+~32768
C.-65536~+65535
D.-65535~+65536
[tag_link]
正确答案:A
采用 32 位定长指令字,其中操作码为 8 位,两个地址码一共占用 32-8=24 位,而 Store 指令的源操作数和目的操作数分别采用寄存器直接寻址和基址寻址,机器中共有 16 个通用寄存器,则寻址一个寄存器需要 logz16 =4 位,源操作数中的寄存器直接寻址用掉 4 位,而目的操作数采用基址寻址也要指定一个寄存器,同样用掉 4 位,则留给偏移址的位数为 24-4-4=16 位,而偏移址用补码表示,16 位补码的表示范围为 -32768~+32767,选 A。
某指令格式如下所示。
其中M 为寻址方式,I 为变址寄存器编号,D 为形式地址。若采用先变址后间址的寻址方式,则操作数的 有效地址是()。
A. I+D
B. (I)+D
C. ((I)+D)
D. ((I))+D
[tag_link]
正确答案:C
变址寻址 中,有效地址 EA 等于指令字中的形式地址 D 与变址寄存器 I 的内容相加之和,即 EA= (I)+ D。间接寻址是相对于直接寻址而言的,指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数地址的地址,即 EA=(D)。从而该 操作数的有效地址是 ((I)+ D)。
某指令功能为R[r2]-R[r1]+M[R[r0]], 其两个源操作数分别采用寄存器、寄存器间接寻址方式。对于 下列给定部件,该指令在取数及执行过程中需要用到的是()。
I. 通用寄存器组(GPRs) II. 算术逻辑单元(ALU)
II. 存储器(Memory) IV. 指令译码器(ID)
A. 仅 I、Ⅱ B. 仅 I、Ⅱ、Ⅲ C. 仅 Ⅱ、Ⅲ、IV D. 仅 I、Ⅲ、IV
[tag_link]
正确答案:B
该指令的两个源操作数分别采用 寄存器寻址 和 寄存器间接寻址 ,因此在取数阶段需要用到通用寄存器组和存储器;在执行阶段,两个源操作数相加需要用到算术逻辑单元;而指令译码器用于操作码字段进行译码,向控制器提供特定的操作信号,在取数及执行阶段用不到,所以答案选 B。
按字节编址的计算机中,某double 型数组A 的首地址为2000H, 使用变址寻址和循环结构访问数组A, 保存数组下标的变址寄存器初值为0,每次循环取一个数组元素,其偏移地址为变址值乘以sizeof(double), 取完后变址寄存器内容自动加1。若某次循环所取元素的地址为2100H, 则进入该次循环时变址寄存器的 内 容 是 ( ) 。
A. 25 B. 32 C. 64 D. 100
[tag_link]
正确答案:B
根据 变址寻址 的公式 EA=(IX)+A, 则 (IX)=2100H-2000H=100H=256,sizeof(double)=8(双精度浮点数用 8 位字节表示),因此数组的下标为 256/8=32, 答案选 B。
(10 分)设某计算机有变址寻址、间接寻址和相对寻址方式,一个指令长等于一个存储字。设当前指令的地址码部分为 001AH,正在执行的指令所在地址为 1F05H,变址寄存器中的内容为 23A0H。已知存储器的部分地址及相应内容如下表所示:
(1)当执行取数指令时,如为变址寻址方式,取出的数为多少?
(2)如为间接寻址,取出的数为多少?
(3)设计算机每取一个存储字 PC 自动加 1,转移指令采用相对寻址,当执行转移指令时,转移地址为多少?若希望转移到 23A0H,则指令的地址码部分应设为多少?
[tag_link]
**【解析】** 本题考查指令的寻址方式。前两小题涉及数据寻址,其最终目的是寻址操作数,第 3 小题涉及指令寻址,其目的是寻址下一条将要执行的指令地址。下表列出了基本的寻址方式,其中偏移寻址包括变址寻址、基址寻址和相对寻址三种方式。
| 寻址方式 | 规则 | 主要优点 | 主要缺点 |
|---|---|---|---|
| 立即寻址 | 操作数=A | 无需访问存储器 | 操作数范围受限 |
| 寄存器寻址 | EA=R | 无需访问存储器 | 寻址空间受限 |
| 直接寻址 | EA=A | 简单 | 寻址空间受限 |
| 间接寻址 | EA=(A) | 寻址空间大 | 多次访问主存 |
| 寄存器间接寻址 | EA=(R) | 寻址空间大 | 多访问一次主存 |
| 偏移寻址 | EA=(R)+A | 灵活 | 复杂 |
特别注意相对寻址方式中的 PC 值更新的问题:根据历年统考真题,通常在取出当前指令后立即将 PC 的内容加 1(或加增量),使之变成下条指令的地址。
(1) 变址寻址时,操作数 。
(2) 间接寻址时,操作数 。
(3) 转移指令使用相对寻址,因为指令字长等于存储字长,PC 每取出一条指令后自动加 1,因此转移地址 = (PC) + 1 + A = 1F05H + 1 + 001AH = 1F20H。若希望转移到 23A0H,则指令的地址码部分应为 。
某计算机字长为 16 位,主存地址空间大小为 128KB,按字编址。采用单字长指令格式,指令各字段定义如下:
转移指令采用相对寻址方式,相对偏移量用补码表示,寻址方式定义如下:
| Ms/Md | 寻址方式 | 助记符 | 含义 |
|---|---|---|---|
| 000B | 寄存器直接 | Rn | 操作数 = (Rn) |
| 001B | 寄存器间接 | (Rn) | 操作数 = ((Rn)) |
| 010B | 寄存器间接、自增 | (Rn)+ | 操作数 = ((Rn)), (Rn) + 1 → Rn |
| 011B | 相对 | D(Rn) | 转移目标地址 = (PC) + (Rn) |
请回答下列问题:
(1) 该指令系统最多可有多少条指令?该计算机最多有多少个通用寄存器?存储器地址寄存器(MAR)和存储器数据寄存器(MDR)至少各需要多少位?
(2) 转移指令的目标地址范围是多少?
(3) 若操作码 0010B 表示加法操作(助记符为 add),寄存器 R4 和 R5 的编号分别为 100B 和 101B,R4 的内容为 1234H,R5 的内容为 5678H,地址 1234H 中的内容为 5678H,地址 5678H 中的内容为 1234H,则汇编语言为“add (R4), (R5)+”(逗号前为源操作数,逗号后为目的操作数)对应的机器码是什么(用十六进制表示)?该指令执行后,哪些寄存器和存储单元中的内容会改变?改变后的内容是什么?
[tag_link]
1)操作码占 4 位,则该指令系统最多可有24=16条指令。操作数占 6 位,其中寻址方式占 3 位、寄存器编号占 3 位,因此该机最多有23=8个通用寄存器。主存地址空间大小为 128KB,按字编址,字长为 16 位,共有 128KB/2B =216个存储单元,因此 MAR 至少为 16 位;因为字长为 16 位,故 MDR 至少为 16 位。
2)寄存器字长为 16 位,PC 和 Rn 可表示的地址范围均为0∼216−1,而主存地址空间为216,故转移指令的目标地址范围为 0000H~FFFFH(0∼216−1)。
3)汇编语句“add(R4),(R5)+”,对应的机器码为
| 字段 | OP | Ms | Rs | Md | Rd |
|---|---|---|---|---|---|
| 内容 | 0010 | 001 | 100 | 010 | 101 |
| 说明 | add | 寄存器间接 | R4 | 寄存器间接,自增 | R5 |
将对应的机器码写成十六进制形式为 0010 0011 0001 0101B = 2315H。该指令的功能是将 R4 的内容所指存储单元的数据与 R5 的内容所指存储单元的数据相加,并将结果送入 R5 的内容所指存储单元中。(R4)=1234H,(1234H)=5678H,(R5)=5678H,(5678H)=1234H;执行加法操作 5678H+1234H=68ACH,之后 R5 自增。该指令执行后,R5 和存储单元 5678H 的内容会改变,R5 的内容从 5678H 变为 5679H,存储单元 5678H 中的内容变为该指令的计算结果 68ACH。【注意】第 3 问中两个操作数的存储地址和数值有点令人晕头,请读者务必保持清醒。
(13分)某程序中有如下循环代码段P:“for (int i=0;i<N;i++)su m +=A[i];”。假设编译时变量sum 和i 分别分配在寄存器R1 和R2 中。常量N 在寄存器R6 中,数组A 的首地址在寄存器R3 中。程序段P 起始地址为08048100H, 对应的汇编代码和机器代码如下表所示。
| 编号 | 地址 | 机器代码 | 汇编代码 | 注释 |
|---|---|---|---|---|
| 1 | 08048100H | 00022080H | loop:sll R4,R2,2 | (R2)《2→R4 |
| 2 | 08048104H | 00083020H | add R4,R4,R3 | (R4)+(R3)→R4 |
| 3 | 08048108H | 8C850000H | load R5,0(R4) | ((R4)+0)→R5 |
| 4 | 0804810CH | 00250820H | add R1,R1,R5 | (R1)+(R5)→R1 |
| 5 | 08048110H | 20420001H | add R2,R2,1 | (R2)+1→R2 |
| 6 | 08048114H | 1446 FFFAH | bne R2,R6,loop | if (R2)≠(R6) goto loop |
执行上述代码的计算机 M 采用32位定长指令字,其中分支指令 bne 采用如下格式:
| 31 26 | 25 21 | 20 16 | 15 0 |
|---|---|---|---|
| OP | Rs | Rd | OFFSET |
OP为操作码,Rs 和Rd 为寄存器编号,OFFSET为偏移量,用补码表示。请回答下列问题,并说明理由。
(1)M 的存储器编址单位是什么?
(2)已知sll 指令实现左移功能,数组A 中每个元素占多少位?
(3)表中bne 指令的OFFSET 字段的值是多少?已知bne 指令采用相对寻址方式,当前PC内容为bne 指 令地址,通过分析题44表中指令地址和bne 指令内容,推断出bne指令的转移目标地址计算公式。
(4)若M 采用如下“按序发射、按序完成”的5级指令流水线:IF ( 取指)、ID ( 译码及取数)、EXE ( 执 行 ) 、MEM ( 访存)、 WB ( 写回寄存器),且硬件不采取任何转发措施,分支指令的执行均引起3个时 钟周期阻塞,则P 中那些指令的执行会由于数据相关而发生流水线阻塞?哪条指令的执行会发生控制冒 险?为什么指令1的执行不会因为与指令5的数据相关而发生阻塞?
[tag_link]
(1) 存储器编址单位为字节。因为每条指令占 4B,指令地址差为 4 个地址单位,故一个地址单位代表 1B。
(2) 数组 A 中每个元素占 32 位(4B)。sll 指令左移 2 位相当于乘 4,用于计算数组元素地址偏移,说明每个元素占 4B = 32 位。
(3) bne 指令的机器代码为 1446 FFFAH,后 2B 为 OFFSET 字段,值为 FFFAH(补码),即 -6。bne 指令地址为 08048114H,根据指令格式,转移目标地址计算公式为:(PC) + 4 + OFFSET × 4。执行 bne 时 PC 已自动加 4 变为 08048118H,-6 × 4 = -24,08048118H - 18H = 08048100H(loop 地址)。
(4) 由于数据相关而发生阻塞的指令为第 2、3、4、6 条。第 6 条指令会发生控制冒险。指令 1(sll)与指令 5(add R2,R2,1)之间没有数据相关,因为指令 1 写 R4,指令 5 写 R2,寄存器不同,不会发生阻塞。
上题中 C 程序段在计算机 M 上的部分机器级代码如下,每个机器级代码行中依次包含指令序号、虚拟地址、机器指令和汇编指令。
for (i = 0; i < 24; i++)
1 00401072 C7 45 F8 00 00 00 00 mov[ebp-8], 0
2 00401079 EB 09 jmp 00401084h
3 0040107B 8B 55 F8 mov eax, [ebp-8]
... ... ...
7 00401088 7D 32 jge 004010bch
for (j = 0; j < 64; j++)
8 0040108A C7 45 FC 00 00 00 00 mov[ebp-4], 0
... ... ...
a[i][j] = 10;
... ... ...
19 004010AE C7 84 82 00 20 42 00 0A 00 00 00 mov[ecx+edx*4+00422000h], 0Ah
20 ... ...
请回答下列问题。
(1) 第 20 条指令的虚拟地址是多少?
(2) 已知第 2 条 jmp 和第 7 条 jge 都是跳转指令,其操作码分别是 EBH 和 7DH,跳转地址分别为 0040 1084H、0040 10BCH,这两条指令都采用什么寻址方式?给出第 2 条指令 jmp 的跳转目标地址计算过程。
(3) 已知第 19 条 mov 指令的功能是“a[i][j]←10”,其中 ecx 和 edx 为寄存器名,0042 2000H 是数组 a 的首地址,指令中源操作数采用什么寻址方式?已知 edx 中存放的是变量 j,ecx 中存放的是什么?根据该指令的机器码判断计算机 M 采用的是大端还是小端方式。
(4) 第一次执行第 19 条指令时,取指令过程中是否会发生缺页异常?为什么?
[tag_link]
1)第 20 条指令的虚拟地址为 0040 10B9H。
2)第 2 条 jmp 和第 7 条 jge 指令都采用相对寻址方式。第 2 条指令 jmp 的跳转目标地址 = 0040 1079H+2+09H = 0040 1084H。
3)第 19 条指令中源操作数采用立即(数)寻址方式。根据汇编指令中给出的计算公式 ecx+edx*4+00422000h 可知,ecx 中存放的是 i×256。M 采用小端方式。
4)第一次执行第 19 条指令时,取指令过程中不会发生缺页异常。因为第 19 条指令所在的程序段都在页号为 00401H 的同一个页面中,执行第 19 条指令时,该页已在主存,因而取指令过程中不会发生缺页异常。
已知f(n)=n!=n×(n−1)×(n−2)×⋯×2×1,计算f(n)的 C 语言函数 f1 的源程序(阴影部分)及其在 32 位计算机 M 上的部分机器级代码如下:
int f1(int n) {
1 00401000 55 push ebp
... ... ...
if(n>1)
11 00401018 83 7D 08 01 cmp dword ptr [ebp+8],1
12 0040101C 7E 17 jle f1+35h (00401035)
return n*f1(n-1);
13 0040101E 8B 45 08 mov eax, dword ptr [ebp+8]
14 00401021 83 E8 01 sub eax, 1
15 00401024 50 push eax
16 00401025 E8 D6 FF FF FF call f1 ( 00401000)
... ... ...
19 00401030 0F AF C1 imul eax, ecx
20 00401033 EB 05 jmp f1+3Ah (0040103a)
else return 1;
}
21 00401035 B8 01 00 00 00 mov eax,1
... ... ...
26 00401040 3B EC cmp ebp, esp
... ... ...
30 0040104A C3 ret
其中,机器级代码行包括行号、虚拟地址、机器指令和汇编指令,计算机 M 按字节编址,int 型数据占 32 位。请回答下列问题:
(1) 计算 f(10) 需要调用函数 f1 多少次?执行哪条指令会递归调用 f1?
(2) 上述代码中,哪条指令是条件转移指令?哪几条指令一定会使程序跳转执行?
(3) 根据第 16 行的 call 指令,第 17 行指令的虚拟地址应是多少?已知第 16 行的 call 指令采用相对寻址方式,该指令中的偏移量应是多少(给出计算过程)?已知第 16 行的 call 指令的后 4 字节为偏移量,M 是采用大端方式还是采用小端方式?
(4) f(13)=6227020800,但 f1(13) 的返回值为 1932053504,为什么两者不相等?要使 f1(13) 能返回正确的结果,应如何修改 f1 的源程序?
(5) 第 19 行的 imul 指令(带符号整数乘)的功能是 R[eax]←R[eax]×R[ecx],当乘法器输出的高、低 32 位乘积之间满足什么条件时,溢出标志 OF=1?要使 CPU 在发生溢出时转异常处理,编译器应在 imul 指令后应加一条什么指令?
[tag_link]
1)计算 f(10) 需要调用函数 f1 共 10 次,执行第 16 行的 call 指令会递归调用 f1。
2)第 12 行的 jle 指令是条件转移指令,其含义为小于等于时转移,本行代码的意义为:当 n≤1 时,跳转至地址 0040 1035H。第 16 行的 call 指令为函数调用指令,第 20 行的 jmp 指令为无条件转移指令,第 30 行的 ret 指令为子程序的返回指令,这三条指令一定会使程序跳转执行。
3)其长度计算机 M 上按字节编址,第 16 行的 call 指令的虚拟地址为 0040 1025H,长度为 5 字节,故第 17 行的指令的虚拟地址为 0040 1025H + 5 = 0040 102AH。第 16 行的 call 指令采用相对寻址方式,即目标地址 = (PC) +偏移量,call 指令的目标地址为 0040 1000H,所以偏移量 = 目标地址 - (PC) = 0040 1000H - 0040 102AH = FFFF FFD6H。根据第 16 行的 call 指令的偏移量字段为 D6 FF FF FF,可以确定 M 采用小端方式。
4)因为 f(13) = 6227020800,其结果超出了 32 位 int 型数据可表示的最大范围,因此 f(13) 的返回值是一个发生了溢出的错误结果。为使 f1(13) 能返回正确结果,可将函数 f1 的返回值类型改为 double(或 long long,或 long double,或 float)类型。
5)若乘积的高 33 位为非全 0 或非全 1,则 OF=1。编译器应在 imul 指令后加一条“溢出自陷指令”,使得 CPU 自动查询溢出标志 OF,当 OF=1 时调出“溢出异常处理程序”。