2017-2018-1 20179215《Linux內核原理與分析》第二周作業

20179215《Linux內核原理與分析》第二周作業

這一周主要了解了計算機是如何工作的,包括現在存儲程序計算機的工作模型、X86匯編指令包括幾種內存地址的尋址方式和push、pop、call、re等幾個重要的匯編指令。主要分為兩部分進行這周的學習總結。第一部分對學習內容進行總結,第二部分對實驗進行分析(反匯編一個C程序)。


一、學習內容

1、現在計算機絕大多數采用馮諾依曼體系結構,邏輯上可以抽象成:

neiyKF3.png

以程序員的角度看:

PuKRvoO.png

2、幾種尋址方式

? movl %eax,%edx edx=eax 寄存器尋址

? movl \(0x123,%edx edx=0x123 立即尋址 ###? movl 0x123,%edx edx=*(int32_t)0x123 直接尋址 ###? movl (%ebx),%edx edx=(int32_t)ebx 間接尋址 ###? movl 4(%ebx),%edx edx=(int32_t)(ebx+4) 變址尋址 ####其中%..代表寄存器,\)..代表取出數據,(%..)代表取出寄存器中所存儲的數據,b、w、l、q分別代表8位、16位、32位和64位。

3、push、pop、call等幾個重要的匯編指令。

eg (1) pushl %eax 意思是把eax寄存器壓棧。分解來看相當于第一步:subl $4 esp,第二步:movl %eax (%esp),來解釋一下:首先我們要知道esp是指堆棧棧頂,那么由于棧的一般生長方向為自上向下增長,進行push壓棧指令時棧頂指針向下移動4個字節(因為是32位機),之后把eax放入當前內存位置。

(2) popl %eax意思是把eax寄存器出棧。分解來看相當于第一步: movl(%esp), %eax第二步:add \(4 %esp,道理同(1)逆。 ###(3) call 0X12345 意思是函數調用,過程是首先將當前CPU獲取內存的指令壓棧保存,賦予新值,CPU下次就從新地址來取指令了,即實現了函數調用。 #二、實驗分析 ##首先創建main.c文件,即:touch main.c,之后用如下命令輸入一段C語言代碼: ###\)vi main.c,之后用gedit main.c 查看編寫好的C程序,如下圖所示:

S2fd1KH.png

然后用如下命令反匯編:$gcc -S -o main.s main.c -m32,之后用gedit main.c 查看結果,如下圖所示:

uMz7mKd.png
1xeYtnI.png
TBsy0Cc.png
vsBWpLR.png

由于“.”開頭的大都是用于鏈接輔助信息,實際并不會執行,所以可以直接忽略。刪除所有點開頭的內容,留下來的是純匯編代碼。那么此段程序簡化后就變成如下形式:

g:

pushl   %ebp
movl    %esp, %ebp
movl    8(%ebp), %eax
addl    $20, %eax
popl    %ebp
ret 

f:

pushl   %ebp
movl    %esp, %ebp
subl    $4, %esp
movl    8(%ebp), %eax
movl    %eax, (%esp)
call    g   
leave
ret 

main:

pushl   %ebp           
movl    %esp, %ebp
subl    $4, %esp
movl    $10, (%esp)
call    f   
addl    $30, %eax

分析如下圖:

JYisZfi.jpg
rl8sDuI.png

Eip寄存器 從這條指令執行完自動執行下有一條指令

Ebp寄存器 總是指向堆棧的棧底 概念的是相對的,跳出該函數進入其他函數堆棧有其相應的棧底

Esp寄存器 總是指向堆棧的棧頂

Eax寄存器 函數的返回值默認使用該寄存器存儲返回給上一級函數

分析如下:

程序從main函數開始運行,因為之前還有別的代碼運行,所以把當前ebp進行壓棧,之后指針向下一個字節,相當于在下個字節內填充數據,之后調用f函數,而當前eip指向call f的下一條指令(eip在進行call f指令后壓棧,下回跳轉到eip繼續執行)。那么對于即將要執行的f函數來說首先要將當前ebp壓棧,那么和main函數類似,指針下移一個字節,把10放進寄存器eax中,再把寄存器eax給esp,當前eip指向call g的下一條指令(當前eip在進行call g指令后壓棧),之后調用g函數,同樣先將ebp壓棧,之后esp,ebp指向同一個位置,之后ebp指針向上移動兩個字節把當前字節內內容放到eax寄存器中,將eax儲存的數加20后出棧,返回到f函數的leave命令,撤銷函數堆棧后返回到main函數的leave命令,將eax的當前值30加30,之后撤銷函數堆棧,返回程序運行值。

轉載于:https://www.cnblogs.com/yl-930/p/7638587.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/391180.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/391180.shtml
英文地址,請注明出處:http://en.pswp.cn/news/391180.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python:單例模式--使用__new__(cls)實現

單例模式:即一個類有且僅有一個實例。 那么通過python怎么實現一個類只能有一個實例呢。 class Earth:"""假如你是神,你可以創造地球"""print 歡迎來到地球# 生成一個地球 a Earth() print id(a)# 再生成一個地球 b Ear…

重學TCP協議(5) 自連接

1.自連接是什么 在發起連接時,TCP/IP的協議棧會先選擇source IP和source port,在沒有顯示調用bind()的情況下,source IP由路由表確定,source port由TCP/IP協議棧從local port range中選取尚未使用的port。 如果destination IP正…

Gradle復制文件/目錄方法

2019獨角獸企業重金招聘Python工程師標準>>> gradle復制文件/文件夾方法 復制文件 //復制IDE生成的classes.jar文件到build/libs中,并改名為FileUtils.jar. task copyFile(type:Copy) {delete build/libs/FileUtils.jarfrom(build/intermediates/bundles…

用戶參與度與活躍度的區別_用戶參與度突然下降

用戶參與度與活躍度的區別disclaimer: I don’t work for Yammer, this is a public data case study, I’ve written it in a narrative format to make this case study more engaging to read.免責聲明:我不為Yammer工作,這是一個公共數據案例研究&am…

python:__new__()與__init__()

參考:https://blog.csdn.net/qq_41020281/article/details/79638370 轉載于:https://www.cnblogs.com/gcgc/p/11585599.html

重學TCP協議(6) 四次揮手

1. 四次揮手 客戶端進程發出連接釋放報文,并且停止發送數據。釋放數據報文首部,FIN1,其序列號為sequ(等于前面已經傳送過來的數據的最后一個字節的序號加1),此時,客戶端進入FIN-WAIT-1&#xff…

mysql數據庫部分操作指令

用cmd開啟服務時拒絕訪問. 原因:不是管理員用戶,沒有權限 將服務中的 MySQL設置為手動啟動, 否則 開機自動啟動. 啟動mysql服務,用管理員權限打開dos界面 windowsX A 打開開始界面 點擊管理員開啟cmd 啟動服務:net start …

推箱子2-向右推!_保持冷靜并砍箱子-嗶

推箱子2-向右推!Hack The Box (HTB) is an online platform allowing you to test your penetration testing skills. It contains several challenges that are constantly updated. Some of them simulating real world scenarios and some of them leaning more towards a C…

UML建模圖實戰筆記

一、前言 UML:Unified Modeling Language(統一建模語言),使用UML進行建模的作用有哪些: 可以更好的理解問題可以及早的發現錯誤或者被遺漏的點可以更加方便的進行組員之間的溝通支持面向對象軟件開發建模,可…

數據草擬:使您的團隊熱愛數據的研討會

Learn the rules to Data Draw Up; a fun way to get your teams invested in data.了解數據收集的規則; 一種讓您的團隊投入數據的有趣方式。 Let’s keep things short. Metrics are one of the most important things in Product Management. They help us to u…

python:列表推導式

python中有種獨特的語法:推導式,可以將代碼壓縮到1行,但是不使用也不影響。 有三種:列表、字典、集合(注意沒有元組推導式) 列表推導式 # 1、一行代碼實現1—100之和(知識點:列表推導式) print(…

WPF中刪除打開過的圖片

WPF中刪除打開過的圖片 原文:WPF中刪除打開過的圖片在WPF中,當我們刪除打開過的圖片時,往往會遇到"...無法刪除,文件正在被另一個進程使用"的異常。即使當前文件是打開后關閉過的也不行。 這個問題的原因很簡單,是因為W…

深入理解InnoDB(5)-文件系統

1. 數據庫和文件系統的關系 像 InnoDB 、 MyISAM 這樣的存儲引擎都是把表存儲在文件系統上的。當我們想讀取數據的時候,這些存儲引擎會從文件系統中把數據讀出來返回給我們,當我們想寫入數據的時候,這些存儲引擎會把這些數據又寫回文件系統。…

vim捐贈_#PayItBackwards-一位freeCodeCamp畢業生如何向事業捐贈10,000美元

vim捐贈On Monday my phone suddenly started buzzing. Shawn Wang, AKA Swyx, had just tweeted about a donation hed made to freeCodeCamp.org.星期一,我的電話突然開始嗡嗡作響。 Awn Swyx的Shawn Wang剛剛在推特上發布了他對freeCodeCamp.org的捐款。 I glan…

Digital River拉來Netconcepts站臺 亞太營銷服務升級

它是大洋彼岸的一家網絡軟件下載、分銷商,很多重量級的軟件行業領軍企業都是其客戶,它一直低調摸索亞太營銷的路子,在今年九月份,它一改常態,高調宣布入華,三個月后,它帶來了最新消息&#xff1…

按下按鈕_按下

按下按鈕Updated with the latest data: 23/8/2020更新最新數據:23/8/2020 As restrictions are lifted for Laois and Offaly, difficult times are set to continue for the people of Kildare, at least for another couple of weeks, as they continue to fight…

windows中怎么添加定時任務

linux中有crontab定時任務,很方便 其實windows也有類似的 需求:定時執行python腳本 1、Windows鍵R,調出此窗口,輸入compmgmt.msc 2、 轉載于:https://www.cnblogs.com/gcgc/p/11594467.html

css設置黑體宋體等(轉)

代碼如下: .selector{ font-family:"Microsoft YaHei",微軟雅黑,"MicrosoftJhengHei",華文細黑,STHeiti,MingLiu } 說明: 加上中文名“微軟雅黑”是為了兼容opera。 MicrosoftJhengHei為微軟正黑體,STHeiti為華文黑體,Mi…

重學TCP協議(7) Timestamps 選項

1.Timestamps 選項的組成部分 時間戳選項占10個字節 kind(1字節) + length(1字節) info (8字節),其中kind8,length10,info由timestamp(TS value)和timestamp echo(TS Echo Reply)兩…

sudoku代碼_首席執行官可以編碼嗎? 在星期六晚上坐在酒吧時,從頭開始觀看Netlify首席執行官的Sudoku應用程序代碼

sudoku代碼Netlify CEO Matt Biilmann live-codes a Sudoku app using Netlify in this tutorial video. Matt shows how simple and quick it can be to create a working app using the JAMstack.在本教程視頻中,Netlify CEO Matt Biilmann使用Netlify對Sudoku應用…