🏷️ 知识点:标志寄存器
在补码表示的机器中,若寄存器 R 中原来存的数为 9EH,执行一条指令后现存的数为 CFH,则表明该指令不可能是( )。
A. XOR 异或运算指令 B. IMUL 有符号数乘法指令 C. SAR 算术右移指令 D. ADD 加法指令
[tag_link]
正确答案:B
寄存器 R 原存 9EH(二进制 1001 1110,补码表示有符号数 -98),执行后变为 CFH(二进制 1100 1111,补码表示有符号数 -49)。 分析各指令的可能性:
- A. XOR 异或运算指令:存在操作数 51H(0101 0001),使得 9EH XOR 51H = CFH,因此该指令可能。 >
- B. IMUL 有符号数乘法指令:若将寄存器值视为有符号数,从 -98 变为 -49,需满足 -98 × Y = -49,但 Y = 0.5 不是整数; > 若考虑乘法后取低 8 位(模 256),需解同余方程 158Y ≡ 207 (mod 256),由于 gcd(158,256)=2 而 207 是奇数,方程无解,故该指令不可能。 >
- C. SAR 算术右移指令:算术右移一位时,9EH(1001 1110)右移后符号位填充 1,得到 CFH(1100 1111),且 -98 算术右移一位等价于除以 2 得 -49,因此该指令可能。 >
- D. ADD 加法指令:存在操作数 31H,使得 9EH + 31H = CFH(-98 + 49 = -49),因此该指令可能。 >
综上,指令不可能是 IMUL 有符号数乘法指令。 >
已知 x、y 为 int 类型,当 x=100,y=200 时,执行 x-y 指令的到的溢出标志 OF 和借位标志 CF 分 别为0,1,那么当 x=10,y=-2 0 时,执行该指令得到的 OF 和 CF 分别是()。
17. 某运算类型指令中有一个地址码为通用寄存器编号,对应通用寄存器中存放的是操作数或操作数地址, CPU 区分两者的依据是()。
A. 操作数的寻址方式
B. 操作数的编码方式
C. 通用寄存器编号
D. 通用寄存器的内容
A.OF=0,CF=0
B.OF=0,CF=1
C.OF=1,CF=0
D.OF=1,CF=1
[tag_link]
正确答案:B
int 类型在计算机中以补码形式表示,因此,x(10)的二进制表示为 0000 0000 0000 0000 0000 0000 0000 1010B,y(-20)的二进制表示为 11111111 11111111 1111 1111 11101100。OF 和 CF 是 CPU 中 标志寄存器 的标志位。CF 表示无符号整数运算时的进位/借位,因此计算 CF 的时候,需要把和 x 和 y 当成无符号数进行计算,因为 x 不够减 y,所以 CF = 1。计算 OF 的时候,需要把和 x 和 y 当成有符号数进行计算,x-y=30,不超过 int 的最大值,不会产生溢出,所以 OF=0。所以本题的正确选项为 B。
某机器有一个标志寄存器,其中有进位/借位标志CF、零标志ZF、符号标志SF 和溢出标志OF, 条件 转移指令bgt ( 无符号整数比较大于时转移)的转移条件是()。
B.SF+ZF=1 A.CF+OF=1
C.CF+ZF=1
D.CF+SF=1
[tag_link]
正确答案:C
本题考察 标志寄存器 ,假设两个无符号整数 A 和 B,bgt 指令会将 A 和 B 进行比较,也就是将 A 和 B 相减。如果 A > B,则 A-B 肯定无进位/借位,也不为 0(为 0 时表示两数相同),故而 CF 和 ZF 均为 0,选 C。其余选项中用到了符号标志 SF 和溢出标志 OF, 显然应当排除。
减法指令“sub R1,R2,R3”的功能为"(R1)-(R2)→R3", 该指令执行后将生成进位/借位标志CF 和溢 出标志OF。若(R1)=FFFFFFFFH,( R2)=FFFFFFFOH,则该减法指令执行后,CF与 OF 分别为()。
A. CF=0, OF=0 B. CF=1, OF=0 C. CF=0, OF=1 D. CF=1, OF=1
[tag_link]
正确答案:A
[x]补 = [y]补 = [x]补 + [-y]补,[-R2]补 = 00000010H, 很明显[R1]补 + [-R2]补的最高位进位和符号位进位都是 1(当最高位进位和符号位进位的 值不相同 时才产生溢出),可以判断溢出标志 OF 为 0。同时,减法操作只需判断借位标志,R1 大于 R2, 所以借位标志为 0, 综上选 A
(12 分)假设有两个整数 和 , , 。采用补码形式(含 1 位符号位)表示, 和 分别存放在寄存器 A 和 B 中。另外,还有两个寄存器 C 和 D。A、B、C、D 都是 8 位的寄存器。请回答下列问题:(要求最终用十六进制表示二进制序列)
(1)寄存器 A 和 B 中的内容分别是什么? (2) 和 相加后的结果存放在 C 寄存器中,寄存器 C 中的内容是什么?此时,溢出标志位 OF 是什么?符号标志位 SF 是什么?进位标志位 CF 是什么? (3) 和 相减后的结果存放在 D 寄存器中,寄存器 D 中的内容是什么?此时,溢出标志位 OF 是什么?符号标志位 SF 是什么?进位标志位 CF 是什么?
[tag_link]
**【解析】** 本题考查补码的机内表示、补码的运算和溢出判断。
(1)因 ,则 ;因 ,则 ,所以寄存器 A 和 B 中的内容分别是 BCH、B0H。
(2) ,所以寄存器 C 中的内容是 6CH,其真值为 108。此时,溢出标志位 OF 为 1,表示溢出,即说明寄存器 C 中的内容不是真正的结果;符号标志位 SF 为 0,表示结果为正数(溢出标志为 1,说明符号标志有错);进位标志位 CF 为 1,仅表示加法器最高位有进位,对运算结果不说明什么。
(3) ,最高位前面的一位被丢弃(取模运算),结果为 12,所以寄存器 D 中的内容是 0CH,其真值为 12。此时,溢出标志位 OF 为 0,表示不溢出,即:寄存器 D 中的内容是真正的结果;符号标志位 SF 为 0,表示结果为正数;进位标志位 CF 为 1,仅表示加法器最高位有进位,对运算结果不说明什么。
某计算机采用 16 位定长指令字格式,其 CPU 中有一个标志寄存器,其中包含进位/借位标志 CF、零标志 ZF 和符号标志 NF。假定为该机设计了条件转移指令,其格式如下:
其中,00000 为操作码 OP;C、Z 和 N 分别为 CF、ZF 和 NF 的对应检测位,某检测位为 1 时表示需检测对应标志,需检测的标志位中只要有一个为 1 就转移,否则就不转移,例如,若 C=1,Z=0,N=1,则需检测 CF 和 NF 的值,当 CF=1 或 NF=1 时发生转移;OFFSET 是相对偏移量,用补码表示。转移执行时,转移目标地址为 (PC)+2+2×OFFSET;顺序执行时,下条指令地址为 (PC)+2。请回答下列问题。
(1) 该计算机存储器按字节编址,还是按字编址?该条件转移指令向后(反向)最多可跳转最多少条指令?
(2) 某条件转移指令的地址为 200CH,指令内容如下图所示,若该执行时 CF=0,ZF=0,NF=1,则该指令执行后 PC 的值是多少?若该指令执行时 CF=1,ZF=0,NF=0,则该指令执行后 PC 的值又是多少?请给出计算过程。
(3) 实现“无符号数比较小于等于时转移”功能的指令中,C、Z 和 N 应各是什么?
(4) 以下是该指令对应的数据通路示意图,要求给出中部件①~③的名称或功能说明。

1)因为指令长度为 16 位,且下条指令地址为 (PC)+2,故编址单位是字节。偏移量 OFFSET 为 8 位补码,范围为 -128~127,故相对于当前条件转移指令,向后最多可跳转 127 条指令。【评分说明】若正确给出 OFFSET 的取值范围,则酌情给分。
2)指令中 C=0,Z=1,N=1,故应根据 ZF 和 NT 的值来判断是否转移。当 CF=0,ZF=0,NF=1 时,需转移。己知指令中偏移量为 11100011B=E3H,符号扩展后为 FFE3H,左移一位(乘 2)后为 FFC6H,故 PC 的值(即转移目标地址)为 200CH+2+FFC6H=1FD4H。当 CF=1,ZF=0,NF=0 时不转移。PC 的值为 200CH+2=200EH。
3)指令中的 C、Z 和 N 应分别设置为 C=Z=1,N=0,进行数之间的大小比较通常是对两个数进行减法,而因为是无符号数比较小于等于时转移,即两个数相减结果为 0 或者负数都应该转移,若是 0,则 ZF 标志应当为 1,所以是负数,则借位标志应该为 1,而无符号数并不涉及符号标志 NF。
4)部件①用于存放当前指令,不难得出为指令寄存器;多路选择器根据符号标志 C/Z/N 来决定下一条指令的地址是 PC+2 还是 PC+2+2×OFFSET,故多路选择器左边线上的结果应该是 PC+2+2×OFFSET。根据运算的先后顺序以及与 PC+2 的连接,部件②用于左移一位实现乘 2,为移位寄存器。部件③用于 PC+2 和 2×OFFSET 相加,为加法器。部件②:移位寄存器(用于左移一位);部件③:加法器(地址相加)。【评分说明】合理给出部件名称或功能说明均给分。
在按字节编址的计算机 M 上,题 43 中 f1 的部分源程序(阴影部分)与对应的机器级代码(包括指令的虚拟地址)如下图所示。
int f1(unsigned n)
1 00401020 55 push ebp
... ... ...
for (unsigned i = 0; i <= n-1; i++) {
... ... ...
20 0040105E 39 4D F4 cmp dword ptr [ebp-0Ch],ecx
... ... ...
power *= 2;
... ... ...
23 00401066 D1 E2 shl edx,1
... ... ...
return sum;
... ... ...
35 0040107F C3 ret
其中,机器级代码行包括行号、虚拟地址、机器指令和汇编指令。
请回答下列问题。
(1) 计算机 M 是 RISC 还是 CISC?为什么?
(2) f1 的机器指令代码共占多少字节?要求给出计算过程。
(3) 第 20 条指令 cmp 通过 i 减 n-1 实现对 i 和 n-1 的比较。执行 f1(0) 过程中,当 i=0 时,cmp 指令执行后,进/借位标志 CF 的内容是什么?要求给出计算过程。
(4) 第 23 条指令 shl 通过左移操作实现了 power2 运算,在 f2 中能否也用 shl 指令实现 power2?为什么?
[tag_link]
(1)M 为 CISC。(1 分)M 的指令长短不一,不符合 RISC 指令系统特点。(1 分)
(2)f1 的机器代码为 96B。(1 分)因为 f1 的第一条指令 “push ebp” 所在的虚拟地址为 0040 1020H,最后一条指令 “ret” 所在的虚拟地址为 0040 107FH,所以,f1 的机器指令代码长度为:0040 107FH - 0040 1020H + 1 = 60H = 96B(1 分)
(3)CF = 1。(1 分)cmp 指令实现 i 与 n-1 的比较功能,进行的是减法运算。在执行 f1(0) 过程中,n=0,当 i=0 时,i=0000 0000H,并且 n-1=FFFF FFFFH。因此,当执行第 20 条指令时,在补码加/减运算器中执行的是 “0 - FFFF FFFFH” 的操作,即:0000 0000H + 0000 0000H + 1 = 0000 0001H。此时,进位输出 C=0,减法运算时的借位标志 CF = C ⊕ 1 = 1。(2 分)
(4)f2 中不能用 shl 指令实现 power * 2。(1 分)因为 shl 指令用来将一个整数的所有有效位作为一个整体左移;而 f2 中的变量 power 是 float 型,其机器数中不包含最高有效位,但包含了阶码部分,将其作为一个整体左移时并不能实现 “乘 2” 的功能。因此在 f2 中不能用 shl 指令实现 power * 2。(2 分)浮点数运算比整型运算要复杂,耗时也较长。
已知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 时调出“溢出异常处理程序”。