iOS開發技術拓展-ARM彙編入門(一) — 進制本質

目錄

ARM彙編入門(一) — 進制本質
ARM彙編入門(二) — 寄存器&pc&bl指令
ARM彙編入門(三) — 寄存器&cpu補充
ARM彙編入門(四) — 棧SP&FP寄存器
ARM彙編入門(五) — bl&ret函數的調用與返回
ARM彙編入門(六) — 函數的參數和返回值
ARM彙編入門(七) — 函數的局部變量與嵌套調用
ARM彙編入門(八) — 狀態寄存器
ARM彙編入門(九) — 內存分區全局變量和局部變量

進制

學習進制的障礙

很多人學不好進制,原因是總以十進制爲依託去考慮其他進制,需要運算的時候也總是先轉換成十進制,這種學習方法是錯誤的.
我們爲什麼一定要轉換十進制呢?僅僅是因爲我們對十進制最熟悉,所以才轉換.
每一種進制都是完美的,想學好進制首先要忘掉十進制,也要忘掉進制間的轉換!

進制的定義

  • 八進制由8個符號組成:0 1 2 3 4 5 6 7 逢八進一
  • 十進制由10個符號組成:0 1 2 3 4 5 6 7 8 9逢十進一
  • N進制就是由N個符號組成:逢N進一
做個練習
  • 1 + 1 在____情況下等於 3 ?
.
.
.
.
.
.
.
.
.
.
.
.
.

十進制由10個符號組成: 0 1 3 2 8 A B E S 7 逢十進一

如果這樣定義十進制: 1 + 1 = 3!就對了!

這樣的目的何在?
傳統我們定義的十進制和自定義的十進制不一樣.那麼這10個符號如果我們不告訴別人這個符號表,別人是沒辦法拿到我們的具體數據的!用於加密!

十進制由十個符號組成,逢十進一,符號是可以自定義的!!

進制的運算

做個練習
  • 八進制運算
    • 2 + 3 = __ , 2 * 3 = __ ,4 + 5 = __ ,4 * 5 = __.
    • 277 + 333 = __ , 276 * 54 = __ , 237 - 54 = __ , 234 / 4 = __ .
八進制加法表
 0  1  2  3  4  5  6  7 
10 11 12 13 14 15 16 17
20 21 22 23 24 25 26 27
...

1+1 = 2                     
1+2 = 3   2+2 = 4               
1+3 = 4   2+3 = 5   3+3 = 6
1+4 = 5   2+4 = 6   3+4 = 7   4+4 = 10  
1+5 = 6   2+5 = 7   3+5 = 10  4+5 = 11  5+5 = 12
1+6 = 7   2+6 = 10  3+6 = 11  4+6 = 12  5+6 = 13  6+6 = 14
1+7 = 10  2+7 = 11  3+7 = 12  4+7 = 13  5+7 = 14  6+7 = 15  7+7 = 16

八進制乘法表
0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21 22 23 24 25 26 27...
1*1 = 1                     
1*2 = 2   2*2 = 4               
1*3 = 3   2*3 = 6   3*3 = 11    
1*4 = 4   2*4 = 10  3*4 = 14  4*4 = 20
1*5 = 5   2*5 = 12  3*5 = 17  4*5 = 24  5*5 = 31
1*6 = 6   2*6 = 14  3*6 = 22  4*6 = 30  5*6 = 36  6*6 = 44
1*7 = 7   2*7 = 16  3*7 = 25  4*7 = 34  5*7 = 43  6*7 = 52  7*7 = 61

實戰四則運算
   277         236         276         234
+  333       -  54       *  54       /   4
--------    --------    --------    --------    

二進制的簡寫形式

       二進制: 1 0 1 1 1 0 1 1 1 1 0 0
三個二進制一組: 101 110 111 100
       八進制:   5   6   7   4
四個二進制一組: 1011 1011 1100
     十六進制:    b    b    c

二進制:從0 寫到 1111
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
這種二進制使用起來太麻煩,改成更簡單一點的符號:
0 1 2 3 4 5 6 7 8 9 A B C D E F 這就是十六進制了

數據的寬度

數學上的數字,是沒有大小限制的,可以無限的大。但在計算機中,由於受硬件的制約,數據都是有長度限制的(我們稱爲數據寬度),超過最多寬度的數據會被丟棄。

#import <UIKit/UIKit.h>
#import "AppDelegate.h"

int test(){
    int cTemp = 0x1FFFFFFFF;
    return cTemp;
}

int main(int argc, char * argv[]) {
    printf("%x\n",test());
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

計算機中常見的數據寬度

  • 位(Bit): 1個位就是1個二進制位.0或者1
  • 字節(Byte): 1個字節由8個Bit組成(8位).內存中的最小單元Byte.
  • 字(Word): 1個字由2個字節組成(16位),這2個字節分別稱爲高字節和低字節.
  • 雙字(Doubleword): 1個雙字由兩個字組成(32位)

那麼計算機存儲數據它會分爲有符號數和無符號數.那麼關於這個看圖就理解了!

image

無符號數,直接換算!
有符號數:
正數:  0    1    2    3    4    5    6    7 
負數:  F    E    D    B    C    A    9    8
      -1   -2   -3   -4   -5   -6   -7   -8

自定義進制符號

練習
  • 現在有10進制數 10個符號分別是:2,9,1,7,6,5,4, 8,3 , A 逢10進1 那麼: 123 + 234 = ____

十進制:    0  1  2  3  4  5  6  7  8  9
自定義:    2  9  1  7  6  5  4  8  3  A
         92 99 91 97 96 95 94 98 93 9A
         12 19 11 17 16 15 14 18 13 1A
         72 79 71 77 76 75 74 78 73 7A
         62 69 61 67 66 65 64 68 63 6A
         52 59 51 57 56 55 54 58 53 5A
         42 49 41 47 46 45 44 48 43 4A
         82 89 81 87 86 85 84 88 83 8A
         32 39 31 37 36 35 34 38 33 3A
         922

那麼剛纔通過10進制運算可以轉化10進制然後查表!但是如果是其他進制.我們就不能轉換,要直接學會查表

  • 現在有9進制數 9個符號分別是:2,9,1,7,6,5,4, 8,3 逢9進1 那麼: 123 + 234 = ____

十進制:    0  1  2  3  4  5  6  7  8  
自定義:    2  9  1  7  6  5  4  8  3  
         92 99 91 97 96 95 94 98 93 
         12 19 11 17 16 15 14 18 13 
         72 79 71 77 76 75 74 78 73 
         62 69 61 67 66 65 64 68 63 
         52 59 51 57 56 55 54 58 53 
         42 49 41 47 46 45 44 48 43 
         82 89 81 87 86 85 84 88 83 
         32 39 31 37 36 35 34 38 33 
         922

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章