EQU是英文單詞equal的縮寫,所以咱們也能對EQU指令有一個初步的認識:作等價替換使用。編程
在8051彙編語言中,EQU用於定義一個符號常量,其效果不會帶來存儲空間的佔用(這和C語言中定義變量有區別)。它僅僅是將一個常量(當即數)用一個符號來表示,即實現常量符號化的效果。彙編編譯器在編譯時會將這個符號替換爲對應的常量。因此,EQU的做用和C語言中的宏常量十分相似。spa
其格式通常以下:code
IDATALEN EQU 80H COUNT EQU 25
在8051的啓動代碼中咱們也能夠發現許多EQU指令的使用blog
;----------下面代碼摘至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中保存。class
;-----------第一段代碼-------------- 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 ;...業務邏輯代碼 ;...業務邏輯代碼 ;...業務邏輯代碼