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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

汇编语言开头写C清零是为啥,这个汇编语言代码是什么意思?

發布時間:2023/12/20 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编语言开头写C清零是为啥,这个汇编语言代码是什么意思? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

讓我們分解一下:

.file "delta.c"

編譯器使用它來告訴您程序集來自的源文件.這對匯編程序來說意義不大.

.section .rodata

這將開始一個新的部分. “rodata”是“只讀數據”部分的名稱.本節最終將數據寫入可執行文件,該數據庫將內存映射為只讀數據.可執行映像的所有“.rodata”頁面最終都被所有進程共享

加載圖像.

通常,源代碼中的任何“編譯時常量”都無法優化到匯編內部函數中,最終將存儲在“只讀數據部分”中.

.LC0:

.string "%d"

.LC0“部分是一個標簽.它提供了一個符號名稱,它引用文件中后面出現的字節.在這種情況下,”LC0“表示字符串”%d“.GNU匯編程序使用標記開頭的約定帶有“L”的被認為是“本地標簽”.這具有技術含義,對編寫編譯器和鏈接器的人來說非常有趣.在這種情況下,編譯器使用它來引用特定目標文件專用的符號.在這種情況下,它表示一個字符串常量.

.text

這將開始一個新的部分. “text”部分是存儲可執行代碼的目標文件中的部分.

.globl main

“.global”指令告訴匯編器將其后面的標簽添加到生成的目標文件“導出”的標簽列表中.這基本上意味著“這是一個應該對鏈接器可見的符號”.例如,“C”中的“非靜態”函數可以由聲明(或包括)兼容函數原型的任何c文件調用.這就是為什么你可以#include stdio.h然后調用printf.編譯任何非靜態C函數時,編譯器會生成聲明指向函數開頭的全局標簽的程序集.將此與不應鏈接的內容(如字符串文字)進行對比.目標文件中的匯編代碼仍然需要一個標簽來引用文字數據.那些是“本地”符號.

.type main, @function

我不確定GAS(gnu匯編程序)如何處理“.type”指令.但是,這指示匯編程序標簽“main”是指可執行代碼,而不是數據.

main:

這定義了“main”函數的入口點.

.LFB0:

這是一個“本地標簽”,指的是函數的開頭.

.cfi_startproc

這是一個“調用幀信息”指令.它指示匯編程序發出矮調格式的調試信息.

pushl %ebp

這是匯編代碼中函數“序言”的標準部分.它保存了“ebp”寄存器的當前值. “ebp”或“base”寄存器用于在函數內存儲堆棧幀的“基礎”. “esp”(“堆棧指針”)寄存器可以在函數內調用函數時更改,而“ebp”保持固定.始終可以相對于“ebp”訪問函數的任何參數.通過ABI調用約定,在函數可以修改EBP寄存器之前,它必須保存它,以便在函數返回之前恢復原始值.

.cfi_def_cfa_offset 8

.cfi_offset 5, -8

我沒有詳細研究過這些,但我相信它們與DWARF調試信息有關.

movl %esp, %ebp

GAS使用AT& T語法,這是英特爾手冊使用的語法.這意味著“設置ebp等于esp”.這基本上為函數的其余部分建立了“基指針”.

.cfi_def_cfa_register 5

andl $-16, %esp

subl $32, %esp

這也是該功能的epilouge的一部分.這會對齊堆棧指針,然后從中減去足夠的空間來容納函數的所有本地.

movl $4, 28(%esp)

這將32位整數常量4加載到堆棧幀的插槽中.

movl $.LC0, %eax

這會將上面定義的“%d”字符串常量加載到eax中.

movl 28(%esp), %edx

這將堆棧中偏移量28中存儲的值“4”加載到edx.有可能你的代碼是在關閉優化的情況下編譯的.

movl %edx, 4(%esp)

然后,將值4移動到堆棧上,在調用printf時需要的位置.

movl %eax, (%esp)

這會將字符串“%d”加載到調用printf時所需的堆棧上的位置.

call printf

這稱為printf.

movl $0, %eax

這將eax設置為0.鑒于下一條指令是“leave”和“ret”,這相當于C代碼中的“return 0”. EAX寄存器用于保存函數的返回值.

leave

該指令清除呼叫幀.它將ESP設置回EBP,然后從修改后的堆棧指針中彈出EBP.像下一條指令一樣,這是函數結尾的一部分.

.cfi_restore 5

.cfi_def_cfa 4, 4

這是更多DWARF的東西

ret

這是實際的返回指令.它從功能中返回

.cfi_endproc

.LFE0:

.size main, .-main

.ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"

.section .note.GNU-stack,"",@progbits

總結

以上是生活随笔為你收集整理的汇编语言开头写C清零是为啥,这个汇编语言代码是什么意思?的全部內容,希望文章能夠幫你解決所遇到的問題。

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