1. 程式人生 > >32位組合語言學習筆記(12)--分析switch語句的彙編程式碼

32位組合語言學習筆記(12)--分析switch語句的彙編程式碼



switch語句可以根據整數索引值進行多重分支選擇,程式碼的可讀性好,switch語句的彙編實現是通過跳轉表來完成的,這樣執行效率也很高。

int switch_eg(int x)

{

int result = x;

switch (x) {

case 100:

result*= 13;

break;

case 102:

result+= 10;

/*Fall through */

case 103:

result+= 11;

break;

case 104:

case 106:

result*= result;

break;

default:

result= 0;

}

return result;

}

gcc -c -O1 -m32 switch.c
objdump -d switch.o
switch.o:    file format elf32-i386
Disassembly of section .text:
00000000 <switch_eg>:
  0:  55                     push  %ebp
  1:  89 e5                  mov   %esp,%ebp
  3:  8b 45 08               mov   0x8(%ebp),%eax //eax = x = result
  6:  8d 50 9c               lea   0xffffff9c(%eax),%edx //edx = eax –0x64=eax-100
  9:  83 fa 06               cmp   $0x6,%edx //比較edx和6
  c:  77 15                  ja    23 <switch_eg+0x23> //如果result大於106,跳轉到0xe + 0x15= 0x23,default分支
  e:  ff 24 95 00 00 00 00   jmp   *0x0(,%edx,4) //跳轉到.rodata的首地址處加4*edx偏移的地址處
                                                 //獲取的地址就是要跳轉的地址。edx大於等於0,小於等於6 。
 15:  b8 14 05 00 00         mov   $0x514,%eax //result = 0x514 =1300, case 100分支
 1a:  eb 1b                  jmp   37 <switch_eg+0x37> //跳轉到0x1c+0x1b=0x37
 1c:  b8 70 00 00 00         mov   $0x70,%eax //eax = 0x70=112 case 102分支
 21:  eb 0c                  jmp   2f <switch_eg+0x2f> //跳轉到0x0c+0x23=0x2f
 23:  b8 00 00 00 00         mov   $0x0,%eax //result=0,default分支
 28:  eb 0d                  jmp   37 <switch_eg+0x37>//跳轉到0x0d+0x2a=0x37
 2a:  b8 67 00 00 00         mov   $0x67,%eax //result = 0x67=103 case 103分支
 2f:  83 c0 0b               add   $0xb,%eax //result += 11
 32:  eb 03                  jmp   37 <switch_eg+0x37> //跳轉到0x03+0x34=0x37
 34:  0f af c0               imul  %eax,%eax //result *= result case 104,106分支
 37:  5d                     pop   %ebp
 38:  c3                     ret   

jmp*0x0(,%edx,4),0x0會在連結時填充為.rodata(只讀資料段)的起始地址。 

objdump -s switch.o

switch.o:file format elf32-i386

Contents of section .text:

00005589e58b 45088d50 9c83fa06 7715ff24U...E..P....w..$

001095000000 00b81405 0000eb1b b8700000.............p..ta

002000eb0cb8 00000000 eb0db867 00000083...........g....

0030c00beb03 0fafc05d c3.......].

Contents of section .rodata:

000015000000 23000000 1c0000002a000000

....#.......*...

001034000000 23000000 340000004...#...4...

Contents of section .comment:

000000474343 3a202847 4e552920 342e312e.GCC: (GNU) 4.1.

001032203230 30383037 30342028 52656420220080704 (Red

002048617420 342e312e 322d3434 2900Hat4.1.2-44).

通過檢視只讀資料段的內容,可以確定裡面儲存的就是switch各個分支語句的地址。

相關推薦

32組合語言學習筆記(12)--分析switch語句彙編程式碼

switch語句可以根據整數索引值進行多重分支選擇,程式碼的可讀性好,switch語句的彙編實現是通過跳轉表來完成的,這樣執行效率也很高。int switch_eg(int x){int result = x;switch (x) {case 100:result*= 1

32組合語言學習筆記(32)--loop指令

 loop指令用ecx來控制迴圈次數,loop label,相當於如下兩條指令: dec ecx jne label 如下是使用loop指令的一個示例程式: section .data EditBuff: db 'abcdefghijklm',10 BUFFERL

32組合語言學習筆記(21)--用NASM實現Hello World小程式

前面20篇彙編學習筆記主要是學習《深入理解計算機系統》過程中所記錄的筆記,接下來打算學一下另外一本書《Assembly Language step by step programming with linux》。首先需要安裝NASM彙編器,例如:rpm –ivh nasm-2

32組合語言學習筆記(41)--fgets等函式的使用

 在《32位組合語言學習筆記(13)--函式的呼叫》曾分析過c函式的呼叫過程,對於c函式的預設呼叫約定cdecl,要求函式引數的壓棧順序是從右向左,由呼叫方來清理棧。下面示例程式會使用libc庫的幾個函式: char *fgets( char *string, int

Altium Designer學習筆記——12感測系統佈線技巧

1.如果器件的頻寬小於或大約等於1MHz,則用0.1uF的電容可能比較合適;    如果器件的頻寬大於或大約等於10MHz,則用10uF的電容可能比較合適;    如果頻寬在兩者之間,可同時使用這兩種容值的電容或者使用其一。 2.如果一個器件使用了兩個旁路電容,容值小的

量化投資學習筆記12——時間序列分析實操

還是宅在家裡,繼續學習。 用真實的股票資料來實踐一下剛學的時間序列分析的內容吧。分析一下我定投的兩支股票:300etf(510300),納指etf(513100)。 首先用tushare下載股價資料,時間範圍從其創立到2020年1月31日。然後將資料處理後存入csv檔案,再把下載資料的程式碼註釋掉,以後直接從

python 學習筆記 12 -- 寫一個腳本獲取城市天氣信息

unit real bin 程序 用例 性感 小時 == exit 近期在玩樹莓派,前面寫過一篇在樹莓派上使用1602液晶顯示屏,那麽可以顯示後最重要的就是顯示什麽的問題了。最easy想到的就是顯示時間啊,CPU利用率啊。IP地址之類的。那麽我認為呢,假設可以顯示當前時

Java學習筆記-12.傳遞和返回對象

使用方法 自己 ots 返回 stringer integer print util solid 1.Clone()方法產生一個object,使用方法後必須產生的object賦值。 Vector v2 = (Vector)v.clone(); 2.Clone()方法在ob

【幹貨】Html與CSS入門學習筆記12-14【完】

進度條 tom step char number 視頻容器 復選框 其中 私有 十二、HTML5標記 現代HTML html5新增的元素:header nav footer aside section article time 這些新增元素使頁面結構更清晰,取代<di

LR學習筆記12-測試腳本的增強方法

gif 列操作 必須 大眾 att 下界 http output tour 本次開始步入重點了,好好學習哦。學習內容如下: --事務 --參數化 --如何驗證網頁的內容(檢查點) --如何產生調試信息(輸出函數) 1、事務 事務就是一系列操作的集合 插入事務方便我們今後的分

46、我的C#學習筆記12

c#刪除字符串:String類提供了一個Remove方法,用於從一個字符串的指定位置開始,刪除指定數量的字符,其語法格式如下:public String Remove(int startIndex)public String Remove(int startIndex,int count)其中:startIn

hibernate框架學習筆記12:查詢優化

不發送 方法 加載策略 單表查詢 lazy action private 對象 建議 類級別查詢優化: 創建一個實體類: package domain; import java.util.HashSet; import java.util.Set; //客戶實體 p

[離散時間信號處理學習筆記] 12. 連續時間信號的離散時間處理以及離散時間信號的連續時間處理

.cn post 包括 oat text lock let 通過 symbol 連續時間信號與離散時間信號之間的關系 下表為各符號的解釋 Symbol FT DTFT Info $x_c(t)$ $X_c(j\Omega)$ - 連續時間信號 $x[n]$ -

學習筆記(12)

學習筆記註意: 在填充512字節的時候註意bs的大小要是用1字節來填充 dd if=/dev/zero of=/dev/sdb bs=1 count=2 skip=510 seek=510刪除硬盤的時候最好在關機的狀態下來執行,虛擬機模擬環境也最好這樣做補充:創建pv既可以分區也可以磁盤1.創建軟raid(4

Python+Selenium學習筆記12 - 窗口大小和滾動條

www ref 分享圖片 滾動條 IT 邊距 utf-8 alt set 涉及到的三個方法 set_window_size() 用於設置瀏覽器窗口的大小 e.gset_window_size(600,600) window.scrollTo() 用於設置瀏覽器窗口滾動條的

吳恩達機器學習筆記 —— 12 機器學習系統設計

不知道 cor 算法 項目 詞語 樣本 我們 們的 ... http://www.cnblogs.com/xing901022/p/9362339.html 本章主要圍繞機器學習的推薦實踐過程以及評測指標,一方面告訴我們如何優化我們的模型;另一方面告訴我們對於分類的算法

Angular6學習筆記12:HTTP(2)

HTTP 繼學習筆記11以後,可以模擬的呼叫get方法,並且可以利用某一個ID去查詢某一個Hero的詳細資訊。 1.修改Hero的資訊 當需要修改某一個hero的名字的時候,當點選後退的時候,之前的所做的改變的資訊都會小時不在,在實際應用中,這些修改都應該是被儲存的,需要將修改後的資訊,

指標(C++學習筆記 12

記憶體將每個位元組作為一個儲存單元,並給每個儲存單元指定一個編號作為其地址。 系統給不同資料型別分配的儲存空間大小是不一樣的,如:整型變數分配2個位元組的儲存空間;double型變數分配8個位元組;字元型變數分配1個位元組。 變數的地址:因為一個變數的儲存空間要連續佔用若

SpringBoot學習筆記(12)----SpringBoot實現多個 賬號輪詢傳送郵件

  首先,引入傳送郵件的依賴,由於freemarker自定義模板,所以也需要把freemarker的依賴引入   pom.xml檔案 <dependency> <groupId>org.springframework.boot</groupId

java學習筆記(12)

1:StringBuffer(掌握) (1)用字串做拼接,比較耗時並且也耗記憶體,而這種拼接操作又是比較常見的,為了解決這個問題,Java就提供了 一個字串緩衝區類。StringBuffer供我們使用。 (2)StringBuffer的構造方法 A:StringBuffer() B:St