深入理解計算機系統
首先,我們應該要清楚,計算機在底層實際上處理不了人類的高階語言,只能將我們的程式一步一步的變成二進位制指令,也就是位元組序列。
前面講到過,計算機系統使用了多種不同形式的抽象,利用抽象模型來簡化細節。對於機器級程式設計,兩種抽象。
指令集體系架構(isa)來定義機器級程式的格式和行為。
機器級程式使用的記憶體位址是虛擬位址,提供的記憶體模型看上去是乙個非常大的位元組陣列。後面會講到,儲存器系統的實際實現是將多個硬體儲存器和作業系統軟體組合起來。作業系統負責管理虛擬位址空間,將虛擬位址翻譯成實際處理器記憶體中的實體地址。
所有以『.』開頭的都是指導彙編器和鏈結器工作的指令
intel用術語「字(word)」表示16位資料型別。32位稱為「雙字」。64位:四字。
壓入和彈出程式棧
程式棧是很重要的,在x86-64中,程式棧存放在記憶體中某個區域。棧是向下增長,也就是說棧頂元素的位址是所有棧中元素位址中最低的。棧指標%rsp儲存著棧頂元素的位址
具體:p127
跳轉指令是如何編碼的
跳轉指令有不同的編碼,最常用的是pc相對的,還有一種就是給出絕對位址。實際上,大多用的都是pc相對的,跳轉指令後面跟的並不是要跳轉的目的位址,也就是說不是絕對的位址,而是將目標指令的位址與緊跟在跳轉指令後面的那條指令的位址之間的差作為編碼
switch語句是怎麼實現的
通過跳轉表來實現,跳轉表是乙個陣列,表項i是乙個**段的位址,這個**段實現當開關索引值等於i是程式應該採取的動作。程式**用開關索引值來執行乙個跳轉表內的陣列引用,確定跳轉指令的目標。p161
過程是軟體中一種很重要的抽象。它提供了一種封裝**的方式,用一組指定的引數和乙個可選的返回值實現了某種功能。
假設過程p呼叫過程q,q執行後返回到p。這些動作包括:
傳遞引數
傳遞資料
分配和釋放記憶體
c語言過程呼叫機制的乙個關鍵特性在於使用了棧資料結構提供的後進先出的記憶體管理原則。p164
很重要的一點就是通過棧可以儲存執行資訊,也就是說如果我要中途呼叫另乙個過程,我先把我要執行的下一條指令(也就是執行跳轉指令後的一條指令)給push到棧中。在返回時,再pop。這是很關鍵的處理呼叫的乙個體現。
資料傳送
呼叫乙個過程,還可能包括把資料作為引數傳遞,從過程返回還有可能包括返回乙個值。
有些時候,區域性資料必須放在記憶體中,常見情況:
變長陣列p181
資料對齊p189
記憶體越界引用和緩衝區溢位是造成重大bug的一大因素
對抗緩衝區溢位攻擊的三種方法:
棧隨機化:使棧的位置在程式每次執行時都有變化
棧破壞檢測:在棧幀中任何區域性緩衝區和棧狀態之間設定乙個哨兵
限制可執行**區域
可變長棧幀p201
程式的機器級表示
三種 立即數 常數值,在att格式的彙編 中,書寫格式是 整數,如 123 0x12 暫存器 如 32位的 eax 16位的 ax 8位的 al 儲存器引用 mov 同等傳送,即倆者的大小一致 如 movb byte,movew word,movel longword dw movs movz 不同...
程式的機器級表示
32位和64位 instruction system architecture 程式計數器pc eip 整數暫存器 8個每個32位 有的用來記錄狀態,有的用來儲存臨時資料,區域性變數,返回值 3.條件碼暫存器 指標都是雙字 char short long 其他4位元組 movb movw movl ...
程式的機器級表示
本文對 深入理解計算機系統 第三版 中第三章 程式的機器級表示 中的部分內容進行了整理,以方便日後查閱。目錄 1.整數暫存器 2.運算元 3.資料傳送指令 mov類。4.壓入和彈出棧資料 push操作和pop操作 5.算術和邏輯操作 6.條件碼 7.比較和測試指令 cmp和test 8.set指令 ...