匯編語言中的數據類型


一、數制及相互轉換

8086/8088 宏匯編語言源程序中允許使用二進制數、八進制數、十進制數和十六進制數。在書寫不同數制的數時,常在一個數的尾部用一個字母來表示該數的數制。二進制數用字母 B(Binary),八進制數用字母 O(Octal),十進制數用字母 D(Decimal),十六進制數用字母 H(Hexadecimal)。其中,十進制數尾部字母 D 可缺省。匯編程序在對源程序進行匯編時,能自動將不同數制的數轉換成二進制數。

不同進制數之間的對應關系如表 1 所示。

不同進制數之間的對應關系

表 1 不同進制數之間的對應關系

在編寫或閱讀程序時,常需要將一種進制數轉換為另一種進制數。熟練掌握不同進制數之間的轉換,是進行匯編語言程序設計的基礎。

1. N 進制數轉換為十進制數

轉換方法:按權相加。

【例2.1】求 10011.101B 的十進制值。

10011.101B=1×24+1×21+1×20+1×2–1+1×2–3=16+2+1+0.5+0.125=19.625D

八進制、十六進制與十進制之間的轉換,除基數不同外,方法一樣。

2. 十進制數轉換為 N 進制數

轉換方法:整數部分,除基(N)取余;小數部分,乘基(N)取整。

【例2.2】求十進制數325.8125的二進制表示。

整數部分:

image

得:325D=101000101B

小數部分:

image

得:0.8125D=0.1101B

於是:325.8125D=101000101.1101B

3. 二進制數轉換為八進制數或十六進制數

轉換方法:由於八進制數、十六進制數和二進制數的基數成倍數關系,轉換較為簡單,方法是將二進制數從小數點開始分別向左向右每 3 位分成一組(轉換成八進制數時)或每 4 位分成一組(轉換成十六進制時),不足 3 位(或 4 位)的補 0,然后寫出對應的八進制數或十六進制數即可。

【例2.3】 將 10110.11B 轉換成十六進制數

image

4. 八進制數或十六進制數轉換為二進制數

轉換方法:將每位八進制數寫成對應的3位二進制數,每位十六進制數寫成對應的4位二進制數即可。

二、計算機中數和字符的表示

(一)計算機中數的表示方法

計算機處理的數據通常是帶符號數,即有正數和負數的區別,如 +1101,+0.1101,-1101,-0.1101。在計算機中,正數與負數如何表示呢?為便於計算機識別與處理,通常用數的最高位來表示數的符號,0 表示正數,1 表示負數。日常用“+”或“-”表示符號的數叫真值,而在二進制數的最高位設置符號位,把符號加以數值化,這樣的數叫機器數。例如:

image

帶符號數的機器數可以用原碼、反碼、補碼3種不同碼制來表示,由於補碼表示法在加減運算中的優點,現在多數計算機都是采用補碼表示法。微機系列機也是采用補碼表示法。為此下面將對原碼和補碼分別進行介紹。

1. 原碼表示法

原碼是一種比較直觀的機器數表示法。用二進制數的最高位表示符號(0 表示正數,1 表示負數),數的有效值用二進制絕對值表示(與真值相同)。例如,原碼表示的整數 01101010 和 11101010,分別對應的真值是 +1101010 和 -1101010。

在原碼表示法中,8 位帶符號二進制數能表示的最大數和最小數是 01111111 和 11111111,即 -127 和 +127。數 0 有兩種形式:00000000 和 10000000,它們分別對應於 +0 和 -0。

原碼表示法的機器數作加減法運算時不太方便。例如,要進行 (-5)+7 的運算,看起來是作加法,但是兩異號數相加實際是進行減法,即作 7-5 的運算。同理,兩異號數相減時,實際是進行加法計算。所以對原碼表示法的機器數進行加減運算時,不僅需要程序中指令規定的操作種類(加或減),還要根據兩數的符號確定實際的加減操作。加減操作后,要按照一定的規則確定運算結果的符號,例如兩異號數相加,運算結果的符號應與絕對值較大的數同號,兩異號數相減,運算結果的符號應與被減數同號。

2. 補碼表示法

由於原碼加減運算時不太方便,因此設想讓符號位也作為數的一部分參與運算,使其運算操作簡化,無須做過多的判斷和處理。補碼表示法就具有這一特點。

(1)補碼的定義。

帶符號數 x 的補碼表示法 [x] 可定義如下:

[x]=M+x

上述定義中,模數 M 根據機器數的位數而定,如 n=8,M=28。這個 28 正好是機器數(無符號數)產生進位而自動舍去的數。

若X是正數(即 X≥0),按照上述定義,模數 M 和一個正數相加,作為溢出量便自動舍去。因此,正數的補碼正好同原碼相同。例如,真值 X=+00111011B(即 +59D),其補碼表示:

[+59]=28+00111011=100000000+00111011=|1|00111011

其中第 1 位自動舍去。

若 X 為負數(即 X<0),例如真值 X=-00111011B(即 -59D),其補碼表示:

[-59]=28+(-00111011)=100000000-00111011=11000101

從上述兩個例子可以看出:用補碼表示的機器數,符號位仍然表示數的符號(0 為正數,1 為負數);對於正數,補碼和原碼一樣,與真值的有效數等同;但對於負數,補碼經過變換后,已是另一編碼形式,它與真值的有效數已不能等同視之。

(2)補碼表示法中數的范圍。

在補碼表示法中,當 N=8 時,最大的正數仍是 [127] = 01111111,而數 0 只有一個,即 [0]=00000000,沒有 +0 與 -0 的區別。[-127]=10000001,而10000000 卻是 [-128],11111111 是 [-1]。所以當 n=8 時,用補碼表示數的范圍是 -128~+127,如表 2 所示。不難推導出,當 n=16 時,用補碼表示數的范圍是 -32768~+32767。

補碼表示的數(n=8)

表 2 補碼表示的數(n=8)

(3)由原碼變換為補碼。

由於正數的原碼和補碼的機器數一樣,所以這里主要是討論負數的變換。把一個負數的原碼變換為補碼的方法是:首先保持符號位不變(因為符號位已表示為負數),然后將有效數各位變反,最低位加1即可。例如:

image

所以,

[-59]=11000101

再看一個例子:

設 X = -25 = -19H = -0011001B

則 X 的 8 位補碼表示為:[X]=11100111B = E7H

X 的 16 位補碼表示為:[X]=1111111111100111B = FFE7H

從這個例子可以看出 X 的 16 位補碼實際上是其 8 位補碼的符號擴展。由此得出一個重要結論:一個二進制補碼數的符號位(最高位)向左擴展若干位后,仍是該數的補碼。

(二)二進制編碼

1. 十進制數的二進制編碼(BCD 碼)

086/8088 指令支持十進制數的運算,那么十進制數在機器內部也必須用二進制表示,即用十進制數的二進制編碼表示。常用的是 BCD 碼。BCD 碼與十進制數的對應關系如表 3 所示。

BCD 碼與十進制數的對應關系

表 3 BCD 碼與十進制數的對應關系

例如,十進制數 368 寫成 BCD 碼為:

0011 0110 1000

2. 字符編碼

在計算機中,數碼、英文字母、標點符號及其他符號統稱為字符。字符在計算機中也都是用二進制表示的。現在計算機中通常采用的字符編碼是 ASCII 碼(American Standard Code for Information Interchange)。標准的 ASCII 碼在一個字節中用七位二進制表示字符編碼,用一位(最高位)表示奇偶校驗位(Parity bit),如圖 1 所示。

ASCII 字符編碼

圖 1 ASCII 字符編碼

標准 ASCII 碼共有 128 個字符,可分為二類:非打印 ASCII 碼和可打印 ASCII 碼。

(1)非打印 ASCII 碼:這類編碼屬於控制性代碼,共 33 個。例如:BEL(響鈴,07H),DEL(刪除,7EH),CR(回車,0DH),LF(換行,0AH)等。

(2)可打印 ASCII 碼:共有 95 個。例如:數字 0~9 的編碼為 30H~39H;大寫字母 A~Z 的編碼為 41H~5AH;小寫字母 a~z 的編碼為 61H~7AH;空格(space)的編碼為 20H。

三、數據類型

1. 無符號二進制數

字節數據:取值范圍為 0~255。

字數據:取值范圍為 0~65535。

雙字數據:取值范圍為 0~4294967295。

2. 有符號二進制數(補碼)

字節數據:一位符號,7 位量值,范圍為 -128~+127。

字數據:一位符號,15 位量值,范圍為 -32768~+32767。

雙字數據:一位符號,31 位量值,范圍為 -2147483648~+2147483647。

3. 無符號十進制數(BCD)

十進制數(即 BCD 碼)有壓縮(組合)和非壓縮(非組合)兩種,如圖 2 所示。

無符號十進制數

圖 2 無符號十進制數

BCD 的特點是用 4 位二進制數表示 1 位十進制數,每 4 位二進制數之間的進位是十進制數的形式。

4. 浮點數

不同的匯編程序對浮點數約定可能有些不同,但其基本結構是類似的,它們都是由階碼和尾數兩個部分組成。

例如,8086/8088 宏匯編程序以用DD偽指令定義的浮點數(單精度實數)約定如圖 3 所示。

浮點數表示

圖 3 浮點數表示

在存儲浮點數時,階碼在高地址一端,尾數以二進制原碼形式存放,占三個字節,它的最高位總是有效數字,因此,它被隱藏起來,取而代之的是尾數的符號。浮點數在運算時要把最高位的有效數字恢復才能進行運算。

階碼表示 2 的指數值。它決定了小數點在有效數字(尾數)中的位置。階碼占一個字節,采用過余碼形式,即用 80H 表示階碼為 0,大於 80H 表示正階碼,小於 80H 表示負階碼。例如,階碼為 3 時用 83H 表示,階碼為 -3 時用 7DH 表示。

四個字節浮點數的范圍是:

正數:2127×(1-2-24)~2-127×2-1

負數:2127×(-(1-2-24))~2-128×(-2)-1

零:階碼和尾數同時為 0。

5. 字符串

字符串是一種順序鄰接的數據單位。由於計算機處理的信息涉及各種字符,這些字符都必須用二進制形式來表示,因此,字符也是數據。在 Intel 處理器中,字符用 ASCII 碼表示,每個字符占一個字節,字符數據的使用給人和計算機交互帶來了很大方便。

例如,當從鍵盤上輸入字串 123ABC 時,它們立即被轉換成與之對應的 ASCII 碼 31H,32H,33H,41H,42H,43H。又如,當用戶需要在顯示器上顯示或在打印機上打印程序運行結果 4270 時,只要將它逐一轉換成對應的 ASCII 碼存放在內存中,然后送給顯示器(或打印機)即可。在高級語言中,這一轉換工作往往由系統完成,而不需要用戶處理。但在匯編語言中,這一工作只能由用戶編程來完成。為了區別數值數據,程序中的字符都要以單引號或雙引號括起來。

原文:匯編語言中的數據類型

(完)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM