2017-2018-1 20179226 《深刻理解計算機系統》第3周學習總結

教材學習知識點總結

本章主要介紹了c語言和彙編的關係、棧的變化、指針數組、浮點代碼等知識。linux

3.1 程序編碼

1.機器級編程,兩種抽象最重要,第一種是由指令集體系結構或指令集架構,第二種是**機器級程序使用的內存地址是虛擬地址。
2.程序內存包含:機器代碼、信息、運行時棧、內存塊。編程

3.2 數據格式

1.32位數爲「雙字」,64位數爲「四字」。
2.數據傳送指令有四個變種:movb(字節)、movw(字)、movl(雙字)、movq(四字)數組

3.3 訪問信息

1.一個CPU包含一組16個存儲64位值的通用目的寄存器,這些寄存器用來存儲整數數據和指針。
2.不一樣的操做數可能性被分爲三種類型:當即數、寄存器、內存引用。
3.數據傳送指令:mov類第一條指令將源值加載到寄存器中,第二條將該寄存器值寫入目的位置。
4.棧遵循「後進先出」的原則,push壓棧,pop刪除數據。數據結構

3.4 算術和邏輯操做

1.操做分爲四種:加載有效地址、一元操做、二元操做和位移。
2.加載有效地址:leaq
3.一元操做:inc、dec、neg、not
4.二元操做:add、sub、imul、xor、or、and
5.位移:sal、shl、sar、shr架構

3.5 控制

1.條件碼:CF(進位標誌)、ZF(零標誌)、SF(符號標誌)、OF(溢出標誌)
2.設置條件碼:cmp、test
3.訪問條件碼:set
4.跳轉指令:jmp函數

3.6 過程

1.棧幀:須要的存儲空間超出寄存器可以存放的大小時,就會在棧上分配空間。
2.有n個整型參數,且n>6,要把參數1~6複製到對應的寄存器,把參數7~n放到棧上,而參數7位於棧頂,全部數據大小都向8的倍數對齊。學習

3.7 數組分配和訪問

1.數組元素i會被存放在地址爲xA+Li的地方
2.數組元素D[i][j]的內存地址爲&D[i][j]=xD+L(C
i+j)編碼

3.8 異質的數據結構

1.c語言提供兩種將不一樣類型的對象組合到一塊兒建立數據類型的機制:結構、聯合
2.結構:用將關鍵字struct聲明,將多個對象集合到一個單位中。
3.聯合:用關鍵字union聲明,容許用幾種不一樣的類型來引用一個對象。指針

3.9 在機器級程序中將控制與數據結合起來

1.每一個指針對應一個類型、每一個指針都有一個值、指針用‘&’運算符建立、*操做符用於間接引用指針、數組與指針緊密相連、將指針從一種類型強制轉換成另外一種類型、指針也能夠指向函數。
2.啓動gdb:linux> gdb prog
3.緩衝區溢出:在棧中分配某個字符數組來保存一個字符串,可是字符串長度超出了爲數組分配的空間。
4.對抗緩衝區溢出攻擊:棧隨機化、棧破壞檢測、限制可執行代碼區域。code

3.10 浮點代碼

1.浮點運算操做:vadd、vsub、vmul、vdiv、vmax、vmin、sqrt
2.AVX浮點操做不能以當即數值做爲操做數。
3.浮點比較操做:ucomiss、ucomisd。

教材學習中的問題和解決過程

  • 問題1:彙編中leaq和movq的區別是什麼?
  • 問題1解決方案:mov是將數據從源操做傳到目的操做數中,lea是將源操做數的地址傳到目的操做數中,一個是數據,一個是地址。
  • 問題2:incq 16(%rax)中的16是什麼意思?
  • 問題2解決方案:inc是目標操做數加一,16(%rax)是指寄存器rax的地址加16的意思麼?
  • 問題3:下面這個除法的彙編代碼中,%rdx是怎麼存了餘數?
x in %rdi,y in %rsi,qp in %rdx,rp in %rcx
movq %rdx,%r8
movq %rdi,%rax
cqto
idivq %rsi
movq %rax,(%r8)
movq %rdx,(%rcx)
ret
  • 問題3解決方案:不太理解,是跟高位低位有關麼?
相關文章
相關標籤/搜索