計算機系統基礎 半期考試總結與反思

這是一篇基調淒涼的文章,因爲筆者半期考試沒上我們轉專業班班平。

準確來說,整個半期考試都考得很差,是時候反思並且改進學習方法了。

原因一方面是對條件碼極度不熟悉,這個我覺得並不重要的東西反而每個題都在考,一方面是感覺知識還沒有融匯,另一方面是老師出了點超綱的數組題(我菜是原罪...)。這篇水文的主要目的是根據考試犯錯的題,排一下知識盲點解決一下上半學期遺留的問題。最重要的是知識還沒融會貫通,這是原罪。還有想吐槽一下考試用ppt呈現題目但是不髮捲子,這個就非常噁心了。這篇文章旨在就一些錯誤進行反思和總結,個人向而已:

 

零、關於標誌位和整數加減法的東西:

      這就很難受了,我沒有怎麼看第二章的東西,並且標誌位也沒記住...老師不掛我掛誰?

      CF:進位標誌,最近的操作讓最高位產生了進位,可用來檢查無符號數的溢出。

      OF:溢出標誌,最近的操作讓一個補碼溢出了,要麼是正溢出,要麼是負溢出。

      ZF:得零標誌,最近的操作的結果得零,則ZF=1;

      SF:是負數(符號位signal爲1)標誌,最近的操作得結果得到一個負數。

     樓下是筆者找的某一位博主總結的一幅圖,我覺得很ok的:

è¿éåå¾çæè¿°

對於整數加法:

1.x與y都是無符號數,w位的(一個w位的無符號數,它最大時11111...1(w個1),值是2^w -1),那麼0<=x,y<=2^w -1,那麼如果x+y沒有超過2^w,那麼該是多少是多少,如果溢出了,那麼我們就取mod 2^w.

2.x,y都是有符號數,w位的(一個w位的有符號數,它最大是0111.....1(w-1個1),值是2^(w-1) -1),最小是10000...0(w-1個0),值是-2^(w-1) ),那麼就有正溢出和負溢出了。

 

一、浮點數表示

y=0xd3e4c000的十進制數。(題中說了y是浮點數,我...我沒看到,雖然可能即使看到了,我考試的時候也忘了)

     我們轉化爲二進制串,y=1*101   0011   1* 110    0100    1100    0000    0000    0000.【*表示字段的分類】對於32位4字節的float型,第一位是符號位,1表示是負數,然後我們計算階碼部分,E=e-Bias,BIas=2^(階碼位數-1)-1,一般的float型是1,8,23這種字段結構,所以float的Bias是127;double型是1,11,52這種字段結構,其偏置Bias=1023.所以本題中,階碼的值E=e-BIas=(101 0011 1)2  -127=(40)decimal。然後我們計算尾數M,M一般等於1+f(隱含1開頭)如果階碼全零則M=f。所以本題答案是 V=(-1)* 2^40 * (1+1/2+1/4+1/32+...)。

 

二、一道綜合題:

1.add是自增運算,考試的時候忘記加自身了

  首先,%rdi+%rcx=0x1020,再加便宜0x8,得到地址0x1028,這個地址中的值是0xca50,然後我們進行值與值之間的加法運算,將值0xca50加上值0xaa,就得到了0xcafa

2.testq %rdx %rdx,%rdx內的值是0xaa不等於zero,所以ZF=0。然後cmovne也因爲(不相等/非零),所以要送數。

3.%rdi和%rsi加起來的地址加偏置6得到0x1009,因爲條件碼ZF=0,我們從中取得按小端(低數位存在前面,高數位存在後面的規則)取出8個字節(%rax),0x1008--89,0x1009--67,0x100a--05,0x100b--00,0x100c--00,0x100d--00,0x100e--00,0x100f--00,0x1010--22,我們取出八個內存64位,分別是0x1009--67,0x100a--05,0x100b--00,0x100c--00,0x100d--00,0x100e--00,0x100f--00,0x1010--22,那麼%rax的值就是0x2200000000000567。

4.我們從%esi中自減立即數Imm=4,得到-1,由於%esi是四字節32位,十六進制數四位爲一個數位,所以一共會有8位(16進制),而-1用十六進制表示,就是0xffffffff,這是因爲0xffffffff=-1*最高權+1*次高權+1*次次高權+....= - 1.(簡單的等比數列)。

5.我們將%ebx內的值0xc,即1100,sall,左移動29位,那麼我們從第一位到第32位中,是第三位移到32位的(32-3=29),所以第三十二位(最高的標誌位)得到1,代表“是負數”,那麼SF=1,命題爲真。(考試的時候,我數錯了!!!)

6.當移動後,我們得到的是0x1000....此處省略一系列個0,表示的是=-1*最高位位權=(可以是)INT_MIN,然後我們進行cmpl $2 %ebx操作,在int-min基礎上減去2,又回到一個正數,這個正數是int-max-1,那麼發生了負溢出,我們置OF=1.然後因爲這種compare操作只是比較不改變,所以%ebx該是多少是多少不改變。

7、這個題體現了計算機能夠分段送數的特性,所以我們將末尾16位兩字節送入%ax中,%rax其餘位不變,所以還是0x12388.

8.js表示“負數就跳轉”,由於我們最後得到(相減來判斷)一個正數,所以後者“大”,所以不是負數,所以不跳轉。

另外,加括號就是取地址,leaq我們單獨說。

leaq:加載有效地址,看似是從內存裏面讀數據到寄存器中,其實壓根就沒有引用內存,根本就與有效地址計算無關,其本質是mov指令的變形,對source操作後送入destination之中而已。

 

三、分析一個彙編,填空:

fabe:
    movl $0,%eax
    jmp .L2

.L5 movslq %eax,%r8
    leaq (%rdi,%r8,4),%rdx
    movl (%rdx),%ecx
    cmpl %ecx,%eax
    jne .L3
    addl %eax,%ecx
    movl %ecx,(%rdx)
    ret

.L3  leaq 4(%rdi,%r8,4),%r8
    movl (%r8),%r9d
    movl %r9d,(%rdx)
    movl %ecx,(%r8)
    addl $1,%eax

.L2 cmpl %esi,%eax
    jl .L5
    movl $-1,%eax
    ret
//源碼:
int fabe(int *a,int m)
{
    int i,temp;
    for(i=0;i<m;i++)
    {
        temp=a[i];
        if(i==temp)
        {
            ?; //temp+=i;
            return ?; //return i; gcc調用約定%eax習慣上作爲返回值
        }
        else
        {
          ?;//a【i】=a【i+1】;
          ?;//a【i+1】=temp;
        }
    }
    return ?; //-1
    
}

 

 

最後,想給自己說,這套題回頭看如此簡單,考的不好不是一件羞恥的事情,這是暴露自己問題的機會,後面一個月要加油了,爭取期末總評還有90+!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章