91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

黃工的嵌入式技術(shù)圈 ? 來(lái)源:黃工的嵌入式技術(shù)圈 ? 作者:黃工的嵌入式技術(shù) ? 2020-02-25 15:52 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

大家都知道計(jì)算機(jī)只能處理和識(shí)別二進(jìn)制指令,而我們利用各種高級(jí)編程語(yǔ)言所編寫(xiě)的程序,要經(jīng)過(guò)一些列的處理步驟,最終轉(zhuǎn)變?yōu)?a target="_blank">匯編指令,再最后轉(zhuǎn)變?yōu)闄C(jī)器指令。

以上這些轉(zhuǎn)變是如何發(fā)生的就屬于大名鼎鼎的“編譯原理”所研究的范疇,作為計(jì)算機(jī)專(zhuān)業(yè)學(xué)生,它的重要性毫無(wú)質(zhì)疑,自然也是必修課。而我們幾年所要給大家講的是高級(jí)編程語(yǔ)言到匯編語(yǔ)言這一轉(zhuǎn)變的過(guò)程,后面就以C語(yǔ)言為例。

怎么樣,計(jì)科專(zhuān)業(yè)的學(xué)生或者學(xué)過(guò)編譯原理的看到上面幾本書(shū)熟悉嗎?這幾本書(shū)差不多是大多數(shù)高校編譯原理課程的教材了。言歸正傳,我們今天討論的是C如何轉(zhuǎn)換成匯編語(yǔ)言,在講之前先給大家簡(jiǎn)要介紹下匯編語(yǔ)言:

匯編語(yǔ)言(assembly language)是一種用于電子計(jì)算機(jī)、微處理器微控制器或其他可編程器件的低級(jí)語(yǔ)言,亦稱(chēng)為符號(hào)語(yǔ)言。在匯編語(yǔ)言中,用助記符(Mnemonics)代替機(jī)器指令的操作碼,用地址符號(hào)(Symbol)或標(biāo)號(hào)(Label)代替指令或操作數(shù)的地址。在不同的設(shè)備中,匯編語(yǔ)言對(duì)應(yīng)著不同的機(jī)器語(yǔ)言指令集,通過(guò)匯編過(guò)程轉(zhuǎn)換成機(jī)器指令。普遍地說(shuō),特定的匯編語(yǔ)言和特定的機(jī)器語(yǔ)言指令集是一一對(duì)應(yīng)的,不同平臺(tái)之間不可直接移植。

匯編語(yǔ)言的主要特點(diǎn)

(1)匯編語(yǔ)言是直接面向處理器(Processor)的程序設(shè)計(jì)語(yǔ)言。

(2)匯編語(yǔ)言的另一個(gè)特點(diǎn)就是它所操作的對(duì)象不是具體的數(shù)據(jù),而是寄存器或者存儲(chǔ)器,也就是說(shuō)它是直接和寄存器和存儲(chǔ)器打交道,這也是為什么匯編語(yǔ)言的執(zhí)行速度要比其它語(yǔ)言快,但同時(shí)這也使編程更加復(fù)雜,因?yàn)榧热粩?shù)據(jù)是存放在寄存器或存儲(chǔ)器中,那么必然就存在著尋址方式,也就是用什么方法找到所需要的數(shù)據(jù)。

(3)再者,匯編語(yǔ)言指令是機(jī)器指令的一種符號(hào)表示,而不同類(lèi)型的CPU 有不同的機(jī)器指令系統(tǒng),也就有不同的匯編語(yǔ)言,所以,匯編語(yǔ)言程序與機(jī)器有著密切的關(guān)系。

簡(jiǎn)單了解了匯編語(yǔ)言,那么根據(jù)編譯原理C語(yǔ)言是怎么轉(zhuǎn)換成匯編語(yǔ)言的呢?總共可分以下6個(gè)步驟:

1. 預(yù)處理 -> 2.詞法分析 -> 3.語(yǔ)法分析 -> 4.語(yǔ)義分析 -> 5.優(yōu)化 -> 6.鏈接

1. 預(yù)處理:負(fù)責(zé)執(zhí)行C語(yǔ)言中的#include, #if, #else 等預(yù)處理指令。注意,這里是去執(zhí)行這些預(yù)處理指令。這些預(yù)處理指令的作用是根據(jù)你的系統(tǒng)環(huán)境配湊出最終版的源代碼。

2. 詞法分析:把你定義的函數(shù)名、變量名、預(yù)留的關(guān)鍵字等抽象化,用一個(gè)符號(hào)來(lái)代替,方便編譯程序處理。例如上圖中的main, return, printf等單詞,都被看作一個(gè)符號(hào),轉(zhuǎn)換成M, R, P。在這個(gè)過(guò)程中,會(huì)檢查你的變量名、函數(shù)名名稱(chēng)是否正確。

3. 語(yǔ)法分析:經(jīng)過(guò)詞法分析處理之后,程序代碼已經(jīng)變成一堆符號(hào)了,例如 I S T F ... M I R P(放心,人已經(jīng)不認(rèn)識(shí)了,但是計(jì)算機(jī)能認(rèn)識(shí))。這時(shí)的符號(hào)是打散的,語(yǔ)法分析負(fù)責(zé)把這些符號(hào)按照一定的結(jié)構(gòu)組織起來(lái),形成一個(gè)抽象語(yǔ)法樹(shù)(這個(gè)結(jié)構(gòu)跟你寫(xiě)的程序代碼的結(jié)構(gòu)是對(duì)應(yīng)起來(lái)的)。

4. 語(yǔ)義分析:當(dāng)構(gòu)造出這樣一個(gè)樹(shù)的結(jié)構(gòu)之后,編譯就就會(huì)檢查語(yǔ)法是否正確,并且去掃描這棵樹(shù)。根據(jù)這棵樹(shù)的結(jié)構(gòu),生成中間指令了。這個(gè)中間指令已經(jīng)非常接近匯編。中間指令跟匯編還是有區(qū)別的,因?yàn)椴煌瑥S家的CPU指令有所不同,所以還要根據(jù)不同廠家的CPU指令集,把這個(gè)中間指令轉(zhuǎn)換成匯編。

5. 優(yōu)化:因?yàn)?a target="_blank">程序員有時(shí)代碼寫(xiě)的不太好,會(huì)導(dǎo)致一些多余的操作,或者效率低的指令。優(yōu)化過(guò)程可以找出這些毛病,自動(dòng)替換成更好的指令。

6. 鏈接:以上過(guò)程只編譯了一個(gè)模塊,一個(gè)大型程序往往包好多個(gè)模塊。最后的鏈接過(guò)程負(fù)責(zé)把所有模塊組裝起來(lái),構(gòu)造出最后可以執(zhí)行的程序。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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)投訴
  • 二進(jìn)制
    +關(guān)注

    關(guān)注

    2

    文章

    809

    瀏覽量

    43026
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    183

    文章

    7644

    瀏覽量

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

    關(guān)注

    1

    文章

    1672

    瀏覽量

    51592
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    C語(yǔ)言主要特點(diǎn)

    。 5.語(yǔ)法限制不太嚴(yán)格,程序設(shè)計(jì)自由度大。 6.C語(yǔ)言允許直接訪問(wèn)物理地址,能進(jìn)行位(bit)操作,能夠?qū)崿F(xiàn)匯編語(yǔ)言的大部分功能,可以直接對(duì)硬件進(jìn)行操作。因此C
    發(fā)表于 01-05 07:41

    請(qǐng)問(wèn)芯源CW32 MCU支持哪些匯編語(yǔ)言?

    芯源CW32 MCU支持哪些匯編語(yǔ)言?
    發(fā)表于 12-23 06:14

    C語(yǔ)言中可以嵌套匯編語(yǔ)言嗎?

    請(qǐng)問(wèn)C語(yǔ)言中可以嵌套匯編語(yǔ)言嗎?
    發(fā)表于 12-15 08:14

    C語(yǔ)言C++之間的區(qū)別是什么

    ,尤其是在涉及到類(lèi)型轉(zhuǎn)換時(shí),會(huì)盡量防止隱式的、可能導(dǎo)致問(wèn)題的類(lèi)型轉(zhuǎn)換。 相比之下,C語(yǔ)言允許更多的靈活性,但也更容易產(chǎn)生類(lèi)型相關(guān)的運(yùn)行時(shí)錯(cuò)誤,因?yàn)槠漕?lèi)型檢查不如
    發(fā)表于 12-11 06:23

    匯編語(yǔ)言還有必要學(xué)習(xí)嗎

    1、嵌入式操作系統(tǒng)需要匯編語(yǔ)言 2、實(shí)時(shí)性要求非常高的地方,需要匯編語(yǔ)言,比如FFT算法。 3、匯編語(yǔ)言做運(yùn)算那叫一個(gè)痛苦,下面是一段雙字節(jié)乘法,浮點(diǎn)數(shù)就更難搞
    的頭像 發(fā)表于 11-25 11:46 ?631次閱讀
    <b class='flag-5'>匯編語(yǔ)言</b>還有必要學(xué)習(xí)嗎

    C語(yǔ)言自動(dòng)類(lèi)型轉(zhuǎn)換

    是通過(guò)定義類(lèi)型轉(zhuǎn)換運(yùn)算來(lái)實(shí)現(xiàn)的。其一般形式為: (數(shù)據(jù)類(lèi)型) (表達(dá)式) 其作用是把表達(dá)式的運(yùn)算結(jié)果強(qiáng)制轉(zhuǎn)換成類(lèi)型說(shuō)明符所表示的類(lèi)型 在使用強(qiáng)制轉(zhuǎn)換時(shí)應(yīng)注意以下問(wèn)題: 數(shù)據(jù)類(lèi)型和表達(dá)式都必須加
    發(fā)表于 11-25 08:04

    C語(yǔ)言強(qiáng)制類(lèi)型轉(zhuǎn)換

    強(qiáng)制類(lèi)型轉(zhuǎn)換是通過(guò)定義類(lèi)型轉(zhuǎn)換運(yùn)算來(lái)實(shí)現(xiàn)的。其一般形式為: (數(shù)據(jù)類(lèi)型) (表達(dá)式) 其作用是把表達(dá)式的運(yùn)算結(jié)果強(qiáng)制轉(zhuǎn)換成類(lèi)型說(shuō)明符所表示的類(lèi)型 在使用強(qiáng)制轉(zhuǎn)換時(shí)應(yīng)注意以下問(wèn)題:
    發(fā)表于 11-24 06:32

    開(kāi)源鴻蒙技術(shù)大會(huì)2025丨編譯器與編程語(yǔ)言分論壇:語(yǔ)言驅(qū)動(dòng)系統(tǒng)創(chuàng)新,編譯賦能生態(tài)繁榮

    在萬(wàn)物智聯(lián)的時(shí)代背景下,操作系統(tǒng)底層能力的構(gòu)建離不開(kāi)編程語(yǔ)言編譯器的關(guān)鍵支撐。作為開(kāi)源鴻蒙生態(tài)的核心技術(shù),語(yǔ)言設(shè)計(jì)與編譯器、虛擬機(jī)實(shí)現(xiàn)的進(jìn)步直接關(guān)系到開(kāi)發(fā)效率、運(yùn)行性能與系統(tǒng)安全。本
    的頭像 發(fā)表于 11-20 17:24 ?917次閱讀
    開(kāi)源鴻蒙技術(shù)大會(huì)2025丨<b class='flag-5'>編譯</b>器與編程<b class='flag-5'>語(yǔ)言</b>分論壇:<b class='flag-5'>語(yǔ)言</b>驅(qū)動(dòng)系統(tǒng)創(chuàng)新,<b class='flag-5'>編譯</b>賦能生態(tài)繁榮

    匯編語(yǔ)言的起源

    一、匯編語(yǔ)言是什么? 我們知道,CPU 只負(fù)責(zé)計(jì)算,本身不具備智能。你輸入一條指令(instruction),它就運(yùn)行一次,然后停下來(lái),等待下一條指令。 這些指令都是二進(jìn)制的,稱(chēng)為操作碼
    發(fā)表于 11-20 07:19

    C語(yǔ)言和單片機(jī)C語(yǔ)言有什么差異

    匯編語(yǔ)言機(jī)器才能讀懂,所以每個(gè)平臺(tái)的編譯編譯成對(duì)應(yīng)平臺(tái)匯編的程序,每個(gè)平臺(tái)的匯編不一樣,當(dāng)然編譯
    發(fā)表于 11-14 07:55

    蜂鳥(niǎo)E203能夠仿真運(yùn)行C語(yǔ)言程序嗎?

    那兩本書(shū)里面都是說(shuō)怎么在FPGA上運(yùn)行C語(yǔ)言程序和Benchmark程序,它提供仿真器下如何編譯運(yùn)行C
    發(fā)表于 11-06 06:21

    通過(guò)內(nèi)聯(lián)匯編調(diào)用乘法指令mulh\\mulhsu\\mulhu

    高32位 mulhsurd, rs1,rs2 將rs1當(dāng)作有符號(hào)數(shù),rs2當(dāng)作無(wú)符號(hào)數(shù)相乘,取高32位 2.由于C語(yǔ)言中的乘法符號(hào),在經(jīng)過(guò)軟件編譯后生成的匯編指令位mul指令,
    發(fā)表于 10-24 06:52

    .elf 轉(zhuǎn)換成.img 后,如何知道SPI flash 中的變量地址呢?

    它的 .map 中找到內(nèi)存映射項(xiàng)目構(gòu)建完成后的文件,如下圖。 數(shù)據(jù).abcDscr 0x40030b00 0x100 ./usbabc.o 但是.elf 轉(zhuǎn)換成.img 后,如何知道SPI flash 中的變量地址呢?
    發(fā)表于 07-18 07:44

    匯編語(yǔ)言教學(xué)中文資料

    電子發(fā)燒友網(wǎng)站提供《匯編語(yǔ)言教學(xué)中文資料.rar》資料免費(fèi)下載
    發(fā)表于 06-30 15:15 ?7次下載

    Windows環(huán)境下32位匯編語(yǔ)言中文資料

    電子發(fā)燒友網(wǎng)站提供《Windows環(huán)境下32位匯編語(yǔ)言中文資料.rar》資料免費(fèi)下載
    發(fā)表于 06-30 15:14 ?0次下載