1/2.進制
進制的定義
- 十進制:由10個符號組成,逢9進1
- N進制:由N個符號組成,逢N-1 進一
重要進制
- 16進制4個2進制的簡寫
- 熟悉數之間的相互轉化
利用進制之間轉化表
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
補碼的出現可以簡化邏輯運算器,只需要加法器,不需要額外的減法器,大大節省成本和空間
有符號數 / 無符號數
4位二進制情況:
F 為什么對應 -1 ?
F:1111
在有符號情況下,F為補碼表示,F的反碼為1110,F的原碼為1001(減一取反)負數補碼的計算:正數下取反加一
理解:F為最大的負數-1,根據這個圓,左半邊都是負數
8位二進制情況:
范圍:
無符號數: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
作業題
-
八進制
2-5
在計算器的結果為17777777777777777775
,為什么?
得到結果-3的二進制為1111 1101(補碼形式),十六進制為FD,八進制就是該值 -
使用異或對87AD6進行加密在進行解密,加解密密鑰為5
1000 0111 1010 1101 0110xor 0101 加密密鑰
----------------------------------------------------
1000 0111 1010 1101 0011 加密后的值
xor 0101 解密密鑰
-----------------------------------------------------
1000 0111 1010 1101 0110 解密后的值,與原值一致 -
只用邏輯運算計算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
MOV 語法
MOV 目標操作數, 源操作數
注意點:
操作數的寬度必須一致
不能同時為內存單元
類似的指令還有
- 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個。
編號的地址為該區最小地址,且從右往左依次增大詳情見堆棧部分!