对应的知识点:
指令系统
扩展操作码的计算:
公式:
对扩展操作码而言,若地址长度为n,上一层留出m种状态,下一层可扩展出 mx2^n 种状态
1.设计某指令系统时,假设采用 16 位定长指令字格式,操作码使用扩展编码方式,地址码为6位,包含零地址,一地址和二地址3种格式的指令,若二地址指令有12条,一地址指令有254条,则零地址指令的条数最多为()
A.0 B.2 C.64 D.128
答案:D
先分析一下:
二地址指令占12(2*6=12)位地址空间,4位用来表示操作码,二地址指令有12条,那么剩余16-12=4条操作码扩展给一地址指令。
0000~1011 xxxx xxxx xxxx
一地址指令格式为:
11xx xxxx xxxx xxxx,其中低6位为地址码,一地址指令有254条,那么一地址指令可表示的范围:
1100 0000 00xx xxxx~1111 1111 01xx xxxx
其中,00 0000 00~11 1111 01表示0~253,总共254条指令。剩余256-254=2条指令扩展给零地址指令。
1111 1111 1xxx xxxx,前9位固定,因为超过1111 1111 01xx xxxx,就是零地址能表示的范围了。剩余位为16-9=7。所以零地址指令的条数最多为2^7=128条。
直接用公式:
二地址指令有12条,则剩余16-12=4种操作码给一地址指令,一地址指令有254条,4*2^6-254=2种操作码给零地址指令,所以零地址指令一共有2*2^6=128条。
还可以这么想:
地址码为6位,一条二地址指令会占用2^6条一地址指令的空间,一条一地址指令会占用2^6条零地址指令的空间。若全都是零地址指令,则最多有2^16条,减去一地址指令和二地址指令所占用的零地址指令空间,即2^16-254x2^6-12x2^6x2^6=128。
2.某计算机按字节编址,指令字长固定且只有两种指令格式,其中三地址指令29条、二地址指令107条,每个地址字段为6位,则指令字长少应该是()
A.24位 B.26位 C.28位 D.32位
答案:A
分析:三地址指令有29条,需要至少5位操作码,最后会剩余:2^5=32 ,32-29=3种操作码扩展给二地址指令,而二地址额外多了6位操作码(地址码比三地址指令少6位),所以数量最大达到3*64=192条。所以指令字长最少为5+6+12=23位。
又因为计算机按字节编址,需要8的倍数,所以指令字长至少为24位。
指令寻址方式:
1.寄存器 R1、R2 均为 16 位,指令 MOV R1,[R2]的功能是把内存数据传送至寄存器 R1,寻址方式为寄存器间接寻址。R2的值为1234H,内存单元1234H存放数据56H,内存单元 1235H 存放数据 78H,采用小端方式存储。则执行指令后R1的值为()。
A.5678H B. 7856H C.8765H D.6587H
答案:B
MOV R1,[R2]指的是将R2寄存器的内容放到R1中,又因为R1,R2是16位寄存器,所以可以取出两个内存单元的数据放到R1中,即取出1234和1235的内容"5678",小端方式存储和阅读顺序是反的,所以R1的值为“7856”
2.某计算机机的字长为 16 位,主存按字编址。转移指令由两个字节组成,采用相对寻址,第一个字节为操作码字段,第二个字节为相对偏移量字段。若某转移指令所在的主存地址为 4000H,相对偏移量字段的内容为06H,则该转移指令执行后的PC值为()。
A.4002H B. 4004H C.4007H D.4008H
答案:C
转移指令的目标地址一定是当前指令的下一条指令作为基址+偏移量。
由于主存按字编址,而转移指令又由两个字节组成,刚好就是一个字,所以只需要PC+1就可以。
如果这个这里说的是“主存按字节编址”,那么PC自增的时候就是PC+2
转移指令执行后的PC值为:4000H+06H+1=4007H
3.某机器指令字长为 16 位,主存按字节编址,取指令时,每取一字节,PC自动加1。当前指令地址为 2000H,指令内容为相对寻址的无条件转移指令,指令中的形式地址为40H。则取指令后及指令执行后PC的内容为()
A.2000H,2042H B.2002H,2040H C.2002H,2042H D.2000H,2040H
答案:C
1.取一个字节,PC+1,指令字长为16位(2个字节),所以取指令后PC的内容为:PC+2=2002
2.转移指令的目标地址:需要将当前指令的下一条指令作为基地址+偏移量:
2000+2+40=2042
同个题型:
某机器字长为 16位,主存按字节编址,转移指令采用相对寻址,由 2字节组成,第一字节为操作码字段,第二字节为相对位移量字段。假定取指令时,每取一字节 PC 自动加 1。若某转移指令所在主存地址为 2000H,相对位移量字段的内容为06H,则该转移指令成功转移后的目标地址是()
A.2006H B.2007H C.2008H D.2009H
答案:C
2000+2+06=2008
4.某计算机的主存容量为4M*16 位,且存储字长等于指令字长,若该机能完成 97 种操作,操作码位数固定,且有直接、间接、基址、变址、相对、立即六种寻址方式,则相对寻址的偏移量范围为()
A.(-32,+31)
B.(-64,+63)
C.(-128,+127)
D.(-256,+255)
答案:A
指令由操作码+寻址特征+地址码组成:
97种操作对应至少2^7=128种操作码,即操作码位数有7位;6种寻址方式对应至少3位地址。内存地址有16位,所以偏移量为:16-7-3=6位。
偏移量是用补码表示的,n位补码表示范围是~,所以6位能表示的范围:
~(-32~31)
同一题型:
某计算机采用 16 位定长指令字格式,操作码位数和寻址方式位数固定,指令系统有 48 条指令,支持直接、间接、立即、相对4种寻址方式。在单地址指令中,直接寻址方式的可寻址范围是()。A.0~255 B.0~1023 C.-128~127 D.-512~511
答案:A
48条指令,所以操作码字段为6位(2^6=64),又因为有4种寻址方式,所以寻址特征需要2位(2^2=4),地址字段:16-6-2=8位。
因为采用直接寻址,所以地址码字段放的是主存地址,主存地址是无符号数,所以这个问题就转化为了8位无符号数的寻址范围:0~
5.对按字寻址的机器,程序计数器和指令寄存器的位数各取决于()
A.机器字长,存储器的字数
B.存储器的字数,指令字长
C.指令字长,机器字长
D.地址总线宽度,存储器的字数
答案:B
机器按字寻址,程序计数器PC给出下一条指令字的访存地址(指令在内存中的地址),因此取决于存储器的字数;指令寄存器(IR)用于接收取得的指令,因此取决于指令字长。
6.设相对寻址的转移指令占 3B,第一字节为操作码,第二、三字节为相对位移量(补码表示),而且数据在存储器中采用以低字节为字地址的存放方式。每当 CPU 从存储器取出一字节时,即自动完成(PC)+1→PC。若 PC的当前值为 240(十进制),要求转移到290(十进制 ),则转移指令的第二、三字节的机器代码是( );若 PC 的当前值为 240(十进制),要求转移到 200(十进制),则转移指令的第二、三字节的机器代码是( )。
A. 2FH、FFH B. D5H、00H C. D5H、FFH D.2FH、00H
答案:D,C
① 数据在存储器中采用以低字节为字地址的存放方式,表示采用小端存储。小端存储表示数据低位存放在低地址空间,大端存储表示数据的高位存放在低地址空间。就拿低地址空间来记就可以了,如果低地址放的是数据低位(低字节)就是小端存储,如果低地址放的是数据高位(高字节)就是大端存储。
"以低字节为字地址的存放方式”,字的地址取低地址作为字地址,例如下图,大端方式存储:低地址存放在数据高位,那么他的字地址就是12H。小端方式存储,他的字地址就是34H。以低字节为字地址,也就是低字节数据放在低地址,所以是小端存储方式。
② PC当前值是240,执行完转移指令后,PC的值为290,所以
240+3(PC+3)+x(偏移量)=290,x=47=101111(2进制)。转移指令占3B,第一字节为操作码,第二、三字节为相对位移量,并且用补码表示,所以101111扩展为16位:
0000 0000 0010 1111---->002F(16进制),采用小端存储:2F00注意:小端存储只是字节之间的顺序颠倒,字节内的顺序不能动。
③ 同理 240+3+x=200,x=-43
-43对应的补码(16位):1111 1111 1101 0101---->FFD5(16进制),采用小端存储:D5FFH
7.某计算机按字节编址,采用大端方式,某指令的一个操作数的机器数为 ABCD 00FFH,该操作数采用基址寻址方式,指令中形式地址(用补码表示)为FF00H,当前基址寄存器的内容为 C000 0000H,则该操作数的LSB(即FFH)存放的地址是()。
A.C000 FF00H B.C000 FF03H C.BFFF FF00H D.BFFF FF03H
答案:D
操作数的有效地址:C000 0000H+FFFF FF00H=BFFF FF00H。
由于计算机按字节编址,采用大端方式:
所以在存储单元BFFF FF00H(低地址)中放高字节ABH(1字节),BFFFF FF01H放CDH,BFFFF FF02H放00H, BFFFF FF03H放FFH。
问机器数ABCD 00FFH中的"FFH"存放在哪里?答案就是BFFFF FF03H。
同一题型:
某计算机采用大端方式,按字节编址。某指令中操作数的机器数为 1234 FF00H,该操作数采用基址寻址方式,形式地址(用补码表示)为FF12H,基址寄存器的内容为 F000 0000H,则该操作数的LSB(最低有效字节)所在的地址是()。
A.FO00 FF12H B. F000 FF15H C.EFFF FF12H D. EFFF FF15H
答案:D
基址寻址方式,基址寄存器的内容不变,即F000 0000H,形式地址为FF12H,所以操作数的有效地址:
F000 0000H+FFFF FF12H=EFFF FF12H,又因为采用大端方式(低地址存放高字节数据),按字节编址,所以EFFF FF12H中存放的是"12H" ,EFFF FF13H中存放"34H",
EFFF FF14H存放"FFH",EFFF FF15H存放"00H",所以操作数的LSB(最低有效字节)所在的地址(00H)是:
EFFF FF15H
8.某机器有一个标志寄存器,其中有进位/借位标志 CF、零标志 ZF、符号标志 SF 和溢出标志 OF,条件转移指令 bgt(无符号整数比较大于时转移)的转移条件是( )
A.CF+OF=1 B.+ZF=1 C.=1 D.=1
答案:C
对于无符号数而言,SF和OF无意义,其实就可以选出C了。
大于的时候转移,即两个数进行相减操作,CF=0(只有不够减才会借位),ZF也为0(ZF是1说明结果为0),所以=1
9.某计算机有 16 个通用寄存器,采用 32 位定长指令字,操作码字段(含寻址方式位)为8位,STORE指令的源操作数和目的操作数分别采用寄存器直接寻址和基址寻址方式。若基址寄存器可使用任意一个通用寄存器,且偏移量用补码表示,则STORE指令中偏移量的取值范围是()
A.-32768~+32767
B.-32767~+32768
C.-65536~+65535
D.-65535~+65536
答案:A
指令的组成:
操作码字段:8位 源操作数的寻址特征(寻址方式):4位(16位通用寄存器)
目的操作数的寻址特征(寻址方式):4位 偏移量:32-8-4-4=16位。
16位补码的取值范围:-32768~+32767
答案:C
先变址后间址:
(I)+D:存放有效地址的地址。
((I)+D):操作数的有效地址。
(((I)+D )):操作数。
10.按字节编址的计算机中,某 double 型数组 A 的首地址为 2000H,使用变址寻址和循环结构访问数组 A,保存数组下标的变址寄存器的初值为 0,每次循环取一个数组元素,其偏移地址为变址值乘以 sizeof(double),取完后变址寄存器的内容自动加 1。若某次循环所取元素的地址为2100H,则进入该次循环时变址寄存器的内容是()。
A. 25 B. 32 C.64 D.100
答案:B
每个数组元素的地址:2000H(起始地址)+变址寄存器的内容*sizeof(double)
2100H=2000H+变址寄存器的内容*8(double型)----->100H(16进制)=256(10进制),256/8=32,所以变址寄存器的内容为32。
指令系统:
1.假设 R[ax]= FFE8H,R[bx]=7FE6H,执行指令“add ax,bx”后,寄存器的内容和各标志的变化为( )
A. R[ax]=7FCEH,OF=1,SF=0,CF=0,ZF=0
B. R[bx]=7FCEH,OF=1,SF=0,CF=0,ZF=0
C.R[ax]=7FCEH,OF=0,SF=0,CF=1,ZF=0
D.R[bx]=7FCEH,OF=0,SF=0,CF=1,ZF=0
答案:C
OF(溢出)=,最高位的进位异或次高位的进位,所以OF=1
SF(符号):计算结果为正,所以SF=0
CF(进位/借位):Sub Cout,Sub:加法0,减法1 Cout:最高位的进位
所以CF==1
ZF(零标志位):ZF=0
2.假设 R[ax]= 7FE6H,R[bx]=FFE8H,执行指令“sub bx,ax”后,寄存器的内存和各标志的变化为()。
A.R[ax]=8002H,OF=0,SF=1,CF=1,ZF=0
B. Rbx]=8002H,OF=0,SF=1,CF=0,ZF=0
C.R[ax]=8002H,OF=1,SF=1,CF=0,ZF=0
D.R[bx]=8002H,OF=1,SF=1,CF=0,ZF=0
答案:B
“sub bx,ax”,就是bx-ax
减法转加法:bx - ax--->bx+(-ax)
怎么将ax转为-ax:ax的全部位取反,末位+1
1111 1111 1110 1000
+ 1000 0000 0001 1010
---------------------------------------
(1)1000 0000 0000 0010
所以 OF=11=0,SF=1,CF=Sub Cout=11=0,ZF=0
3.某计算机的数据采用小端方式存储,减法指令“sub ax,imm”的功能为(ax)-imm→ax,imm 表示立即数,该指令对应的十六进机器码为 2dxxxx(从左到右以字节为单位由低地址到高地址),其中xxxx对应 imm 的机器码,若imm= -3 ,(ax)=7,则该指令对应的机器码和执行后 OF 标志位的值分别为()。
A.2DFFFDH,0 B2DFFFDH,1 C.2DFDFFH,0 D.2DFDFFH,1
答案:C
① -3的机器数为(别忘了符号扩展):1111 1111 1111 1101(2进制)=FFFD(16进制)
采用小端方式存储,所以低地址存放的是低字节数据,所以题目中
“2dxxxx(从左到右以字节为单位由低地址到高地址)”,对应的机器码就是2dFDFF:
FD是一个字节,FF是一个字节,字节间颠倒,字节内不用颠倒。
② 运算的时候是一定是按2个字节进行运算:
也就是不能按照
0111
+ 0011(-3全部位取反+1)
--------------
(0) 1010
这样算得到的OF=1,是错的。
需要按照
0007H-FFFDH计算:
0000 0000 0000 0111
+ 0000 0000 0000 0011
-----------------------------------
0000 0000 0000 1010
这样算是正确的,OF=0
4.假设 R[eax]=080480B4H,R[ebx]=00000011H,M[080480F8H]=000000B0H,执行指令
“imul eax,[eax+ebx*4],-16”后,寄存器或存储单元的内容变为( )。
A.R[eax]=00000B00H B. M[080480F8H]=00000B00H
C.R[eax]= FFFFF500H D.M[080480F8H]=FFFFF500H
答案:C
[eax+ebx*4]*(-16)--->eax
ebx*4:就是让ebx的内容左移2位
00000011--->000000(没有拆) 0001 0001----左移两位--->000000(没有拆) 0100 0100
eax+ebx*4:
0804 80F8H+0000 0044 = 0804 80F8H
*(-16):先将其看作*16,即左移4位(2^4=16)
000000B0H--->00000(没拆) 0000 1011 0000---左移四位--->00000(没拆) 1011 0000 0000
即00000 B 00 H
继续乘-1,相当于取了相反数,即全部位取反,再加1:
00000 B 00 H--->FFFFF 0101 0000 0000=FFFFF500
5.程序P中有两个变量i和j,被分别分配在寄存器 eax 和 edx 中,P 中语句“if(i<j) {...}”,对应的指令序列如下(左边为指令地址,中间为机器代码,右边为汇编指令),其中jle指令的偏移量为 0d:
若执行到 804846aH 处的cmp指令时,i=105,j=100,则 jle 指令执行后将会转到()处的指令执行。
A. 8048461H
B.804846eH
C.8048479H
D.804847bH
答案:D
① jle表示jump if less or equal,如果edx-eax的结果<=0,那么就执行jle。
② 100-105为负数,所以要执行jle,执行完jle后,PC自增,有图片可以看出每次自增+2
(804846a---->804846c)
所以最后会转到:804846c+2+0d=8048 47bH