国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - c語言中if語句是怎么變成匯編代碼的詳解

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

2022-03-02 14:46Just_4_fun C/C++

if語句是指編程語言,包括c語言、C#、VB、java、匯編語言等,下面這篇文章主要給大家介紹了關于c語言中if語句是怎么變成匯編代碼的相關資料,需要的朋友可以參考下

 1. 要編譯的測試代碼: 

?
1
2
3
4
5
6
7
8
9
10
int a;
int b = 3;
 
int main(void)
{
    if (3)
        a = 4;
    else
        b = 5;
}

2. 詞法分析

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

  關鍵的,將if兩個字符解析成一個if token,后續語法分析的輸入就從兩個字符減少為1個token,減小了語法分析的難度。

3. 語法分析

?
1
2
3
4
5
6
7
8
9
10
11
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;
  }

如果當前處理的token是if,則

3.1 創建新的類型為ND_IF的node。

3.2 跳過if后面的"("。

3.3 調用expr函數解析if語句()中的表達式,并將解析結果存儲在node->cond。

3.4 跳過“)”。

3.5 調用stmt處理then語句塊中的語句,這里是處理"a = 4;",將解析結果存儲在node->then。

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

3.7 node->cond,node->then,node->els都為node節點。

4. 代碼生成

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;
  }
...

如果當前處理的node節點類型為ND_IF,則

4.1 gen_expr

這個函數處理if語句的條件部分,這里是處理3。判斷node節點為NUM,會生成匯編語句"mov     rax, 3",將3載入rax寄存器。

4.2 cmp_zero

cmp_zero會生成匯編語句"cmp     eax, 0",比較3和0。

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

該語句會生成匯編代碼" je .L.else.1",當上條比較語句中eax為0時會執行跳轉,跳轉到else分支運行。這里由于eax為3,所以不跳轉。

4.4 gen_stmt(node->then);

這條語句會將then分支中的語句解析為匯編源碼,這里是"a = 4;",這條語句是表達式語句,所以會調用gen_expr函數。

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寫入變量a。 

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

執行完then分支代碼后跳轉到下一條語句處執行。

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

插入一條標簽,表示else分支代碼的開始,如果if語句條件為0會跳轉到這。

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寫入變量b中。

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

插入一條標簽,表示if語句的結束,then分支語句執行完成后跳轉到這里。

總結

到此這篇關于c語言中if語句是怎么變成匯編代碼的文章就介紹到這了,更多相關c語言if語句變成匯編代碼內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/iszhang/p/15592778.html

延伸 · 閱讀

精彩推薦
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 免费日本视频 | 成人免费福利 | 日韩中文字幕一区二区 | 久久精品亚洲精品国产欧美kt∨ | 国产在线观看免费 | 亚洲国产成人av好男人在线观看 | 日韩精品毛片免费看 | 亚洲电影第二页 | 亚洲欧美高清 | 中文在线中文a | 久久久免费电影 | 国产精品美女久久久久aⅴ国产馆 | 亚洲欧美在线一区 | 午夜在线电影 | 久久国产精品一区二区三区 | 成人免费视频在线观看 | 午夜在线 | 久久人爽 | 亚洲天堂一区在线 | 久久久久久亚洲精品中文字幕 | 91麻豆产精品久久久久久 | 人人鲁人人莫一区二区三区 | 亚洲一区二区三区在线播放 | 午夜色播 | 成人久久18免费观看 | 97久久久| 欧美黄色片免费观看 | 综合二区 | 久久久久久亚洲精品 | 日韩精品小视频 | 国产精品国产成人国产三级 | 久久精品成人一区二区三区蜜臀 | 蜜桃av网址 | 亚洲激情中文字幕 | 亚洲在线视频 | 99视频在线免费观看 | 久久久久久久久久久国产 | 久久国产视屏 | 亚洲日韩中文字幕在线播放 | 欧美一区二区三区在线观看视频 | 91在线视频免费观看 |