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 字元、字串及小數。
以上。
留言
張貼留言