本章主要介紹了c語言和彙編的關係、棧的變化、指針數組、浮點代碼等知識。linux
1.機器級編程,兩種抽象最重要,第一種是由指令集體系結構或指令集架構,第二種是**機器級程序使用的內存地址是虛擬地址。
2.程序內存包含:機器代碼、信息、運行時棧、內存塊。編程
1.32位數爲「雙字」,64位數爲「四字」。
2.數據傳送指令有四個變種:movb(字節)、movw(字)、movl(雙字)、movq(四字)數組
1.一個CPU包含一組16個存儲64位值的通用目的寄存器,這些寄存器用來存儲整數數據和指針。
2.不一樣的操做數可能性被分爲三種類型:當即數、寄存器、內存引用。
3.數據傳送指令:mov類第一條指令將源值加載到寄存器中,第二條將該寄存器值寫入目的位置。
4.棧遵循「後進先出」的原則,push壓棧,pop刪除數據。數據結構
1.操做分爲四種:加載有效地址、一元操做、二元操做和位移。
2.加載有效地址:leaq
3.一元操做:inc、dec、neg、not
4.二元操做:add、sub、imul、xor、or、and
5.位移:sal、shl、sar、shr架構
1.條件碼:CF(進位標誌)、ZF(零標誌)、SF(符號標誌)、OF(溢出標誌)
2.設置條件碼:cmp、test
3.訪問條件碼:set
4.跳轉指令:jmp函數
1.棧幀:須要的存儲空間超出寄存器可以存放的大小時,就會在棧上分配空間。
2.有n個整型參數,且n>6,要把參數1~6複製到對應的寄存器,把參數7~n放到棧上,而參數7位於棧頂,全部數據大小都向8的倍數對齊。學習
1.數組元素i會被存放在地址爲xA+Li的地方
2.數組元素D[i][j]的內存地址爲&D[i][j]=xD+L(Ci+j)編碼
1.c語言提供兩種將不一樣類型的對象組合到一塊兒建立數據類型的機制:結構、聯合
2.結構:用將關鍵字struct聲明,將多個對象集合到一個單位中。
3.聯合:用關鍵字union聲明,容許用幾種不一樣的類型來引用一個對象。指針
1.每一個指針對應一個類型、每一個指針都有一個值、指針用‘&’運算符建立、*操做符用於間接引用指針、數組與指針緊密相連、將指針從一種類型強制轉換成另外一種類型、指針也能夠指向函數。
2.啓動gdb:linux> gdb prog
3.緩衝區溢出:在棧中分配某個字符數組來保存一個字符串,可是字符串長度超出了爲數組分配的空間。
4.對抗緩衝區溢出攻擊:棧隨機化、棧破壞檢測、限制可執行代碼區域。code
1.浮點運算操做:vadd、vsub、vmul、vdiv、vmax、vmin、sqrt
2.AVX浮點操做不能以當即數值做爲操做數。
3.浮點比較操做:ucomiss、ucomisd。
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