彙編探索(二)

  在彙編代碼執行過程當中少不了兩個東西一個是進制,一個是寄存器xcode

進制

  • 八進制由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 5 8 A B F S 6 逢十進一。注意這裏的0、一、3只是一種符號。這種狀況下1 + 1 = 3,是否是頗有意思。想想咱們還能夠定義本身的一套進制規則,能夠用來加密✌️。 如下爲八進制加法表緩存

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
複製代碼

如下爲八進制乘法表markdown

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
複製代碼
  • 二進制簡寫
二進制: 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 temp = 0x1FFFFFFFF;
    return temp;
}

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位)加密

寄存器

  上圖爲內部部件之間由總線鏈接示意圖。CPU除了有控制器運算器還有寄存器。其中寄存器的做用就是進行數據的臨時存儲。CPU的運算速度是很是快的,爲了性能CPU在內部開闢一小塊臨時存儲區域,並在進行運算時先將數據從內存複製到這一小塊臨時存儲區域中,運算時就在這一小快臨時存儲區域內進行。咱們稱這一小塊臨時存儲區域爲寄存器。對於arm64系的CPU來講, 若是寄存器以x開頭則代表的是一個64位的寄存器,若是以w開頭則代表是一個32位的寄存器,在系統中沒有提供16位和8位的寄存器供訪問和使用。其中32位的寄存器是64位寄存器的低32位部分並非獨立存在的。CPU中最主要部件是寄存器,能夠經過改變寄存器的內容來實現對CPU的控制,不一樣的CPU,寄存器的個數、結構是不相同的。spa

  • 浮點和向量寄存器

  浮點數的存儲以及其運算的特殊性,CPU中專門提供浮點數寄存器來處理浮點數。浮點寄存器 64位: D0 - D31 32位: S0 - S31。如今的CPU支持向量運算(向量運算在圖形處理相關的領域用得很是的多)爲了支持向量計算系統了也提供了衆多的向量寄存器向量寄存器 128位:V0-V31。操作系統

  • 通用寄存器

   通用寄存器也稱數據地址寄存器一般用來作數據計算的臨時存儲、作累加、計數、地址保存等功能。定義這些寄存器的做用主要是用於在CPU指令中保存操做數,在CPU中當作一些常規變量來使用。ARM64擁有有32個64位的通用寄存器 x0x30,以及XZR(零寄存器),這些通用寄存器有時也有特定用途。那麼w0w28 這些是32位的.。由於64位CPU能夠兼容32位,因此能夠只使用64位寄存器的低32位。好比 w0 就是 x0的低32位。在8086彙編中有一種特殊的寄存器段寄存器:CS、DS、SS、ES四個寄存器來保存這些段的基地址,這個屬於Intel架構CPU中,在ARM中並無。在xcode斷點調試過程當中能夠直觀的看到寄存器的內存地址。 截屏2021-08-06 上午11.22.00.png   CPU是如何處理數據的運算的呢?
CPU會先將內存中的數據存儲到通用寄存器中,而後再對通用寄存器中的數據進行運算。例如假設內存中有塊綠色內存空間的值是3,如今想把它的值加1,並將結果存儲到黃色內存空間。 CPU其實進行了以下操做 一、CPU首先會將綠色內存空間的值放到X0寄存器中: mov X0, 綠色內存空間 二、而後讓X0寄存器與1相加:add X0, 1 三、最後將值賦值給內存空間:mov 黃色內存空間, X03d

pc寄存器

   pc寄存器爲指令指針寄存器,它指示了CPU當前要讀取指令的地址。在內存或者磁盤上,指令數據沒有任何區別,都是二進制信息。CPU在工做的時候把有的信息看作指令,有的信息看作數據,爲一樣的信息賦予了不一樣的意義。好比 1110 0000 0000 0011 0000 1000 1010 1010。能夠當作數據 0xE003008AA。也能夠當作指令 mov x0, x8。CPU將pc指向的內存單元的內容看作指令。若是內存中的某段內容曾被CPU執行過,那麼它所在的內存單元必然被pc指向過。CPU每執行一條指令前都須要從內存中將指令讀取到CPU內並執行。而寄存器的運行速度相比內存讀寫要快不少,爲了性能,CPU還集成了一個高速緩存存儲區域。當程序在運行時,先將要執行的指令代碼以及數據複製到高速緩存中去(由操做系統完成),CPU直接從高速緩存依次讀取指令來執行。iPhoneX上搭載的ARM處理器A11它的1級緩存的容量是64KB,2級緩存的容量8M。指針

  • bl指令

  CPU從何處執行指令是由pc寄存器中的內容決定的,咱們能夠經過改變pc寄存器的內容來控制CPU執行目標指令。ARM64提供了一個mov指令(傳送指令),能夠用來修改大部分寄存器的值,好比 mov x0,#10mov x1,#20。可是,mov指令不能用於設置pc寄存器的值,ARM64沒有提供這樣的功能。ARM64提供了另外的指令來修改pc寄存器的值,這些指令統稱爲轉移指令,最簡單的是bl指令。 bl做用:

  • 跳轉到標號處執行
  • 將下一條指令地址放進lr寄存器lr寄存器 後面接的地址是彙編執行過程當中回來的路。
相關文章
相關標籤/搜索