程式的機器級表示

來源:互聯網
上載者:User

標籤:

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命令

二、實驗練習
  1. (以下命令為實驗樓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;}
  1. 刪除gcc產生代碼中以"."開頭的編譯器指令,針對每條指令畫出相應棧幀的情況

  2. (選做)使用gdb的bt/frame/up/down 指令動態查看調用棧幀的情況

程式的機器級表示

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.