Data Storage Formats數據存儲格式
這一部說明可用的數據類型的存儲格式。Cx51提供了幾種數據存儲格式如下:
Data Type Bits Bytes Value Range
bit 1 — 0 to 1
signed char 8 1 -128 to +127
unsigned char 8 1 0 to 255
enum 8 / 16 1 or 2 -128 to +127 or -32768 to +32767
signed short 16 2 -32768 to +32767
unsigned short 16 2 0 to 65535
signed int 16 2 -32768 to +32767
unsigned int 16 2 0 to 65535
signed long 32 4 -2147483648 to 2147483647
unsigned long 32 4 0 to 4294967295
float 32 4 ±1.175494E-38 to ±3.402823E+38
data *, idata *, pdata * 8 1 0x00 to 0xFF
code*, xdata * 16 2 0x0000 to 0xFFFF
generic pointer 24 3 Memory type (1 byte); Offset (2 bytes) 0 to 0xFFFF
其他數據類型如結構體和聯合,可以包含上表中類型。所有的元素都按順序分配,并且按8051家簇的8bit字節對齊。
Bit Variables位變量
Bit類型的數量以使用單個位存放。位指針和位數組是不允許使用的。Bit對象總是放在8051CPU內部數據存儲器的位可尋址區。如果可能的話,BL51 連接器/定位器會覆蓋位對象
Signed and Unsigned Characters,
Pointers to data, idata, and pdata
Char類型的變量存入在一個字節內部。特定存儲區域的指針(指向data, idata, pdata)也存放在一個字節內部。如果枚舉類型可以用一個8bit的值代替,枚舉類型也放在一個字節內部。
Signed and Unsigned Integers,
Enumerations, Pointers to xdata and code
Int類型,short類型enum類型和特定存儲區域指針(指向xdata和code)使用2個字節(16bits)。高位字節放在前面,低位字節在后面。如:整型的0x1234在存儲器的存放方式為:
Address +0 +1
Contents 0x12 0x34
Signed and Unsigned Long Integers
Long類型占用4個字節。字節的存放也是從高位字節到低位字節。如0x12345678在存儲器的存放方式為:
Address +0 +1 +2 +3
Contents 0x12 0x34 0x56 0x78
Generic and Far Pointers
一般指針沒的明確聲明的類型,它可以指向8051的任一存儲區域。這些指針的存入使用3個字節。第一字節存放一個表明存儲器區域或存儲器類型的值。其他的兩個字節存放地址的偏移量,偏移量的高位在前,低位在后。格式如下:
Address +0 +1 +2
Contents Memory Type Offset; High-Order Byte Offset; Low-Order Byte
根據編譯器的版本,存儲器類型有以下值:
Memory Type idata / data / bdata xdata pdata code
C51 Compiler (8051 devices) 0x00 0x01 0xFE 0xFF
CX51 Compiler (Philips 80C51MX) 0x7F 0x00 0x00 0x80
Philips 80C51MX構架支持新的工作在通用指針上的CPU指令。通用指針等同于Cx51的通用指針
一般指針的格式與far針的格式相同。因此,任何其他類型的存儲器類型值都可以用作尋址far存儲器空間
以下是一般指針的存儲格式,地址為0x1234
Address +0 +1 +2
Contents 0x01 0x12 0x34
Floating-point Numbers
Float類型的存放使用4個字節。格式的存放符合IEEE-754標準
一個浮點數由兩部分組成:尾數和指數。尾數存放數據值的實際的小數點。指數存放尾數的權值。指數是一個8bit的0-255的值,相對于127存放。實際的值是存放的值減去127。值域的范圍為+128到-127。尾數是一個24bit的數,它的最高位總是1。因此不存儲。還有一符號位用以表明此浮點數是正數還是負數。
浮點數用以下方式存儲在8051存儲器中:
Address +0 +1 +2 +3
Contents SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM
S: 符號位,0代表正,1代表負
E: 指數,2的補碼,偏移量為127
M: 23位尾數,最高位總是為1,因此不存儲
使用上述格式,浮點數-12.5就應該存放為0xc1480000。在存儲器以下方式出現:
Address +0 +1 +2 +3
Contents 0xC1 0x48 0x00 0x00
從浮點數到它的十六進制表示相當容易。以下示例其過程:
浮點數的存放不是一個直接的格式。要轉換必須把浮點數據的幾部分分開,如:
Address +0 +1 +2 +3
Format SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM
Binary 11000001 01001000 00000000 00000000
Hex C1 48 00 00
從而可以分離以下信息:
符號位為1,說明是一個負數。指數10000010B或130DEC,減去127等于3,尾數的二進制表示為:10010000000000000000000
加上前面總是一個1,尾數為:
1.10010000000000000000000
現在,根據指數據調整尾數:左移3位,即:
1100.10000000000000000000
這就是這個浮點數:轉換為十進制數為1*2^+1*2^2+0*2^1+0*2^0+1*2^(-1)=12.5
Floating-point Errors
8051沒有獲取浮點錯誤的中斷向量。因此,用戶程序必須正確處理這些錯誤狀態。浮點數可能包含錯誤的二進制值。這個值被表示為IEEE標準的一部分,并且用來表示浮點處理出現錯誤。用戶代碼應該在每一個浮點運算過后檢查可能存在的算述運算錯誤。
名字 值 意義
NaN 0xFFFFFFF 不是一個數
+INF 0x7F80000 正向溢出
-INF 0xFF80000 負向溢出
注:在Cx51中可以使用_chkfloat_可以快速地檢查浮點數標志
可以使用以下聯合方式存儲浮點數:
union f {
float f; /* Floating-point value */
unsigned long ul; /* Unsigned long value */
};
這個聯合包括一個浮點數和一個無符號整形來進行浮點數學運算和響應IEEE錯誤狀態。例如:
#define NaN 0xFFFFFFFF /* Not a number (error) */
#define plusINF 0x7F800000 /* Positive overflow */
#define minusINF 0xFF800000 /* Negative overflow */
union f {
float f; /* Floating-point value */
unsigned long ul; /* Unsigned long value */
};
void main (void) {
float a, b;
union f x;
x.f = a * b;
if (x.ul == NaN || x.ul == plusINF || x.ul == minusINF) {
/* handle the error */
}
else {
/* result is correct */
}
}
Accessing Absolute Memory Locations
評論
查看更多