最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c語(yǔ)言中if語(yǔ)句是怎么變成匯編代碼的詳解

 更新時(shí)間:2021年11月24日 09:19:05   作者:Just_4_fun  
if語(yǔ)句是指編程語(yǔ)言,包括c語(yǔ)言、C#、VB、java、匯編語(yǔ)言等,下面這篇文章主要給大家介紹了關(guān)于c語(yǔ)言中if語(yǔ)句是怎么變成匯編代碼的相關(guān)資料,需要的朋友可以參考下

?1. 要編譯的測(cè)試代碼:?

int a;
int b = 3;

int main(void)
{
    if (3)
        a = 4;
    else
        b = 5;
}

2. 詞法分析

  詞法分析將c源代碼解析成一個(gè)個(gè)的token。

  關(guān)鍵的,將if兩個(gè)字符解析成一個(gè)if token,后續(xù)語(yǔ)法分析的輸入就從兩個(gè)字符減少為1個(gè)token,減小了語(yǔ)法分析的難度。

3. 語(yǔ)法分析

if (equal(tok, "if")) {
    Node *node = new_node(ND_IF, tok);
    tok = skip(tok->next, "(");
    node->cond = expr(&tok, tok);
    tok = skip(tok, ")");
    node->then = stmt(&tok, tok);
    if (equal(tok, "else"))
      node->els = stmt(&tok, tok->next);
    *rest = tok;
    return node;
  }

如果當(dāng)前處理的token是if,則

3.1 創(chuàng)建新的類型為ND_IF的node。

3.2 跳過(guò)if后面的"("。

3.3 調(diào)用expr函數(shù)解析if語(yǔ)句()中的表達(dá)式,并將解析結(jié)果存儲(chǔ)在node->cond。

3.4 跳過(guò)“)”。

3.5 調(diào)用stmt處理then語(yǔ)句塊中的語(yǔ)句,這里是處理"a = 4;",將解析結(jié)果存儲(chǔ)在node->then。

3.6 如果if語(yǔ)句還有else部分,則調(diào)用stmt處理else語(yǔ)句塊中的語(yǔ)句,這里是處理"b = 5;",將解析結(jié)果存儲(chǔ)在node->els。

3.7 node->cond,node->then,node->els都為node節(jié)點(diǎn)。

4. 代碼生成

switch (node->kind) {
  case ND_IF: {
    int c = count();
    gen_expr(node->cond);
    cmp_zero(node->cond->ty);
    println("  je  .L.else.%d", c);
    gen_stmt(node->then);
    println("  jmp .L.end.%d", c);
    println(".L.else.%d:", c);
    if (node->els)
      gen_stmt(node->els);
    println(".L.end.%d:", c);
    return;
  }
...

如果當(dāng)前處理的node節(jié)點(diǎn)類型為ND_IF,則

4.1 gen_expr

這個(gè)函數(shù)處理if語(yǔ)句的條件部分,這里是處理3。判斷node節(jié)點(diǎn)為NUM,會(huì)生成匯編語(yǔ)句"mov? ? ?rax, 3",將3載入rax寄存器。

4.2 cmp_zero

cmp_zero會(huì)生成匯編語(yǔ)句"cmp? ? ?eax, 0",比較3和0。

4.3 println(" je .L.else.%d", c);

該語(yǔ)句會(huì)生成匯編代碼" je .L.else.1",當(dāng)上條比較語(yǔ)句中eax為0時(shí)會(huì)執(zhí)行跳轉(zhuǎn),跳轉(zhuǎn)到else分支運(yùn)行。這里由于eax為3,所以不跳轉(zhuǎn)。

4.4 gen_stmt(node->then);

這條語(yǔ)句會(huì)將then分支中的語(yǔ)句解析為匯編源碼,這里是"a = 4;",這條語(yǔ)句是表達(dá)式語(yǔ)句,所以會(huì)調(diào)用gen_expr函數(shù)。

4.4.1 gen_expr

"lea? ? ?rax, a",將a的地址載入rax寄存器中。

"push rax",將rax入棧。

"mov? ? ?rax, 4",將4載入rax寄存器中。

"pop? ? ?rdi",將變量a的地址載入rdi寄存器。

"mov? ? ?[rdi], eax",將4寫(xiě)入變量a。?

4.5 println(" jmp .L.end.%d", c);

執(zhí)行完then分支代碼后跳轉(zhuǎn)到下一條語(yǔ)句處執(zhí)行。

4.6 println(".L.else.%d:", c);

插入一條標(biāo)簽,表示else分支代碼的開(kāi)始,如果if語(yǔ)句條件為0會(huì)跳轉(zhuǎn)到這。

4.7 gen_stmt(node->els);

生成else分支代碼,處理"b = 5;"。

"lea? ? ?rax, b",將變量b的地址載入rax寄存器。

"push? ? rax",將rax寄存器入棧。

"mov? ? ?rax, 5",將5載入rax寄存器。

"pop? ? ?rdi",將b的地址載入rdi寄存器。

"mov? ? ?[rdi], eax",將5寫(xiě)入變量b中。

4.8 println(".L.end.%d:", c);

插入一條標(biāo)簽,表示if語(yǔ)句的結(jié)束,then分支語(yǔ)句執(zhí)行完成后跳轉(zhuǎn)到這里。

總結(jié)

到此這篇關(guān)于c語(yǔ)言中if語(yǔ)句是怎么變成匯編代碼的文章就介紹到這了,更多相關(guān)c語(yǔ)言if語(yǔ)句變成匯編代碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C/C++可變參數(shù)的使用

    C/C++可變參數(shù)的使用

    可變參數(shù)的使用方法遠(yuǎn)遠(yuǎn)不止以下幾種,不過(guò)在C,C++中使用可變參數(shù)時(shí)要小心,在使用printf()等函數(shù)時(shí)傳入的參數(shù)個(gè)數(shù)一定不能比前面的格式化字符串中的’%’符號(hào)個(gè)數(shù)少,否則會(huì)產(chǎn)生訪問(wèn)越界,運(yùn)氣不好的話還會(huì)導(dǎo)致程序崩潰
    2013-09-09
  • C++實(shí)現(xiàn)WebSocket服務(wù)器的案例分享

    C++實(shí)現(xiàn)WebSocket服務(wù)器的案例分享

    WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的通信協(xié)議,與HTTP協(xié)議不同,它允許服務(wù)器主動(dòng)向客戶端發(fā)送數(shù)據(jù),而不需要客戶端明確地請(qǐng)求,本文主要給大家介紹了C++實(shí)現(xiàn)WebSocket服務(wù)器的案例,需要的朋友可以參考下
    2024-05-05
  • pcre函數(shù)詳細(xì)解析

    pcre函數(shù)詳細(xì)解析

    PCRE提供了19個(gè)接口函數(shù),為了簡(jiǎn)單介紹,使用PCRE內(nèi)帶的測(cè)試程序(pcretest.c)示例用法
    2013-09-09
  • Qt QFrame的具體使用

    Qt QFrame的具體使用

    本文主要介紹了Qt QFrame的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • VS2022實(shí)現(xiàn)VC++打包生成安裝文件圖文詳細(xì)歷程

    VS2022實(shí)現(xiàn)VC++打包生成安裝文件圖文詳細(xì)歷程

    本文主要介紹了VS2022實(shí)現(xiàn)VC++打包生成安裝文件圖文詳細(xì)歷程,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C語(yǔ)言實(shí)現(xiàn)括號(hào)匹配的方法

    C語(yǔ)言實(shí)現(xiàn)括號(hào)匹配的方法

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)括號(hào)匹配的方法,文中代碼簡(jiǎn)單易懂,方便大家更好的學(xué)習(xí),感興趣的朋友可以參考下
    2020-06-06
  • C++使用鏈表實(shí)現(xiàn)圖書(shū)管理系統(tǒng)

    C++使用鏈表實(shí)現(xiàn)圖書(shū)管理系統(tǒng)

    這篇文章主要介紹了C++使用鏈表實(shí)現(xiàn)圖書(shū)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • c語(yǔ)言中十六進(jìn)制轉(zhuǎn)二進(jìn)制顯示的實(shí)現(xiàn)方法

    c語(yǔ)言中十六進(jìn)制轉(zhuǎn)二進(jìn)制顯示的實(shí)現(xiàn)方法

    本篇文章對(duì)c語(yǔ)言中十六進(jìn)制轉(zhuǎn)二進(jìn)制顯示的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Linux下控制(統(tǒng)計(jì))文件的生成的C代碼實(shí)現(xiàn)

    Linux下控制(統(tǒng)計(jì))文件的生成的C代碼實(shí)現(xiàn)

    這篇文章主要介紹了Linux下控制(統(tǒng)計(jì))文件的生成的C代碼實(shí)現(xiàn),感興趣的小伙伴們可以參考一下
    2016-01-01
  • C++ windows LOG4plus的使用小結(jié)

    C++ windows LOG4plus的使用小結(jié)

    這篇文章主要介紹了C++ windows LOG4plus的使用小結(jié),本文通過(guò)圖文示例代碼相結(jié)合給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-05-05

最新評(píng)論

高碑店市| 会同县| 大厂| 古交市| 忻州市| 翼城县| 临江市| 栾川县| 政和县| 禹城市| 乌兰察布市| 永宁县| 南投市| 崇州市| 宁波市| 康乐县| 工布江达县| 镇宁| 昭觉县| 汉川市| 丹阳市| 塔城市| 齐河县| 临夏县| 睢宁县| 綦江县| 玉田县| 蓝山县| 屏东市| 长兴县| 阳江市| 门头沟区| 安宁市| 海伦市| 中方县| 大关县| 甘孜| 青田县| 云安县| 江达县| 大名县|