日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Intel汇编程序设计-高级过程(上)

發布時間:2025/6/17 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Intel汇编程序设计-高级过程(上) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第八章?高級過程

8.1?簡介

本章主要講:

堆棧框架

變量作用域和生存期

對戰參數的類型

通過傳遞值或者傳遞引用來傳遞參數

在堆棧上創建和初始化局部變量

遞歸

編寫多模塊程序

內存模型和語言關鍵字

注意關鍵詞:

子過程=函數=方法(因不同語言導致名字不統一)

8.2堆棧框架(很重要)

? ? 堆棧框架(stack?frame)也稱活動記錄(activation?record),它是為傳遞的參數、子例程的返回地址、局部變量和保存的寄存器保留的堆棧空間。堆棧框架是按一下步驟創建的:

1.如果有傳遞的參數,則壓入堆棧。

2.子歷程被調用,字壘成的返回地址壓入堆棧。

3.子例程開始時,EBP被壓入堆棧。

4.EBP設為ESP的值,從這時開始,EBP就被座位尋址所有子例程參數的基址指針使用了。

5.如果任何寄存器需要保存,則亞茹堆棧。

? ? 堆棧框架的結構手程序的內存模式及參數傳遞約定直接影響。

8.2.1?堆棧參數

? ? 有兩種基本類型的子例程參數:寄存器參數和堆棧參數。Irvine32Irvine16庫使用寄存器參數,本節講述如何聲明和使用堆棧參數。

? ? 被調用的子例程訪問調用子例程時亞茹堆棧的參數。使用寄存器參數可以優化程序的執行速度,但是遺憾的是,這樣可能會造成代碼的混亂,因為有些寄存器在裝入參數之前必須首先保存。例如,調用DumpMem時就是這種情況:


Pushad

Mov?esi,OFFSET?array???????????;起始偏移地址

Mov?ecx,LENGTHOF?array???????;大小

Mov?ebx,TYPE?array????????????;雙字格式

Call?DumpMem????????????????;顯示內存內容?

Popad

?

? ? 另外一種更靈活的方式是堆棧參數,在調用子例程之前,參數首先壓入堆棧。例如,假設DumpMem使用堆棧參數,那么可以使用下面的代碼進行調用:

Push?TYPE?array

Push?LENGTHOF?array

Push?PFFSET?array

Call?DumpMem

? ? 在進行子例程調用時在堆棧上壓入了兩類參數:

? ? ? 值參數(變量和常量的值)

? ? ? 引用參數(地址)

?

堆棧參數的訪問(C/C++

? ? 在調用函數時,C/C++程序使用標準的方法初始化和訪問參數。C/C++中的函數以序言(prologue)開始,序言部分的代碼保存了EBP寄存器,并使EBP指向當時堆棧的頂部,函數還有可能把一些寄存器壓棧,這些寄存器的值將在函數返回的時候恢復。函數以收尾(epilogue)代碼結束,在這部分代碼中,EBP寄存器被恢復,RET指令從函數返回。

例子AddTwo

C:

Int?AddTwo(int?x?,int?y){

????Return?x?+?y;

}

對應匯編:

?

AddTwo?PROC

Push?ebp

Mov?ebp,esp??????????;堆棧框架的基址

Mov?eax,[ebp+12]?????;第二個參數

Mov?eax,[ebp+8]??????;第一個參數

Pop??ebp???????

Ret

AddTwo?ENDP


自己用vs2012看了下反匯編(DeBug模式)

調用部分:

?

函數部分


堆棧的清理

? ? 在子例程返回時,必須要有某種方法清除堆棧上的參數,否則就會導致內存泄漏以及堆棧的破壞。假設main中調用AddTwo的語句如下:

Push?5

Push?5

Call?AddTwo

下面是從調用返回后堆棧的示意圖:

?

? ? 如果沒有清理,那么函數結束的時候就會從棧里拿出來一個地址,然后跳轉過去。那么上面就直接跳轉到存儲5的地 址了,這樣就發生問題了。

? ?對于這個問題,一種簡單的解決方法是在CALL指令后使用一條ADD指令給ESP加上一個值,以使ESP指向正確的返回地址:

Example1?PROC

????Push??5

????Push??6

????Call??AddTwo

????Add??esp,8

????Ret

Example1?ENDP

? ? 這實際上也是C++使用的一種方法。

????STDCALL調用約定(Calling?Convention:處理堆棧清理問題的另一種方法是使用STDCALL調用約定,可以在AddTwo過程中的RET指令后提供一個整數參數以修復ESP的值,這個整數值必須等于堆棧參數小號的堆棧空間字節數。

? ? 大體是下面這樣的姿勢:

AddTwo?PROC

Push??ebp

Mov??ebp,esp

Mov??eax,[ebp+12]

Add??eax,[ebp+8]

Pop?ebp

Ret?8

AddTwo?ENDP

? ? 這樣一來,上面堆棧清理問題就簡化了:誰應該對清理堆棧負責?是調用子例程的代碼,還是子例程本身?這兩種方式都有各自的優缺點:STDCALL減少了為子例程調用生成代碼數量(只有一條指令)并且能夠確保調用者永遠不會忘記清理堆棧;另一方面,C調用約定允許子例程生命可變數目的參數,由調用者決定要傳遞多少參數。例子之一是printf函數,這種類型的,清理堆棧的職責職能留給調用者了。

? ? 通過堆棧傳遞8位和16位的參數

? ? 在保護模式下傳遞參數時,最好使用32位的操作數,雖然可以砸IDUI站上壓入16位的操作數,但這樣會似的ESP無法對其在雙字地址邊界上,由此可能會導致發生頁故障,程序的性能也能會降低。因此在傳遞8位或16位對扎你參數時,應把它擴展到32位在壓棧。

So需要把一些小寬度參數擴展成32位的:movzx?eax,word1

那如果是大于32位的怎么辦?:這個我們可以分開傳遞,先傳32位,再傳32...

?

USER操作符對堆棧的影響

之前應該說過USER,它可以幫助保存和恢復一些寄存器的值。例如:

MySub1?PROC?USES?ecx?,edx

Ret

MySub1?ENDP

下面是匯編時產生的代碼:

Push?ecx

Push?edx

Pop??edx

Pop??ecx

Ret


? ? 假設在MySub2中把USES和堆棧參數一起使用,我們預期第一個參數在堆棧位置EBP+8處:

MySub2?PROC?USES?ecx?,edx

Push?ebp

Mov?ebp,esp

Mov?eax,[ebp+8]

Pop?ebp

Ret?4

MySub2?ENDP

下面是生成的匯編代碼
push?ecx

Push?edx

Push?ebp

Mov?ebp,esp

Mov?eax,dword?ptr[ebp+8]??;錯誤的位置!

Pop?ebp

Pop?edx

Pop?ecx

Ret?4

總結

以上是生活随笔為你收集整理的Intel汇编程序设计-高级过程(上)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 五色天婷婷 | 亚洲网站视频 | 精品在线一区 | 15p亚洲| 亚洲色图 一区二区 | 亚洲涩网| 成人精品网 | 久久久久久一级片 | 91精品国产综合久久精品 | 亚洲自拍偷拍网 | 中文字幕一区二区三区精彩视频 | 尤物在线观看视频 | 欧美人妻精品一区二区三区 | а 天堂 在线 | 视频这里只有精品 | 免费啪啪网 | 日本黄色一区 | 美女扒开腿让男生桶 | 国产精品久久久精品三级 | 久久99精品久久久 | 无码人妻丰满熟妇啪啪 | 色综合图片 | 天天摸天天摸 | 国产精品久久久久久久一区二区 | 手机天堂av| 欧美丰满老熟妇aaaa片 | 亚洲毛片在线 | 日本在线视频www | 成人高潮视频 | 亚洲欧美综合视频 | 亚洲av永久一区二区三区蜜桃 | 国产乱子伦视频一区二区三区 | 免费毛片视频 | 免费在线一区二区三区 | 久久久久999 | 日本在线不卡一区二区三区 | 久草视频在线资源站 | 亚洲第一区在线播放 | 国产福利免费在线观看 | 就去色综合 | 欧美自拍偷拍第一页 | 久久精品无码一区 | 一区二区三区四区人妻 | 各处沟厕大尺度偷拍女厕嘘嘘 | αv在线 | 99久久久国产精品无码网爆 | 日本丰满大乳奶做爰 | 中文字幕免费视频观看 | 在线99| 欧美人体一区二区 | 国产少妇在线 | 伊人狠狠干| 国产高清视频在线免费观看 | av久久久久久 | 欧美爱爱网| 在线免费看av片 | 少妇高潮一区二区三区99刮毛 | 粉嫩av一区二区三区免费观看 | 亚洲国产日韩欧美 | 黄色aaaa | 中文无码一区二区三区在线观看 | 国内黄色网址 | 成人免费毛片足控 | 黄色av免费在线观看 | 综合色婷婷一区二区亚洲欧美国产 | 波多野一区 | 豆花av| 一区二区三区四区在线播放 | 精品欧美乱码久久久久久 | 驯服少爷漫画免费观看下拉式漫画 | 国产高清免费在线观看 | 可以免费看的av网站 | 国产乱码精品 | 国产视频一二三 | 午夜成人亚洲理伦片在线观看 | 青青视频免费 | 99热热99 | 天天精品综合 | 91啪在线观看 | 成人在线你懂的 | 公侵犯人妻一区二区三区 | 男生插女生网站 | 国产重口老太伦 | 亚洲国产高清在线 | 高柳家在线观看 | 日日噜噜噜 | 91中文在线 | 色乱码一区二区三区在线男奴 | 国产精品自拍偷拍视频 | 午夜视频久久 | 亚洲一区二区三区电影在线观看 | 五月天视频| 在线观看黄色免费视频 | 国内激情视频 | 免费毛片网站 | 开心黄色网 | 中文字幕欧美人妻精品 | 日日碰碰| a√在线观看 |