關於EQU匯編指令
EQU是英文單詞equal的縮寫,因此我們也能對EQU指令有一個初步的認識:做等價替換使用。
在8051匯編語言中,EQU用於定義一個符號常量,其效果不會帶來存儲空間的占用(這和C語言中定義變量有區別)。它僅僅是將一個常量(立即數)用一個符號來表示,即實現常量符號化的效果。匯編編譯器在編譯時會將這個符號替換為對應的常量。所以,EQU的作用和C語言中的宏常量十分類似。
其格式一般如下:
IDATALEN EQU 80H COUNT EQU 25
在8051的啟動代碼中我們也可以發現許多EQU指令的使用
;----------下面代碼摘至STARTUP.A51-------------
; <o> IDATALEN: IDATA memory size <0x0-0x100> ; <i> Note: The absolute start-address of IDATA memory is always 0 ; <i> The IDATA space overlaps physically the DATA and BIT areas. IDATALEN EQU 80H ; ; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF> ; <i> The absolute start address of XDATA memory XDATASTART EQU 0 ; ; <o> XDATALEN: XDATA memory size <0x0-0xFFFF> ; <i> The length of XDATA memory in bytes. XDATALEN EQU 0 ; ; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF> ; <i> The absolute start address of PDATA memory PDATASTART EQU 0H ; ; <o> PDATALEN: PDATA memory size <0x0-0xFF> ; <i> The length of PDATA memory in bytes. PDATALEN EQU 0H
為什么需要它
那么問題來了:既然匯編編譯器又會把EQU符號替換回對應的常量,為什么不在代碼中直接使用常量而使用EQU定義的符號呢?
原因1:使得代碼易於閱讀和理解
代碼是寫給人看的。到目前人類文明為止,只有人才能寫代碼。所以好的代碼必須具備易讀的特點,如果代碼很難閱讀和理解,那么它就很難被更新,擴展,重用。
例如下面第一段代碼,將立即數24傳送到寄存器R0中,那么24指的是什么?24歲?24千克?24mA?沒有人知道。這種數在編程領域有個專業詞語叫做“魔數”,指那些只知其值,不知其意的字面值數。
第二段代碼使用了EQU指令,將24使用符號HOUR_PER_DAY等價表示,因此我們就知道,后面的MOV語句是將一天的小時數傳送到寄存器R0中保存。
;-----------第一段代碼-------------- MOV R0 , #24 ;-----------第二段代碼-------------- HOUR_PER_DAY EQU 24 MOV R0 , #HOUR_PER_DAY
原因2:方便后續對代碼進行修改
考慮到這樣一個情況,我們開發了一個稱重系統,我們在代碼的很多地方會用100代表稱重系統支持的最大量程100KG,后來產品更新升級,量程擴大到了150KG。如果在第一版代碼中我們直接使用100,那么我們就需要找到所有表示量程的100並將其改為150,這樣非常麻煩,而且容易改錯。如果我們使用EQU定義了一個表示量程的符號常量,那么只需要修改這個EQU定義即可。
;-----第一版代碼--------------- MAX_WEIGHT EQU 100 ;...業務邏輯代碼 ;...業務邏輯代碼 ;...業務邏輯代碼 ;-----第二版代碼--------------- MAX_WEIGHT EQU 150 ;...業務邏輯代碼 ;...業務邏輯代碼 ;...業務邏輯代碼