以下是学习计算机系统基础课程的一些练习题记录,重在理解的过程,因为本身学习这门课程的目的就在于更好的理解“计算机组成原理”。

1. 假设 R[ax]=FFE8H,R[bx]=7FE6H,执行指令“subw %bx, %ax”后,寄存器的内容和各标志的变化为(   )。

  • A.R[bx]=8002H,OF=1,SF=1,CF=0,ZF=0
  • B. R[ax]=8002H,OF=0,SF=1,CF=0,ZF=0
  • C.R[bx]=8002H,OF=0,SF=1,CF=0,ZF=0
  • D.R[ax]=8002H,OF=1,SF=1,CF=0,ZF=0  

注:subw %bx, %ax 表示R[ax] - R[bx] → R[ax]

 

2. 假设R[eax]=0000B160H,R[ebx]=00FF0110H,执行指令“imulw %bx”后,通用寄存器的内容变化为(    )。

得分/总分

  • A.R[eax]=00007600H,R[dx]=FFACH

  • B.R[eax]=00007600H,R[dx]=00BCH

  • C.R[eax]=00BC7600,其余不变

  • D.R[eax]=FFAC7600H,其余不变

注:w表示一个字,16bit,IA-32指令中,若只有一个操作数,则另一个操作数隐藏在AL/AX/EAX中,将两者相乘后(转换成加法,用ALU的加法部件),16bit时存在AX,32bit时存在DX-AX,64bit存在EDX-EAX中。这里是16bit*16bit,结果是32bit。

补充:IA-32架构是由8086的16位架构发展而来的,所以一个字的大小为16bit,双字32bit,用l表示。x86架构下一个字就是16bit,要与字长加以区分。

 

3. 假设short型变量x被分配在寄存器AX中,若R[ax]=FF70H,则执行指令“salw $2, %ax”后,变量x的机器数和真值分别是(    )。

  • A.FFDCH,-36

  • B.3FDC,16348

  • C.FDC0H,-576

  • D.FDC3H,-573

注:salw表示按字算术左移。其他的SHL/SHR 逻辑左移/逻辑右移;ROL/ROR 循环左移/循环右移。RCL/RCR 带进位左移/带进位右移。真值对应的值,与其存储的类型相关,这里是short型,所以是16位,带符号的。按照补码对应:-(0000 0010 0100 0000B)= -(512+64)

 

4. 程序P中有两个变量i和j,被分别分配在寄存器EAX和EDX中,P中语句“if (i<j) { …}”对应的指令序列如下(左边为指令地址,中间为机器代码,右边为汇编指令):

804846a    39 c2       cmpl  %eax, %edx

804846c    7e 0d    jle     xxxxxxxx    

若执行到804846a处的cmpl指令时,i=105,j=100,则jle指令执行后将会转到(      )处的指令执行。

  • A.8048479

  • B.804846e

  • C.8048461

  • D.804847b

注:cmpl 是做减法,后面的减去前面的(这里的所有指令顺序都和MIPS指令相反)。这里就是100-105。然后jle,l-lower,e-equal,小于等于就跳转(带符号,不带符号的是a-above和b-below),跳转的地址:理解成短转移了,暂时还不是很清楚。0x84846c+2+0d