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