在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

匯編語(yǔ)言:一個(gè)函數(shù)的編譯器之旅

如意 ? 來(lái)源:編程技術(shù)宇宙微信公眾號(hào) ? 作者:軒轅之風(fēng)O ? 2020-09-04 11:48 ? 次閱讀

我是一個(gè)函數(shù)

我是一個(gè)函數(shù),名叫 str_upper,我可以把輸入的字符串從小寫變成大寫。不信你看,我長(zhǎng)這樣:

char* str_upper(char* str, int len) {charupper[256];if (len 》= 256 || len 《= 0) return nullptr;for (int i = 0; i 《 len; i++) {if (str[i] 》= ‘a(chǎn)’ && str[i] 《= ‘z’) {upper[i] = str[i] - 32;} else {upper[i] = str[i]; } }returnupper;}

上面是我的源代碼形式,聽我的好朋友 str_lower 說(shuō),一會(huì)兒我們就要一起被送到一個(gè)叫編譯器的地方加工處理了,我心里害怕極了。

編譯器之旅

沒(méi)多久,我們就來(lái)到了這里,一座很龐大到高樓,里面有好多精密的機(jī)器在不停的運(yùn)轉(zhuǎn)著。

一進(jìn)入大廳,好多函數(shù)代碼在這里排隊(duì)等待。

我抬頭向上望去,不知道有多少層樓,每一層都有一個(gè)指示牌,從下往上分別寫著:

預(yù)處理

詞法分析

語(yǔ)法分析

語(yǔ)義分析

···

再往上太遠(yuǎn)就看不太清楚了。

所有的函數(shù)代碼按照文件為單位排好隊(duì),靜靜地等待著。

不過(guò)沒(méi)有等太久,就輪到了我們這一隊(duì)。

來(lái)了一個(gè)工作人員把我們帶到了一個(gè)房間,讓我們都好好躺著,一臺(tái)機(jī)器快速的從頭到尾掃描了一遍,將我們所在文件中出現(xiàn)的 #include 和 #define 全部給替換掉了。

接著,通過(guò)房間里的電梯,將我們送上了二樓。

接下來(lái)的一段時(shí)間,我們?cè)诤脦讓訕嵌甲隽恕绑w檢”,每個(gè)函數(shù)都被那些像 CT 一樣的機(jī)器照了個(gè)遍。

不一會(huì)兒,來(lái)到了編譯層,這一層有一個(gè)特別奇怪的機(jī)器,我看到一個(gè)個(gè)函數(shù)被送了進(jìn)去,出來(lái)的時(shí)候都變了樣子。不僅如此,接待處的工作人員看起來(lái)很兇,我這下更加緊張了。

函數(shù)調(diào)用約定

工作人員拿到了我的資料,瞅了幾眼,問(wèn)到:“請(qǐng)問(wèn)你的調(diào)用約定是什么?”

我有些懵,不太懂他的意思,小聲問(wèn)到:“不好意思,你剛問(wèn)什么?”

工作人員有點(diǎn)不耐煩了,提高了音量,“我是問(wèn)你調(diào)用約定是什么?調(diào)用約定??!”

看見我仍然一臉茫然,工作人員直接給我的資料上調(diào)用約定那一欄蓋上了一個(gè)標(biāo)記:cdecl。

我有點(diǎn)摸不著頭腦,同行的小伙伴 str_lower 拽了我一下說(shuō)到:“他是在問(wèn)你函數(shù)的調(diào)用約定,就是約定調(diào)用函數(shù)的方式,涉及怎么傳遞參數(shù),誰(shuí)來(lái)恢復(fù)調(diào)用棧等”

他這一說(shuō)我才反映過(guò)來(lái),“這個(gè)調(diào)用約定都有哪些可選的呢?”

“一般有三種:”

cdcel,參數(shù)從右往左入棧,主調(diào)函數(shù)負(fù)責(zé)恢復(fù)棧平衡

stdcall,參數(shù)從右往左入棧,被調(diào)函數(shù)負(fù)責(zé)恢復(fù)棧平衡

fastcall,參數(shù)通過(guò)寄存器傳遞,寄存器不夠再用棧傳遞

“他剛才看你沒(méi)有顯式聲明,就默認(rèn)給你 cdecl 的方式了”,小伙伴繼續(xù)說(shuō)到。

我點(diǎn)了點(diǎn)頭,原來(lái)調(diào)用個(gè)函數(shù)還有這么多講究吶!

Stack Canary

“別閑聊了,快進(jìn)去吧!”,工作人員催我了。

我準(zhǔn)備走向那臺(tái)可怕的機(jī)器。

“唉,等一下”,正緊張著,工作人員又叫住了我。

我回頭看去,工作人員正招手讓我過(guò)去。

“你好,是我的代碼有什么問(wèn)題嗎?”,我緊張的問(wèn)到,生怕有錯(cuò)誤被打回去,連累我們整個(gè)文件都要被遣返。

“不是,是我注意到你的函數(shù)里有一個(gè)局部數(shù)組,需要給你加一下棧溢出保護(hù)”,工作人員說(shuō)到。

我看了下我的代碼,確實(shí)有一個(gè)局部字符數(shù)組:

charupper[256];

“棧溢出保護(hù)是什么???”,我小聲問(wèn)到。

工作人員沒(méi)有搭理我,忙著給我的資料上加?xùn)|西。

旁邊的小伙伴又把我拽了過(guò)去,說(shuō)到:“咱們函數(shù)里面定義的局部變量、參數(shù)是存放在線程棧里面的。線程要不斷游走在不同的函數(shù)中,調(diào)用函數(shù)后為了能回到原來(lái)的地方,調(diào)用之前把返回地址也放在了線程棧里。就像這樣,你看會(huì)不會(huì)有什么問(wèn)題:”

匯編語(yǔ)言:一個(gè)函數(shù)的編譯器之旅

我仔細(xì)看了下,“哦,要是越界訪問(wèn)我的 upper 數(shù)組,那就可以修改返回地址,那可就危險(xiǎn)了!”

“很聰明嘛!”

“那這個(gè)怎么加保護(hù)呢?”,我問(wèn)到。

“你看,函數(shù)進(jìn)來(lái)之前,先在局部變量和返回地址之間設(shè)置一個(gè)數(shù)值,函數(shù)返回之前再去檢查一下,如果棧里的數(shù)據(jù)被破壞了,檢查這個(gè)數(shù)值就能發(fā)現(xiàn),提前拋出異常!”,小伙伴耐心的解釋到。

“這樣啊,那豈不是要把我打回去加上你說(shuō)的這些設(shè)置和檢查代碼?”,我繼續(xù)提問(wèn)。

這時(shí),工作人員聽到了我們的閑聊,“不用,我們編譯器自動(dòng)添加好了,快去吧,已經(jīng)處理好了”

我瞥了一眼,看到我的資料上增加了一個(gè)叫 Stack Canary 的標(biāo)記。

我小心翼翼的走進(jìn)了那架奇怪的機(jī)器,立刻就失去了知覺(jué),等我醒來(lái)時(shí),我的身體已經(jīng)發(fā)生了變化,變成了一堆奇怪的代碼,現(xiàn)在我長(zhǎng)這樣了:

匯編語(yǔ)言:一個(gè)函數(shù)的編譯器之旅

鏈接

沒(méi)過(guò)一會(huì)兒,我們這一隊(duì)的所有函數(shù)代碼都編譯完成,大家從原來(lái)的.c文件都搬到了新家:一個(gè) .o 文件,我也再次見到了小伙伴 str_lower。

“咱們是不是已經(jīng)完成了編譯,可以離開這里了吧?”

“還不行,編譯雖然是完成了,還差鏈接這一步呢!”

又過(guò)了一小會(huì)兒,和我們一起過(guò)來(lái)的其他文件的函數(shù)代碼也編譯完成了,咱們一堆.o文件一起被送到了編譯器大廈的頂樓:鏈接層。

這一層也有一個(gè)巨大的機(jī)器,機(jī)器背后連接了一個(gè)管道,不知通向了哪里。

我們這一批的所有 .o 文件挨個(gè)走進(jìn)了這個(gè)巨大的機(jī)器,像是一條時(shí)空隧道一般,穿行于其間,我感覺(jué)到了巨大的壓力把我們擠壓在了一起,很快我們?cè)僖淮问チ艘庾R(shí)。

醒來(lái)之后,我發(fā)現(xiàn)所有的函數(shù)們都被合在了一個(gè)文件中,這是一個(gè)可執(zhí)行文件,而我的身體也再次發(fā)生了變化,變成了一段段的二進(jìn)制指令,現(xiàn)在我長(zhǎng)這樣了:

匯編語(yǔ)言:一個(gè)函數(shù)的編譯器之旅

終于離開了編譯器,真是一趟難忘的旅程,不過(guò)我再也不想來(lái)了·····彩蛋:命運(yùn)開了個(gè)玩笑,第一次運(yùn)行就出錯(cuò)!
責(zé)編AJX

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 匯編語(yǔ)言
    +關(guān)注

    關(guān)注

    14

    文章

    410

    瀏覽量

    35843
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4333

    瀏覽量

    62723
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1635

    瀏覽量

    49169
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    使用匯編語(yǔ)言的地方有哪些

    的每個(gè)區(qū)域之前,這些匯編指令如何集成到代碼庫(kù)中將根據(jù)所使用的開發(fā)環(huán)境而有所不同。通常有些自定義的編譯器函數(shù)用于使編譯器
    發(fā)表于 12-01 06:33

    匯編語(yǔ)言的學(xué)習(xí)資料分享

    寄存 個(gè)cpu有多個(gè)寄存 就是cpu中可以存儲(chǔ)數(shù)據(jù)的器件,個(gè)cpu中有多個(gè)寄存
    發(fā)表于 12-06 07:16

    ARM匯編語(yǔ)言入門

    語(yǔ)言,只比處理的母語(yǔ)機(jī)器代碼高出步。 用匯編語(yǔ)言編寫整個(gè)程序,即使是相對(duì)簡(jiǎn)單的程序,也很復(fù)雜。這就是為什么大多數(shù)人使用C或C++等高級(jí)語(yǔ)言
    發(fā)表于 08-08 07:28

    匯編語(yǔ)言程序設(shè)計(jì)pdf

    匯編語(yǔ)言程序設(shè)計(jì)的內(nèi)容:每種高級(jí)語(yǔ)言程序在連接為可執(zhí)行程序之前,都必須被編譯匯編語(yǔ)言程序,因此對(duì)于高級(jí)語(yǔ)言程序設(shè)計(jì)者來(lái)說(shuō),了解
    發(fā)表于 10-21 17:38 ?0次下載
    <b class='flag-5'>匯編語(yǔ)言</b>程序設(shè)計(jì)pdf

    匯編語(yǔ)言集成編譯器(軟件) 1.0版

    匯編語(yǔ)言集成編譯器(軟件) 1.0版
    發(fā)表于 03-25 08:57 ?0次下載

    MasmEdit匯編語(yǔ)言編譯器

    MasmEdit匯編語(yǔ)言編譯器.rar
    發(fā)表于 02-24 14:15 ?54次下載

    ARM匯編編譯器的使用

    10.4 ARM匯編編譯器的使用 armasm是ARM匯編語(yǔ)言的交叉編譯器,本節(jié)將詳細(xì)介紹它的使用方法。 armasm命令行語(yǔ)法格式如下。 armasm options inputfi
    發(fā)表于 10-19 10:14 ?5次下載

    編譯器知識(shí)拾零

    機(jī)器代碼(Machine code)。 個(gè)現(xiàn)代編譯器的主要工作流程如下: 源程序(source code)預(yù)處理(preprocessor)編
    發(fā)表于 11-07 15:44 ?0次下載

    TMS320C54x匯編語(yǔ)言工具C/C++編譯器的功能優(yōu)化詳細(xì)概述

    該系列是套軟件開發(fā)工具的支持,其中包括個(gè)優(yōu)化的C/C++編譯器、匯編器、鏈接,以及組合工具
    發(fā)表于 04-27 09:43 ?10次下載
    TMS320C54x<b class='flag-5'>匯編語(yǔ)言</b>工具C/C++<b class='flag-5'>編譯器</b>的功能優(yōu)化詳細(xì)概述

    既然C編譯器是C語(yǔ)言寫,那么第一個(gè)C編譯器是怎樣來(lái)的?

    既然C編譯器是C語(yǔ)言寫的,那第一個(gè)C編譯器是怎樣來(lái)的?
    的頭像 發(fā)表于 02-25 15:47 ?3209次閱讀

    編譯原理的角度看C語(yǔ)言如何轉(zhuǎn)換成匯編語(yǔ)言的?

    編譯原理的角度看C語(yǔ)言是如何轉(zhuǎn)換成匯編語(yǔ)言的?
    的頭像 發(fā)表于 02-25 15:52 ?2677次閱讀
    從<b class='flag-5'>編譯</b>原理的角度看C<b class='flag-5'>語(yǔ)言</b>如何轉(zhuǎn)換成<b class='flag-5'>匯編語(yǔ)言</b>的?

    C語(yǔ)言代碼中調(diào)用匯編函數(shù)需要注意什么

    起來(lái)看下混合語(yǔ)言工程中,就比如在匯編程序中調(diào)用C函數(shù),或者在C語(yǔ)言代碼中調(diào)用匯編函數(shù)需要注意什么
    的頭像 發(fā)表于 11-12 11:04 ?2846次閱讀

    單片機(jī)開發(fā):為何要避免使用匯編語(yǔ)言

    的每個(gè)區(qū)域之前,這些匯編指令如何集成到代碼庫(kù)中將根據(jù)所使用的開發(fā)環(huán)境而有所不同。通常有些自定義的編譯器函數(shù)用于使編譯器
    發(fā)表于 11-22 20:36 ?10次下載
    單片機(jī)開發(fā):為何要避免使用<b class='flag-5'>匯編語(yǔ)言</b>?

    匯編語(yǔ)言學(xué)習(xí)

    寄存 個(gè)cpu有多個(gè)寄存 就是cpu中可以存儲(chǔ)數(shù)據(jù)的器件,個(gè)cpu中有多個(gè)寄
    發(fā)表于 11-23 18:06 ?14次下載
    <b class='flag-5'>匯編語(yǔ)言</b>學(xué)習(xí)

    匯編語(yǔ)言的變量與編碼是什么

    匯編語(yǔ)言采用了助記符號(hào)編寫程序,通過(guò)編譯器轉(zhuǎn)換成能夠被計(jì)算機(jī)識(shí)別和處理的二進(jìn)制代碼程序。
    的頭像 發(fā)表于 02-17 14:58 ?1774次閱讀
    <b class='flag-5'>匯編語(yǔ)言</b>的變量與編碼是什么
    主站蜘蛛池模板: 美女视频永久黄网站免费观看国产| 亚洲人的天堂男人爽爽爽| 国产性夜夜春夜夜爽| 久久天天躁夜夜躁狠狠85台湾| 美女网战色| 国产精品久久久久久久午夜片 | 网www天堂资源在线| 天堂bt种子资源地址在线| 四虎4hu| 欧美伦理一区二区三区| 精品卡1卡2卡三卡免费视频 | 香港三级理论在线影院| 色男人社区| 久久精品女人天堂| 222.www免费观看| 日本美女黄网站| 202z国产高清日本在线播放| 国产性猛交xx乱| 乱高h辣黄文np公交车| 午夜色综合| 欧美成人免费全部观看天天性色| 国产美女视频免费| 天天干夜夜笙歌| a看片| 国产精品自线在线播放| 色综合一区| 国产亚洲人成a在线v网站| 天天做天天爱夜夜大爽完整| 成人手机看片| 嘿嘿嘿视频在线观看| 手机毛片| 国产精品igao在线观看樱花日本| 天堂网www在线资源网| 日本69xxxxxxx69| 一久久| 六月婷婷啪啪| 五月天亚洲综合| 六月丁香啪啪六月激情| 亚洲在成人网在线看| 免费毛片网站| 五月花亚洲|