匯編語言系列教程之基礎入門 (一)


機器字長

  機器字長是指CPU一次運算所能處理的數據的位數,一般來說這個數的和CPU的通用寄存器長度、數據總線的寬度等相等,在8086中為16bit。由於歷史原因,x86系列的CPU生產較早,所以這一系列的機器字長以8086的機器字長為代表,8086的機器字長為16bit,所以在x86系列中,所談到的字長為16bit。相比較而言,MIPS系列的CPU則相對較晚才出現,這一系列的CPU一出現就是32位的CPU,所以MIPS系列中所談的機器字長位32bit。

 

字節順序

  數據在內存中的存儲順序有兩種,一種為小端(Little Endian)存儲,這種 存儲最為常見,因為我們生活中見到的x86系列以及MIPS系列的CPU全部是小端存儲。與之相反的大端(Big Endian)則較少見到,在PowerPC系列的CPU中是使用這種存儲方式,此外socket編程人員可能也容易遇見這種存儲,因為在Internet上面數據的傳輸都是采用大端存儲。

 

無符號數與有符號數

  學過C語言的同學都知道整型數據類型分為無符號類型unsigned和有符號類型signed,其中無符號類型的范圍為 [0, 2n-1] (這里的n表示這種類型的bit數,如short為16個bit,32位的CPU中的int位32個bit,下同) ,有符號類型的范圍為 [-2n-1,2n-1-1] 。其實這在計算機的存儲層面和匯編語言的處理層面是沒有這部分的區別的,有符號和無符號都統一處理(無區別對待)。它們到了C語言層面表現的不同是因為上層對它們的解釋不同而已。這部分可以自己做一個實驗,用C語言輸出兩個相同的數。1、printf("%d", -1); 2、printf("%u", -1); 這兩個數都是-1,但是輸出的結果大相徑庭(這部分代碼我還未測試過,如果相同請通知我。。。讓我好一探究竟)。主要原因是上層的解釋不同。

  就這部分,推薦大家在C語言中除非特別確定,否則盡量不要使用unsigned,尤其是以為這部分數據不會出現負數而使用unsignd,可能會出現嚴重的問題。比如下面的代碼:

1、認為數組下標不會出現負數:

  for(unsigned i=10; i>=0; --i) arr1[i] = arr2[i];

2、認為一個類型的大小不會出現負數:

  unsigned x=sizeof(int);

  for(int i=0; x-i>=0; ++i) ...;

上面這兩個代碼都會出現死循環的問題,因為unsigned始終是滿足大於等於0。注意第二部分的代碼中有一個隱式類型提升。

 

浮點數存儲

  浮點數在內存中的存儲如右圖所示,其中s表示符號,指明是正數還是負數,exp表示指數,frac是一個介於[1.0, 2.0)之間的一個小數。

  其中exp表示的指數並非簡單的指數,而是要減去一個偏置量。這個偏置量在單精度中為127,在雙精度中為1023。

  frac可以通過調整exp保證其介於[1.0, 2.0)之間,比如將某數轉換為二進制后其二進制表示為 111.0011 那么將exp加2后,這個數便可以寫為1.110011。

  

  下圖是一個轉化實例:

  上面談到的是規格化的表示,此外浮點數還有非規格化的表示:

  1、+0和-0 :exp和frac全部為0;

  2、+∞和-∞ :exp和frac全部為1;

  3、不是一個數:exp全部為1, frac全部為0。

注:這里s、exp以及frac的順序位置是精心安排的,因為這樣為順序可以保證浮點數之間的比較可以直接按二進制的大小進行比較,而不用先譯碼再比較。

關於浮點數的舍取問題,十進制時滿足一般的四舍五入規則,但是對於 12.235000000.....(保留小數點后兩位)這種參考位為5000000.....類型的,要滿足向偶數取舍(round to even),即取舍完以后最低位為偶數。這樣一來12.235000000.....和12.245000000.....保留小數點后兩位都得到12.24。保證最后一位為偶數(4)。二進制同理,當參考位為10000.....時,也要向偶數取舍。

例如把下面的數舍入到小數點后兩位:

1、10.00011  -->  參考位011 < 100...  -->  直接舍掉  -->  10.00

2、10.00110  -->  參考位110 > 100...  -->  直接進位  -->  10.01

3、10.11100  -->  參考位100 = 100...  -->  向偶取舍  -->  11.00

4、10.10100  -->  參考位100 = 100...  -->  向偶取舍  -->  10.10

 


免責聲明!

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



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