計算機底層初步了解


語言

溝通

機器語言

 #我們目前主流的電子計算機
 狀態:0和1
 #最早的程序員:穿孔卡帶
 加 減 乘 除

助記符!匯編語言!將人類理解的語言轉化為機器能夠理解的語言

 加 INC -編譯器-> 0100 0000
 減 DEC          0100 1000
 乘 MUL          0100 1000 0100 1000
 除 DIV          0100 1000 1100 1000

匯編一般用於底層的編寫,單片機

c語言

 加 A+B -編譯器-> 0100 0000
 減 A-B          0100 1000
 乘 A*B          0100 1000 0100 1000
 除 A/B          0100 1000 1100 1000

進制

1進制:一進一,結繩記事。1 1

2進制:二進一,計算機

八進制:八進一, 8個符號組成

10進制:10進一,十個符號

16進制:16進一,十六個符號

 #一進制 1~20
 1
 1 1
 1 1 1
 1 1 1 1
 ......
 
 #三進制
 0   1   2
 10  11  12
 20  21  22
 100 101 102
 110 111 112
 120 121 122
 200 201
 
 #七進制
 0   1   2   3   4   5   6
 10  11  12  13  14  15  16
 20  21  22  23  24  25  26
 
 #一組符號,逢幾進幾

 

進制如何運算

 #八進制計算
 2+3=5
 2*3=6
 4+5=11
 4*5=24
 
 #運算的本質就是查數
 0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21 22 23 24 25 26 27 30
 
 #八進制計算 九九乘法表=加法表
 277+333 =
 276*54 =
 237-54 =
 234/4 =

八進制乘法表

1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7
2*2=4 2*3=6 2*4=10 2*5=12 2*6=14 2*7=16  
3*3=11 3*4=14 3*5=17 3*6=22 3*7=25    
4*4=20 4*5=24 4*6=30 4*7=34      
5*5=31 5*6=36 5*7=43        
6*6=44 6*7=52          
7*7=61            

八進制加法表

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
  #運算的本質就是查數
   277
   333 +
 ------------------------
   632
  #乘法
   276
    54 *
 ------------------------
      1370
     1666  +
 ------------------------
     20250
 #減法的本質就是加法! 237-54 = 237 + (-54)
 ------------------------
 #除法的本質就是除數乘以哪個數最接近結果即可
 234
   4 /
 ------------------------
   47

二進制

計算機使用二進制 0 1!狀態!電子~

量子計算機

可以實現量子計算的機器。

傳統的計算機:集成電路 0 1.

量子計算機的單位:昆比特。(量子比特)量子的兩態來表示。

 二進制: 0 1111
 0 1 2 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111

二進制簡寫就是16進制

 0 1 2 3 4 5 6 7 8 9 a b c d e f

為了學習寄存器、內存、位!底層的每一個位的含義。匯編入門理解的基礎!

匯編高級:了解程序的深層!操作系統的內核!

數據寬度

計算機:內存!給數據增加數據寬度。

C、C++和java都需要定義數據的類型。計算機底層需要我們給這些數據定義寬度。

位 0 1

字節 0~0xFF

字 0~0xFFFF

雙字 0~0xFFFFFFF

在計算機中,每一個數據都需要給它定義類型。給它定義寬度。在內存中的寬度。

有符號數和無符號數

無符號數規則

數字是什么就是什么

 1 0 0 1 1 0 1 0 十六進制 0x9A 十進制 154

有符號規則

最高位是符號位:1(負數)0(正數)

原碼反碼補碼

編碼規則

有符號數的編碼規則

原碼:最高位符號位,對其它的為進行本身絕對值即可

反碼:

  • 正數:反碼和原碼相同

  • 負數:符號位一定是1,其余位對原碼取反

補碼:

  • 正數:反碼和原碼相同

  • 負數:符號位一定是1,反碼+1

 

 #八位
 #如果是正數,那都是一樣
 1
 #原碼 0 0 0 0 0 0 0 0
 #反碼 0 0 0 0 0 0 0 1
 #補碼 0 0 0 0 0 0 0 1
 
 #如果是負數
 -1
 #原碼 1 0 0 0 0 0 0 1
 #反碼 1 1 1 1 1 1 1 0
 #補碼 1 1 1 1 1 1 1 1
 
 -7
 #原碼 1 0 0 0 0 1 1 1
 #反碼 1 1 1 1 1 0 0 0
 #補碼 1 1 1 1 1 0 0 1

二進制需要了解是有符號數還是無符號數

位運算

計算機現在可以存儲所有的數字,運算。

0 1

2*8最高效的計算方式

很多底層的調試器,需要通過位來判斷CPU狀態

位運算計算

 1011 0001
 1101 1000
 -------------------與運算and &
 1001 0000
 
 1011 0001
 1101 1000
 -------------------或運算 or |
 1111 1001
 
 1011 0001
 1101 1000
 -------------------異或運算 xor ^ 不一樣就為1
 0110 1001
 
 1011 0001
 -------------------非運算 not ~ 0就是1 1就是0
 0100 1110

位運算(移動位)

左移:(shl <<)

 0000 0001 @ 所有的二進制全部左移若干位,高位丟棄,低位補0
 0000 0010

右移:(shr >>)

 0000 0001 @ 所有的二進制全部右移若干位,低位丟棄,高位補0,1(符號位決定)
 0000 0010
 
 int a = 10;
 printf("%d\n,a>>2")

位運算實現加減乘除

4+5=?

 #計算機如何操作
 0000 0100
 0000 0101
 -------------(加法,計算機不會直接相加)
 0000 1001
 
 #計算機實現原理
 #第一步,異或,如果不考慮進位,異或就可以直接出結果。
 0000 0100
 0000 0101
 ------------
 0000 0001
 
 #第二步,與運算(判斷進位,如果與運算結果為0,沒有進位)
 0000 0100
 0000 0101
 -------------
 0000 0100
 
 #第三步,將與運算結果左移一位。 0000 1000 #進位的結果
 
 #第四步,異或!
 0000 0001
 0000 1000
 --------------
 0000 1001
 #第五步,與運算(判斷進位,如果與運算結果為0,沒有進位)
 0000 0001
 0000 1000
 --------------
 0000 0000
 #所以最終的結果就是與運算為0的結果的上一個異或運算結果
 4 + 5 = 9
 0000 0100 + 0000 0101 = 0000 1001

4-5=?

 #計算機操作
 4+(-5)
 -5 0000 0101 反碼加1 1111 1010 + 1 = 1111 1011
 
 0000 0100
 1111 1011
 --------------(減法,計算機是不會直接減的)
 1111 1111
 
 0000 0100
 1111 1011
 ---------------異或如果不考慮進位,異或就可以直接出結果。
 1111 1111
 
 0000 0100
 1111 1011
 ---------------與,判斷是否有進位,運算為0,沒有進位
 0000 0000
 
 最終結果為 1111 1111 16: ff 10: -1

乘:x*y 就是y個x相加

除:x/y 就是x能減去多少個y

計算機只會做加法

機器語言就是位運算,就是電路來實現的,這就是計算機最底層的本質。

匯編

通過指令來代替二進制編碼。

通過匯編指令可以給計算機發一下操作,然后讓計算機執行。編譯器的發展,底層大佬,幾乎都是用最原始的IDE。

學習匯編的環境(1、Vc6(程序到匯編的理解)2、OD 3、抓包工具 4、加密解密工具)

建議直接學習32位匯編

匯編入門:了解匯編和程序的對應關系,程序的本質即可!

寄存器

存儲數據:CPU>內存>硬盤

32位CPU: 8 16 32

64位CPU:8 16 32 64

通用的寄存器:32位的通用寄存器只有8個

存值范圍:0~FFFFFFFF

對於二進制可以直接改值

mov指令

 mov 存的地址,存的值
 mov 存的地址,存的地址

可以將值寫入寄存器,也可以將寄存器中的值寫到寄存器

              FFFF         FF   
 32位         16位          8位
 EAX         AX           AL
 ECX         CX           CL
 EDX         DX           DL
 EBX         BX           BL
 ESP         SP           AH
 ENP         NP           CH
 ESI         SI           DH
 EDI         DI           BH

8位:L低八位,H高八位

除了通用寄存器外,其他的寄存器每一位都有自己特定的功能。

內存

程序真正運行的時候,才會用到物理內存

1B = 8bit

1KB = 1024B

1MB = 1024KB

1GB = 1024MB

4G內存,4096m =>最終計算為位,就是這個可以存儲的最大容量

內存地址

存一個數:占用的大小,數據寬度!

計算機中內存地址很多,空間很大,每個空間分配一個地址,名字。

這些給內存起的編號,就是餓哦們的內存地址,32位 8個16進制的值

32位:尋址能力!4GB

FFFFFFFF + 1 = 100000000 ,最大值(內存地址)

100000000 內存地址*8 = 位:800000000

轉換為十進制/8:4294967296字節

按照規則/1024,最終發現就是4GB!

每個內存地址都有一個編號,可以通過這些編號向里邊存值。

如何寫值

數據寬度:byte word dword qword

地址的位置:0xFFFFFFFF

不是任意的地址都可以寫東西,申請使用的。只有程序申請過的內存地址我們才可以使用。

 匯編如何向內存中寫值
 mov 數據寬度 內存地址,1
 
 mov byte ptr ds:[0x19FF70],1
 
 傳遞的值的大小一定要和數據寬度相等

內存地址有多種寫法

ds:[0x19FF70+4] 內存地址偏移

ds:[eax] 寄存器

ds:[eax+4] 寄存器偏移

數組[]

ds:[reg+reg*{1,2,4,8}] 數組!

ds:[reg+reg*{1,2,4,8}+4] 偏移!

 


免責聲明!

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



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