【網課筆記Ⅱ】滴水逆向(持續更新ing)


1/2.進制

進制的定義

  • 十進制:由10個符號組成,逢9進1
  • N進制:由N個符號組成,逢N-1 進一

重要進制

  • 16進制4個2進制的簡寫
  • 熟悉數之間的相互轉化

image.png

利用進制之間轉化表

3.數據寬度_邏輯運算

  • 數據寬度

  • 計算機中的補碼、有符號數等只是人為的定義,對於計算機而言,它只知道存了多少個0和1

  • 有符號數、無符號數

  • 邏輯運算 與或非

CPU如何計算2+3 (視頻3 42:00左右)
先異或,再與,最后判斷

4位二進制轉換,最好硬記!

2進制 10進制
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9
1010 A
1011 B
1100 C
1101 D
1110 E
1111 F

負數的補碼

對於正數,原碼、反碼、補碼都是一致的

負數補碼的計算:對應正數取反加一

例子:-1

UntJ7q.png

補碼的出現可以簡化邏輯運算器,只需要加法器,不需要額外的減法器,大大節省成本和空間

有符號數 / 無符號數

4位二進制情況:

Un8AIO.png

F 為什么對應 -1 ?

F:1111
在有符號情況下,F為補碼表示,F的反碼為1110,F的原碼為1001(減一取反

負數補碼的計算:正數下取反加一

理解:F為最大的負數-1,根據這個圓,左半邊都是負數

8位二進制情況:

U3hzqO.png

范圍:
無符號數:0~FF (0~255)
有符號數:0~7F (0127)、80FF (-128 ~ -1)

80 為什么對應 -128 ?
80 ==>1000 0000
因為是有符號數,這里的符號位在第8位

原碼 1 000 0000

反碼 1 111 1111

補碼 1 1000 0000(數值上看出為-128,但符號位超過了8位的限制)

總之,范圍就是 -128 ~ 127

作業題

  1. 八進制2-5在計算器的結果為17777777777777777775,為什么?
    得到結果-3的二進制為1111 1101(補碼形式),十六進制為FD,八進制就是該值

  2. 使用異或對87AD6進行加密在進行解密,加解密密鑰為5
    1000 0111 1010 1101 0110

    xor 0101 加密密鑰
    ----------------------------------------------------
    1000 0111 1010 1101 0011 加密后的值
    xor 0101 解密密鑰
    -----------------------------------------------------
    1000 0111 1010 1101 0110 解密后的值,與原值一致

  3. 只用邏輯運算計算2-3=?(計算機計算2-3)(涉及內容:邏輯運算、移位、數據寬度)
    2:0010、-3:1101(補碼表示)
    0010
    xor 1101
    ----------------
    1111(X)

    ​ 0010
    & 1101
    ----------------
    ​ 0000(Y)
    0000 << 1 == 0000 就不用再循環一次了
    1111補 = 1001原 = -1

    若Y左移后不全為0000,則需要再對XY做相同的邏輯運算處理,直到新的Y=0

4.通用寄存器_內存讀寫

通用寄存器

按位數區分:

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

AX 包括 AH和AL

U33OgK.png

MOV 語法

MOV 目標操作數, 源操作數

U3Gdeg.png

注意點:

操作數的寬度必須一致

不能同時為內存單元

類似的指令還有

  • ADD
  • SUB
  • AND
  • OR
  • XOR
  • NOT

可以查閱提供的課程筆記

作業題

5.內存

寄存器和內存的區別

寄存器在CPU內部,內存在CPU外部的數據總線上。

寄存器是高速存貯部件,暫時存儲指令數據和地址,可對內存數據進行操作。內存是所有運行程序存儲的空間

32位計算機

32位計算機中的位數,與寄存器寬度無關而與尋址寬度有關(所能查找的內存編號范圍),每一內存編號對應的是1字節。

最大內存范圍為0xFFFFFFFF ==> 4,294,967,296(10進制)Byte ==> 4,194,304KB ==> 4096MB ==> 4GB

只要是32位計算機,最多識別的內存為4G?
不對,可以通過打補丁或者拓展尋址范圍

操作內存

內存不像寄存器,有固定的數據寬度,在對內存進行讀或寫時,需要指定內存的大小字節(1、2、4字節 ==> byte、word、dword)

MOV 內存寬度 PTR DS:[內存地址], 數據
MOV BYTE PTR DS:[0X01234567], 0X12
MOV WORD PTR DS:[0X01234567], 0X1234
MOV DWORD PTR DS:[0X01234567], 0X11223344

內存寬度:指定讀寫改內存的數據寬度

PTR:代表的一個指針,指的是一個地址

DS:段寄存器

0x01234567:內存編號,內存的地址,32位

實驗

寫入:
MOV DWORD PTR DS:[0X00FF12C2], 0X01234567
讀取:
MOV EAX, DWORD PTR DS:[0X00FF12C2]

這里的0x00FF12C2在堆棧內,因為一些內存為禁止訪問,不方便做實驗,這里就選擇堆棧地址做實驗

堆棧區:顯示4個塊為一行,看左邊的編號並非連續的,而是間隔4個。
編號的地址為該區最小地址,且從右往左依次增大

詳情見堆棧部分!


免責聲明!

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



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