1. 程式人生 > >深入理解計算機系統 第三章大略和第五章大略

深入理解計算機系統 第三章大略和第五章大略

$0 一個 編譯 存儲器 系統 32位 做了 ++i 擴展

這2章總結的很少,主要是覺得沒那麽重要。

1.2個操作數的指令,第二個操作數通常是目的操作數:movb a b,move a to b,而add a b,b+=a,指令分為指令類,如mov類:movb,movw,movl,b指一個字節,w表示2個字節,l表示4個字節
                                                      movs類(擴展填符號),movz類(擴展填0)
  寄存器:這裏只說ia32體系的那8個32位寄存器,存數值和指針,都以%e開頭,特殊地,最後兩個:%esp是棧指針,%ebp是幀指針
  指令可以獨立地讀取或寫入前4個寄存器的2個低位字節,如movw %ax,%cx,或movb %al,%cl
  所以一般說8個四字節寄存器(%eax),8個雙字節寄存器(%ax),8個單字節寄存器(%al),但硬件上只有8個四字節寄存器,後2者是前者的部分
  操作數分3類:立即數,即常數值(格式:$0xF);寄存器,表示某個寄存器存的內容(%eax,%ax,%al等);
  存儲器引用,(格式:4(e1,e2,s)表示操作數的地址是:4+寄存器e1存的內容+寄存器e2存的內容*s:
  %eax;$0x11;0x01;(%eax);4(%eax);(%eax,%ecx,3),前2個對應寄存器操作數和立即數操作數,後面的都是存儲器引用操作數
2.%esp存的是棧頂指針的值,該值作為地址指向的值是棧頂元素的值,棧頂指針入棧變小,出棧變大;subl $4,%esp表示入棧4個字節,地址+-1表示移動一個字節
  (%esp)表示棧頂的地址:movl $0xff,(%esp)表示把0xff覆蓋棧頂的四個字節,(%esp)表示%esp所存值作為的地址
3.leal其實是movl的變形:leal s,d:把s加載到d,s就是一個地址(movl是取s所在地址的值),不是沒有存儲器引用,d必須是寄存器。

4.控制,主要講了條件跳轉指令jmp類和條件傳送指令cmov類,忽略,本來以為能看到luajit的一些跳轉知識,結果沒有。大量if-else不如switch,不過這沒什麽實際用吧。

  (關於條件傳送那裏我只是略略看,回頭認真看一波)

5.第5章:這章備受推崇,但是,我讀完了認為幾乎沒什麽收獲,說明標題黨還是有存在的理由:優化程序的性能
這裏主要提了把循環裏面一些東西挪到外面,比如for(int i = 0;i < strlen(s);++i),先算strlen,
消除不必要的存儲器引用,引入臨時變量保存中間結果
循環解開,這個編譯器優化做了

深入理解計算機系統 第三章大略和第五章大略