標籤:
3.1-3.7中練習,重點:3.1,3.3,3.5,3.6,3.9,3.14,3.15,3.16,3.22,3.23,3.27,3.29,3.30,3.33,3.34
p104, p105: X86 定址方式經曆三代:
1 DOS時代的平坦模式,不區分使用者空間和核心空間,很不安全 2 8086的分段模式 3 IA32的帶保護模式的平坦模式
p106: ISA的定義,ISA需要大家能總結規律,舉一反三,比如能對比學習ARM的ISA;PC寄存器要好好理解;
p107: gcc -S xxx.c -o xxx.s 獲得彙編代碼,也可以用objdump -d xxx 反組譯碼; 注意函數前兩條和後兩條彙編代碼,所有函數都有,建立函數調用棧幀,應該理解、熟記。
注意: 64位機器上想要得到32代碼:gcc -m32 -S xxx.c MAC OS中沒有objdump, 有個基本等價的命令otool Ubuntu中 gcc -S code.c (不帶-O1) 產生的代碼更接近教材中代碼(刪除"."開頭的語句)
p108: 二進位檔案可以用od 命令查看,也可以用gdb的x命令查看。 有些輸出內容過多,我們可以使用 more或less命令結合管道查看,也可以使用輸出重新導向來查看
od code.o | more od code.o > code.txt
p109: gcc -S 產生的彙編中可以把 以”.“開始的語句都刪除了再閱讀
p110: 瞭解Linux和Windows的彙編格式有點區別:ATT格式和Intel格式
p111: 表中不同資料的彙編代碼尾碼
p112: 這幾個寄存器要深入理解,知道它們的用處。esi edi可以用來操縱數組,esp ebp用來操縱棧幀。 對於寄存器,特別是通用寄存器中的eax,ebx,ecx,edx,大家要理解32位的eax,16位的ax,8位的ah,al都是獨立的,我們通過下面例子說明:
假定當前是32位x86機器,eax寄存器的值為0x8226,執行完addw $0x8266, %ax指令後eax的值是多少? 解析:0x8226+0x826=0x1044c, ax是16位寄存器,出現溢出,最高位的1會丟掉,剩下0x44c,不要以為eax是32位的不會發生溢出.
p113: 結合表,深入理解各種 定址方式;理解運算元的三種類型:立即數、寄存器、儲存空間;
掌握有效地址的計算方式 Imm(Eb,Ei,s) = Imm + R[Eb] + R[Ei]*s
p114: MOV相當於C語言的賦值”=“,注意ATT格式中的方向,
另外注意不能從記憶體位址直接MOV到另一個記憶體位址,要用寄存器中轉一下。能區分MOV,MOVS,MOVZ,掌握push,pop
p115/p116: 棧幀與push pop; 注意棧頂元素的地址是所有棧中元素地址中最低的。
p117: 指標就是地址;局部變數儲存在寄存器中。
p119: 結合表理解一下算術和邏輯運算, 注意目的運算元都是什麼類型 特別注意一下減法是誰減去誰 注意移位操作移位量可以是立即數或%cl中的數
p123: 結合C語言理解一下控制部分,也就是分支(if/switch),迴圈語句(while, for)如何?的。考驗大家舉一反三的學習能力。控制中最核心的是跳躍陳述式:有條件跳轉p128(實現if,switch,while,for),無條件跳轉jmp(實現goto)
p124: 有條件跳轉的條件看狀態寄存器(教材上叫條件碼寄存器) 注意leal不改變條件碼寄存器 思考一下:CMP和SUB用在什麼地方 p125: SET指令根據t=a-b的結果設定條件碼
p127: 跳轉與標號
p130/p131: if-else 的彙編結構
p132/p133: do-while
p134/p135: while
p137/p138: for
p144/p145: switch
p149: IA32通過棧來實現程序呼叫。掌握棧幀結構,注意函數參數的壓棧順序.
p150/p151: call/ret; 函數傳回值存在%eax中
p174: bt/frame/up/down :關於棧幀的gdb命令
二、實驗練習
- (以下命令為實驗樓64位Linux虛擬機器環境下適用,32位Linux環境可能會稍有不同) 使用
gcc –S –o main.s main.c -m32
命令編譯成彙編代碼,如下代碼中的數字和函數名請自行修改以防與他人雷同
int g(int x){ return x + 3;}int f(int x){ return g(x);}int main(void){ return f(8) + 1;}
-
刪除gcc產生代碼中以"."開頭的編譯器指令,針對每條指令畫出相應棧幀的情況
-
(選做)使用gdb的bt/frame/up/down 指令動態查看調用棧幀的情況
程式的機器級表示