3/22(三)Symbol & Variables

        今天就來繼續記錄組語心得,現在終於找到另一個好用的 blog,本來想繼續用痞客幫,不過現在後台管理改超爛,所以現在來試試新東西。
        要講今天的主題前,先來複習一下在 C 語言中 #define 的用法,範例如下:

        /*
                    #define [symbol] [與指定之內容]
        ex:       #define     PI        3.14
        
        */

        而在編譯的時候(Compile),這種被 define 的部分,會先經過一個過程為 Symbol replacement / Macro extension,只要經過這個過程,就會將被 define 的部分,存入 Symbol table 中,而最後剩下的就僅有其內容,範例如下:

                    /*
                      include <stdio.h>
                      #define PI 3.14

                      int main(void)
                      {
                            float r = 1.0;//半徑
                            printf("%f\n", r*r*PI);
                            return 0;
                       }
                   */

                                         ↓ Symbol replacement / Macro extension
                                               
                               [Symbol Table]
                    Name | PI    |       |       |       |
                    Value | 3.14 |       |       |       |
                                         ↓
                                         ↓

                    /*
                      include <stdio.h>

                      int main(void)
                      {
                            float r = 1.0;//半徑
                            printf("%f\n", r*r*(3.14));
                            return 0;
                       }
                   */

        在此階段(compiling time),雖然還是停留在文字檔,但是已經將 define 後的變數,直接變成常數,但 float r = 1.0; 基本上是儲存在記憶體中,所以必須在 code generation 時,才會產生 1.0 的機械碼,並在 run time 中才執行。總結來說,在正式編譯成機械碼前,就可減少一個存放記憶體空間,如此一來即能減少資源消耗。而在 Assembly Language 中,也是以同樣的方式進行,只是其 define 的方式不同,範例如下:

                   (1)
                    /*

                      TITLE Symbol and Variable
                      INCLUDE Irvine32.inc
                      .data
                      COUNT = 500 
                      //使用 = 進行 define  => 僅能指定整數,但可進行運算
                      val DB 10h
                      //定義(宣告) val 為型態 double BTYE 的 10h
                      .code
                      main PROC
                          mov al, COUNT        ; al = 500
                          mov eax, val1            ; eax = 10000h
                          exit
                      main ENDP
                      END main

                   */

                                         ↓ Symbol replacement / Macro extension
                                               
                               [Symbol Table]
                    Name | COUNT    |       |       |       |
                    Value | 500           |       |       |       |
                                         ↓
                                         ↓

                    /*

                      TITLE Symbol and Variable
                      INCLUDE Irvine32.inc
                      .data
                      val DB 10h
                      //定義(宣告) val 為型態 double BTYE 的 10h
                      .code
                      main PROC
                          mov al, 500        ; al = 500
                          mov eax, val1            ; eax = 10000h
                          exit
                      main ENDP
                      END main

                   */

        就以上的範例來看,被我們 define 的部分,就在 Symbol replacement / Macro extension 被替代為數字;而若我們使用 = 來進行 define,只能用以整數宣告,但若用 EQU 這個指令,就可以 define 任何型態的資料,範例如下:

                   (1)
                    /*

                      TITLE Symbol and Variable
                      INCLUDE Irvine32.inc
                      .data
                      Matrix1  EQU 10*10
                      Matrix2  EQU <10*10> 
                      //加上 <>,Symbol replacement / Macro extension 時會保留 <> 中的內容
                      //使用 EQU 進行 define  => 可指定任何型態
                      val DB 10h
                      //定義(宣告) val 為型態 double BTYE 的 10h
                      .code
                      main PROC
                          mov al, Matrix1        ; al = 100
                          mov ah, Matrix2        ; alh = 10*10
                          mov eax, val1            ; eax = 10000h
                          exit
                      main ENDP
                      END main

                   */

                                         ↓ Symbol replacement / Macro extension
                                               
                               [Symbol Table]
                    Name | Matrix1    | Matrix2      |       |       |
                    Value | 100           |  10*10        |       |       |
                                         ↓
                                         ↓

                    /*

                      TITLE Symbol and Variable
                      INCLUDE Irvine32.inc
                      .data
                      val DB 10h
                      //定義(宣告) val 為型態 double BTYE 的 10h
                      .code
                      main PROC
                          mov al, 100               ; al = 100
                          mov ah, 10*10          ; alh = 10*10
                          mov eax, val1            ; eax = 10000h
                          exit
                      main ENDP
                      END main

                   */
        上述範例以整數為例,但是亦可用於 define 字元、字串及小數。


        以上。

留言

這個網誌中的熱門文章

4/9(一)Visual Studio Code - 偵錯配接器處理序已意外終止問題(Debug adapter process has terminated unexpectedly solution on Windows 10)

2019/09/24(二)【ITSA】[C_AR04-易] 邊緣偵測