官术网_书友最值得收藏!

第1章 基礎知識

本章提供了學習匯編語言程序設計所需的一些基礎知識。首先對匯編語言程序設計進行了概述,其次對計算機常用的幾種數制及其相互間的轉換方法進行了講解,并且介紹了數值數據和非數值數據在計算機中的表示方法。

1.1 匯編語言與匯編語言程序設計

1.1.1 匯編語言

計算機程序設計語言是人機交流的重要工具,可分為機器語言、匯編語言和高級語言。

機器語言是機器指令的集合,是一種面向機器的程序設計語言。機器指令是由0和1構成的二進制代碼,不同種類的計算機具有各自的機器語言。其優點是可為計算機直接接受,用其編寫的機器語言程序執行速度快,占內存空間小,可充分利用計算機的硬件特性;缺點是指令難記,用其編寫的機器語言程序難以閱讀且通用性差。

高級語言是面向問題求解過程或面向對象的程序設計語言。典型的高級語言有Pascal,FORTRAN,C++,Java等。高級語言接近于人類的自然語言,而且通用于各種計算機。其優點是易學易記,用其編寫的高級語言程序易讀易改,通用性強;其缺點是高級語言程序需經過編譯或解釋方能被計算機接受,執行速度慢,占內存空間大,不能直接利用計算機的硬件特性。

匯編語言又稱為符號語言,實際上是一種符號化的機器語言。它將機器指令的操作碼、操作數由二進制代碼改為人們所熟悉的符號,例如

     ADD AL,5

表示將數字5加到AL中。匯編語言程序需經過匯編才能為計算機接受,這一點不如機器語言方便。雖然所用符號為人們所熟悉,然而不如高級語言那樣接近人類的自然語言,程序編寫和交流較為困難。除此以外,匯編語言幾乎具備了機器語言的所有優點,一定程度上彌補了機器語言的缺陷,而且不存在高級語言的上述缺點。可以認為,匯編語言是目前使用的唯一直接利用計算機硬件特性的程序設計語言。

1.1.2 匯編語言程序設計

匯編語言程序設計是指使用匯編語言設計程序的過程。為什么要學習匯編語言程序設計?其原因至少有以下幾點。

(1)通過匯編語言程序設計,人們可以高效地使用計算機解決現實問題。在解決同一現實問題時,匯編語言程序與高級語言程序相比,占用內存更小,執行速度更快。

(2)通過匯編語言程序設計,人們可以直接利用計算機的硬件特性,準確計算解決某一問題所需的時間,從而可實現實時控制。這一點是高級語言程序難以替代的。

(3)進行匯編語言程序設計,必然要從原理上認識、理解計算機的工作過程。因此,學習匯編語言程序設計不僅可以掌握一種高效的程序設計方法,而且對于學習計算機組成原理、計算機原理也大有幫助。

1.2 進位計數制

進位計數制是計數的一種方法。人們普遍習慣的進位計數制為十進制。十進制數的基為10,有10個數碼:0、1、2、3、4、5、6、7、8及9,遵循逢十進一的規則。二進制數的基為2,有2個數碼:0、1,遵循逢二進一的規則。以此類推,N進制數的基為N,有N個數碼:0、1、2、…、N-1,遵循逢N進一的規則。常用的幾種進位計數制的情況如表1.1所示。

表1.1 常用的進位計數制

1.2.1 常用計數制及其數的算術運算

1. 十進制(Decimal)

首先觀察以下十進制數的組成:

361.905D=3×102+6×101+1×100+9×10-1+0×10-2+5×10-3

不難看出每一個數碼根據它在這個數中所處的位置(數位)來決定實際數值。事實上,任意一個正的十進制數S=Kn-1Kn-2K0K-1K-2K-m+1K-m都可以表示成以下形式:

S=Kn-1×10n-1+Kn-2×10n-2+…+K1×101+K0×100+K-1×10-1+…+K-m+1×10-m+1+K-m×10-m

其中Ki可以是0至9這十個數碼中的任意一個,mn均為自然數,10i稱為權。一般而言,一個正的N進制數S=Kn-1Kn-2K0K-1K-2K-m+1K-m可以表示為以下通用形式:

其中Ki可以是0至N-1中任意一個數字,mn均為自然數,Ni為各數位相應的權。

2.二進制(Binary)

在日常生活中,存在著大量的兩種對立的現象,例如:是和非,開和關,通和斷。電子元件、物理器件中兩種狀態易于實現,如電壓、電流的有和無,晶體管的導通和截止,這兩種狀態是非常穩定的,而找到8種、10種或16種穩定的狀態則要復雜得多,所以計算機中采用二進制作為進位數制,以便于存儲及計算的物理實現。

二進制數與人們常用的十進制數的對照關系如表1.2所示。

表1.2 常用進位計數制對照表

一個二進制數也可以用上述通用形式來表示。例如:

11101.011B=1×24+1×23+1×22+0×21+1×20+0×2-1+1×2-2+1×2-3

二進制數的算術運算與十進制數的算術運算類似,區別僅在于該運算遵循逢二進一的規則。

【例1.1】(1)1101B+1011B=11000B

(2)1101B-1011B=0010B

(3)1101B×1011B=10001111B

(4)1111B÷101B=11B

3. 十六進制(Hexadecimal)

十六進制數采用0~9,A~F十六個數碼,這里A表示10D,B表示11D,C表示12D,D表示13D,E表示14D,F表示15D。

十六進制數與人們常用的十進制數的對照關系如表1.2所示。

一個十六進制數也可以用上述通用形式來表示。例如

6B.0CH =6×161+B×160+0×16-1+C×16-2

十六進制數的算術運算與十進制數的算術運算類似,區別僅在于該運算遵循逢十六進一的規則。

【例1.2】(1)8A04H+110CH=9B10H

(2)8A04H-110CH=78F8H

在匯編語言程序中,數據通常采用十六進制形式,匯編語言的調試、列表文件中顯示的數據也都是使用十六進制形式,所以有必要熟練掌握這種數制及其數的運算。

4.八進制(Octal)

八進制數采用0~7八個數碼,與十進制數的前八個數碼一一對應,如表1.2所示。

一個八進制數也可以用上述通用形式來表示。例如

36.53Q=3×81+6×80+5×8-1+3×8-2

1.2.2 數制轉換

1. 非十進制數→十進制數

非十進制數轉換為十進制數的方法是:將非十進制數用上述通用形式表示,即按權展開,計算的結果即為十進制數。不管非十進制數是否帶有小數部分,均可用這種方法轉換。

【例1.3】1010110B=1×26+0×25+1×24+0×23+1×22+1×21+0×20=86D

4D.8H=4×161+13×160+8×16-1=77.5D

1362Q=1×83+3×82+6×81+2×80=754D

2. 十進制數→非十進制數

十進制數轉換為二進制、八進制及十六進制等非十進制數的工作可分為整數的轉換和小數的轉換兩種情況。一個十進制數與其對應的非十進制數相比,兩者的整數部分和小數部分分別相等。于是,將一個十進制數轉換為非十進制數時,可以對其整數部分和小數部分分別作轉換,將兩個轉換結果結合起來就可以得到對應的非十進制數。

(1)十進制整數→非十進制整數

十進制整數轉換為二進制、八進制及十六進制等非十進制整數可以采用除基取余法或減權記位法。前一方法較易掌握,但使用時較煩瑣;后一方法使用時較方便,但需要熟悉非十進制各數位對應的權值。

① 除基取余法。將十進制整數及此間產生的商不斷除以非十進制數的基,直至商為0為止,并記下每一次相除所得到的余數,按照從后往前的次序,將各余數作為Kn-1Kn-2K0,從而構成對應的非十進制數。

【例1.4】將233D轉換為十六進制數。

按照題目要求,基應取16,具體轉換過程如下:

轉換結果為:233D=E9H。

【例1.5】將233D轉換為二進制數。

按照題目要求,基應取2,具體轉換過程如下:

轉換結果為:233D=11101001B。

② 減權記位法。減權記位法常用于十進制數到二進制數的轉換,對于十進制數到其他進制數的轉換使用這種方法則不夠方便。這里僅介紹十進制數到二進制數轉換時,減權記位法的具體內容。

將十進制整數與其最相近的權值2n-1做比較,前者不小于后者則減去2n-1,并在n-1位記1;否則在n-1位記0。然后再與2n-2做比較并做相同的工作,直至最低位被記為1或0。從n-1位、n-2位直至最低位所記的1或0就構成了二進制數Kn-1Kn-2K0。通常第1次比較所用的2n-1取做小于等于十進制整數的最大二進位權值。

【例1.6】將233D轉換為二進制數。

由于27<233D<28,故開始用做比較的數值取27。

具體轉換過程如下:

轉換結果為:233D=11101001B。

【例1.7】將130D轉換為二進制數。

考慮到130D為128D與2D之和,即為27與21之和,于是對應的二進制數K7K6K0K7=1,K1=1,其余位均為0,也即轉換結果為130D=10000010B。

由該例可見,在熟悉二進制各數位對應的權值的基礎上,參照減權記位法可以方便地進行十進制整數到二進制整數的轉換。

(2)十進制小數→非十進制小數

十進制小數轉換為二進制、八進制及十六進制等非十進制小數可以采用乘基取整法或減權記位法。前一方法較易掌握,但使用時較煩瑣;后一方法使用時較方便,但需要熟悉非十進制數各數位對應的權值。

① 乘基取整法。將十進制小數以及此間產生的小數部分不斷乘以非十進制數的基,并記下每次相乘所得到的整數部分,直至積的小數部分為0為止,按照從前往后的次序,將各整數部分作為K-1K-2,…K-m,就構成了對應的非十進制數K-1K-2K-m

【例1.8】將0.6875D轉換為二進制數。

按照題目要求,基應取2,具體轉換過程如下:

轉換結果為:0.6875D=0.1011B。

【例1.9】將0.6875D轉換為八進制數。

按照題目要求,基應取8,具體轉換過程如下:

轉換結果為:0.6875D=0.54Q。

當一個十進制小數對應的非十進制小數的位數過多時,可根據需要取前若干位作為近似結果。

② 減權計位法。與上述十進制整數轉換為二進制整數時使用的減權計位法類似,但有兩點區別:其一,十進制小數首先應與2-1比較,然后與2-2比較,依次類推;其二,有時要根據需要,取部分小數位作為近似轉換結果。

【例1.10】將0.6875D轉換為二進制數。

具體轉換過程如下:

轉換結果為:0.6875D=0.1011B。

如前所述,將一個十進制數轉換為非十進制數時,可以對其整數部分和小數部分分別作轉換,然后將整數部分和小數部分的轉換結果結合成為最終結果。

【例1.11】將233.6875D轉換為二進制數。

由前面的例題可知:

233D=11101001B

0.6875D=0.1011B

于是轉換結果為:233.6875D=11101001.1011B。

3.二進制數←→ 八進制數、十六進制數

由于一位八進制數對應三位二進制數,一位十六進制數對應四位二進制數,于是二進制數與八進制數、十六進制數之間的轉換比較簡單。

(1)二進制數→八進制數、十六進制數

將二進制數由小數點向左右每三位分為一組(不足三位則用0補充),每一組用對應的八進制數碼表示,即可得到對應的八進制數。類似地,將二進制數由小數點向左右每四位分為一組(不足四位則用0補充),每一組用對應的十六進制數碼表示,即可得到對應的十六進制數。

【例1.12】將01011101.01B分別轉換為八進制數和十六進制數。

          01011101.01B = 001011101.010B = 135.2Q
          01011101.01B = 01011101.0100B= 5D.4H

說明:在分組中若不足三位或不足四位時,一定要用0補充,否則極易出錯。就該例而言,若不注意這一點,就極易將結果錯寫為135.1Q和5D.1H。

(2)八進制數、十六進制數→二進制數

將八進制數的每一位數用三位二進制數碼表示,即可得到對應的二進制數。類似地,將十六進制數的每一位數用四位二進制數碼表示,即可得到對應的二進制數。必要時可以去掉轉換結果中的前0和尾0。

【例1.13】分別將45.4Q和27CH轉換為二進制數。

          45.4Q=100101.100B=100101.1B
          27CH=001001111100B=1001111100B

從以上介紹可以看出,在將十進制數轉換為非十進制數時,轉換為二進制數較為簡單,轉換為八進制數、十六進制則較為復雜。考慮到二進制數轉換為八進制數、十六進制數比較簡單,故在需要將十進制數轉換為八進制數、十六進制數時,可以先將其轉換為二進制數,然后再由二進制數轉換為八進制數、十六進制數。

【例1.14】將233.6875D轉換為十六進制數。

首先將233.6875D轉換為二進制數,由【例1.11】可知:

          233.6875D = 11101001.1011B

然后將11101001.1011B轉換為十六進制數。

          11101001.1011B = E9.BH

于是十進制數到十六進制數的轉換結果為:233.6875D = E9.BH

1.3 計算機中數和字符的表示

人們在使用計算機時,需要計算機不僅能處理數,即數值數據,而且能處理非數值數據,如字符、聲音和圖像等。雖然非數值數據在計算機中也是以二進制代碼的形式存儲,但它們的實際意義與數值數據不同。

1.3.1 數的表示

1. 機器數與真值

在本書前面的介紹中,均將數視為無符號數。例如,10100010B的每一位二進制數碼均被視為數值,其對應的十進制數為162。有符號數在計算機中如何表示?首先需要解決數符如何表示的問題。在計算機中實際采用數值化的方法來表示數符,通常用0表示正,用1表示負。這樣表示的數稱為機器數,而人們所習慣的用+、-分別表示正、負的數稱為真值。機器數的位數與計算機的字長有關,例如

這里機器數采用原碼表示。實際上,機器數還可以采用補碼、反碼表示。

2.原碼

原碼的最高位表示真值的數符,其余位為數值位,且與真值的數值位相同,必要時在數值位前加上前0。

數的原碼表示具有直觀、與真值的轉換方法簡單等優點,但是原碼有著算術運算復雜的缺陷。與手算相同,做加法運算時,首先要判斷兩數的數符,同號則相加,異號則相減。做減法運算時,還必須比較兩數的絕對值,用較大的絕對值減去較小的絕對值,差的數符則采用絕對值較大者的數符。以上的算法對于硬件實現來說比較困難。

3.補碼

補碼的引入,是為了簡化減法運算。補碼的概念在日常生活中經常用到,例如手表的校時。假定手表停在11時,而標準時間為9時,可以使用兩種校時方法:一種方法是逆時針調2小時,即11-2=9;另一種方法是順時針調10小時,在調至12時后則為0時,即到12時時歸零,因此有11+10=9(稱為模加)。于是,就手表校時而言有:

這里12稱為模,10稱為2的補數。由此看出,減去一個數等價于加上該數的補數。下面介紹計算機中使用的補碼的含義、求取方法及其運算。

(1)補碼定義

當一個數為正數,則其補碼就是該數本身;為負數,則其補碼等于模值與該數絕對值之差。式中的n為補碼的位數。

(2)根據真值求補碼

根據補碼定義可以求取一個數的補碼,然而還可以采用更為簡便的方法。求取一個數的n位補碼的簡便方法是:對于正數,通過補前0,將其數值部分補至n位即可;對于負數通過補前0,將其數值部分補至n位,然后按位取反并在末位加1即可。

【例1.15】求出以下各數的8位補碼:

          +1000011B,-111000B,+1111111B,-10000000B,0

① 將+1000011B的數值部分通過補前0達到8位,即可得到其補碼:

          [+1000011B]=01000011B

② 將-111000B的數值部分通過補前0達到8位,即00111000B。

          按位取反后得到:11000111B
          末位加1后得到:11001000B
          [-111000B]=11001000B

③ 將+1111111B的數值部分通過補前0達到8位,即可得到其補碼:

          [1111111B]=01111111B

④ -10000000B的數值部分已達8位,即10000000B。

          按位取反后得到:01111111B
          末位加1后得到:10000000B
          [-10000000]=10000000B

⑤ 用同樣方法不難求得:

          [0]=0

(3)根據補碼求真值

補碼最高位為0,則真值數符為“+”,真值數值位與補碼其余位相同;補碼最高位為1,則真值數符為“-”,將補碼所有位按位取反且末位加1后就可得到真值的數值位。

用這種方法可以方便的將【例1.15】中求得的補碼還原為對應的真值。

(4)補碼的表示范圍及補碼的擴展

① 補碼的表示范圍。若要求給出+10000000B和-10000100B的8位補碼,結果如何?顯然,將求不出正確的結果。原因在于,這兩個數超出了8位補碼所能表示的范圍-128~+127。一般而言,n位補碼所能表示的范圍為-2n-1~+2n-1-1。在計算機中,n常取8,16,32等。以上兩個數可以表示為16位補碼:

[+10000000B]=0000000010000000B

[-10000100B]=1111111101111100B

② 補碼的擴展。為了滿足進行算術運算等方面的需要,有時要求將一個補碼擴展成雙倍位數,比如由8位補碼擴展為16位補碼,由16位補碼擴展為32位補碼等。擴展方法是:將擴展的各位都置為原來補碼的最高位。

例如:[+1000011B]=01000011B=0000000001000011B

[-111000B]=11001000B=1111111111001000B

(5)補碼的加減法運算

補碼加法規則:[X+Y]=[X]+[Y]

補碼減法規則:[X-Y]=[X]+[-Y]

由此可見,使用補碼可以將減法運算轉換成加法運算,避免了前述減法運算中的困難。

【例1.16】補碼加法運算。

上述②、④中從最高位向前的進位由于位數的限制而自動丟失,但這并不影響運算結果的正確性。

【例1.17】補碼的減法運算。

在計算機中,補碼減法是通過對減數求補后把減法轉換為加法進行的。①、④中的最高位向前位的進位同樣自動丟失,而不影響運算的結果。

4.反碼

反碼的最高位表示真值的數符,0表示正,1表示負。當反碼最高位為0,則其余位與真值的數值位相同;當反碼最高位為1,則其余位是真值的數值位按位取反后的結果。

5.BCD碼

十進制小數和二進制小數相互轉換時可能產生誤差,而且日常習慣使用的是十進制,計算機中內部采用的是二進制。為方便十進制和二進制之間的轉換,計算機允許內部采用一組四位二進制數來表示一位十進制數,組間仍然采用“逢十進一”的規則進行。這種采用二進制表示的十進制數編碼稱為BCD碼(Binary Coded Decimal)碼。該編碼的方法和使用詳見本書第五章。

1.3.2 字符的表示

計算機只能識別二進制數,因此計算機中的數字、字母、符號、控制符、漢字等也必須采用二進制進行編碼。

1.ASCII碼

非漢字常用字符包括:

字母:A,B,…,Z;a,b,…,z

數字:0,1,…,9

專用符號:+,-,*,/ …

為了使計算機硬件能夠識別和處理這些字符,必須對字符按一定規則用二進制編碼,目前廣泛使用的是ASCⅡ碼(美國國家標準信息交換碼見附錄B),這種代碼用一個字節表示一個字符,最高位一般為校驗位。

2.漢字編碼

有了ASCII碼,計算機就能處理數字和英文字母等字符,但是還不能處理漢字字符。為了使計算機能夠處理漢字信息,就必須對漢字也進行編碼。

(1)GB2312漢字編碼

我國于1981年頒布了第一個國家標準——《信息交換用漢字編碼字符集·基本集》(GB 2312)。該標準選出6763個常用漢字和682個非漢字字符,為每個字符規定了標準代碼,以便在不同的計算機系統之間進行漢字文本的交換。

(2)GBK漢字內碼擴充規范

GB 2312只有6763個簡體漢字,在許多處理中有很大缺憾,如戶籍中的人名、地名等。GBK是我國1995年發布的又一個漢字編碼標準,一共有21003個漢字和883個圖形符號,與GB 2312國標漢字字符集及其內碼保持兼容,增加了大量了繁體字和符號。

(3)GB18030漢字編碼標準

2000年我國政府發布新的漢字國家標準,解決GBK與臺灣和香港地區Big5漢字編碼不兼容的問題,同時也與國際標準化組織(ISO)制訂的全球集中統一編碼UCS-2接軌,保護了已有的大量中文資源。GB 18083標準與GB 2312標準和GBK標準保持向下兼容,擴充了UCS中其他字符。

習題

1.1 將下列十進制數轉換為二進制數和十六進制數。

(1)(369)D =(?。〣 =(?。〩

(2)(355)D =(?。〣 =(?。〩

(3)(127)D =(?。〣 =( )H

(4)(1000)D =(?。〣 =(?。〩

1.2 將下列二進制數轉換為十六進制數和十進制數。

(1)(1011110111)B=(?。〩=(?。〥

(2)(11000100101)B=(?。〩=(?。〥

(3)(10000000)B=(?。〩=(?。〥

(4)(11100101)B=(?。〩=(?。〥

1.3 下表給出了十進制數,請寫出與之對應的二進制真值和8位補碼。

1.4 下列各數均為十進制數,請用8位補碼計算下列各題,并用十六進制數表示其運算結果。

1)69-48

2)-69+48

3)-69-48

1.5 分別將下列各數看作無符號數和補碼,則各自對應的十進制數是什么?

1)98H

2)31H

3)FFH

4)80H

1.6 如果用16位存儲一個無符號數,這個數的范圍是什么?如果存儲放入是一個補碼表示的有符號數,那么這個數的范圍是什么?

1.7 請寫出下列字符串的ASCII碼值。

            'Hello'
            'Please  give  me  $10.'
主站蜘蛛池模板: 军事| 塔城市| 贡山| 秦安县| 阳朔县| 大丰市| 惠东县| 南江县| 阜宁县| 公安县| 迁西县| 丹棱县| 清涧县| 石楼县| 建湖县| 师宗县| 依兰县| 大安市| 河源市| 防城港市| 麻城市| 宁海县| 武夷山市| 冷水江市| 静安区| 东兰县| 民丰县| 东宁县| 无极县| 浦北县| 遂平县| 利辛县| 凤阳县| 水城县| 芦溪县| 榆社县| 仲巴县| 济源市| 和顺县| 南城县| 石泉县|