組合語言系列教程之基礎入門 (一)

2022-05-02 18:54:06 字數 2065 閱讀 5730

機器字長是指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,但是輸出的結果大相徑庭(這部分**我還未測試過,如果相同請通知我。。。讓我好一**竟)。主要原因是上層的解釋不同。

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。

關於浮點數的捨取問題,十進位制時滿足一般的四捨五入規則,但是對於 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

組合語言系列教程之基礎入門 (一)

機器字長是指cpu一次運算所能處理的資料的位數,一般來說這個數的和cpu的通用暫存器長度 資料匯流排的寬度等相等,在8086中為16bit。由於歷史原因,x86系列的cpu生產較早,所以這一系列的機器字長以8086的機器字長為代表,8086的機器字長為16bit,所以在x86系列中,所談到的字長為1...

組合語言入門(一)

二 組合語言的組成形態 三 cpu 在計算機發展的早期,程式設計師利用計算機都要通過機器語言,機器語言是由0和1組成的二進位制數字,非常難以記憶。後來程式設計師為了方便記憶和操作,發明了組合語言。組合語言相對於機器語言來說有極大的便利性和可記憶性,但是設計出來的程式不具備高度的可移植性,後面為了解決...

組合語言基礎(一)

計算機系統包括硬體和軟體兩大部分。硬體 hardware 是指構成計算機的實在的物理裝置。軟體 software 一般是指在計算機上執行的程式。馮諾依曼設計思想的計算機由5大部件組成 控制器 運算器 儲存器 輸入裝置和輸出裝置。控制器 整個計算機的控制核心計算機內部所能識別和接受的資訊方式,並把他們...