彙編初步瞭解筆記
彙編筆記
進位制
十六進位制: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
有符號數,無符號數
規則
無符號數規則
1 0 0 1 1 0 1 0
十六進位制:0x9A 十進位制:154
有符號數規則 (最高位是符號位 1 負 ,0 正)
1 0 0 1 1 0 1 0
如何轉換??
原碼,反碼,補碼
原碼: 最高位是符號位,對其它的位進行絕對值即可
反碼:
- 正數:反碼和原碼相同
- 負數:符號位一定是1,其餘對原碼取反
補碼:
舉例 8位
1 的原碼反碼補碼 正數,原碼反碼補碼都一樣
原碼:0 0 0 0 0 0 0 1
反碼: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
位運算就是基於這些上面的原碼反碼補碼。(在計算機中數字按 補碼 儲存)
暫存器
mov 暫存器 值
位運算
-
與運算(&):兩個都為 1 則是 1
例如: 1 0 1 1 0 0 0 1 1 1 0 1 1 0 0 0 --------------- 1 0 0 1 0 0 0 0
-
或運算(|):有一個為 1 則是 1
例如: 1 0 1 1 0 0 0 1 1 1 0 1 1 0 0 0 --------------- 1 1 1 1 1 0 0 1
-
異或運算(xor ^):不一樣就是 1
例如: 1 0 1 1 0 0 0 1 1 1 0 1 1 0 0 0 --------------- 0 1 1 0 1 0 0 1
-
非運算: 0 變 1 ,1 變 0
-
位運算(移動位)
例如左移<<(也就是乘2): 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 ...............
左移補0 右移看符號位補
位運算的加減乘除
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
至此得到4+5的結果。
第五步:再次將第四步的兩個數進行與運算,判斷是否產生了進位
0000 0001
0000 1000
---------
0000 0000 沒有產生進位。結果就是上面那個。
4 - 5 = ?
計算機又是怎麼操作減法的呢? (計算機時不會直接減的!)
4+(-5)
0000 0100
0000 0101 負數轉換: 1111 1010(反碼)--> 1111 1011 (補碼)
*********
第一步 異或:
轉換為 :
0000 0100
1111 1011
---------
1111 1111 FF 就是代表-1了,但接著完成下面的步驟
第二步 與運算 :
0000 0100
1111 1011
---------
0000 0000 都是0,所以沒有進位,最終結果就是 1111 1111
自己補充一下,因為知道結果是負數,所以還原1111 1111
符號位不變,補碼-1
1111 1110
符號位不變,反碼還原
1000 0001
符號位是1 結果為負數 0000 00001 就是-1
乘法
說白了就是複雜的加法
除法
x/y說白了就是減法,就是能減去多少個y,減法又是加法。
組合語言
組合語言是使用一些符號指令表示上面的 異或,與等操作。
暫存器理解
-
通用暫存器
儲存資料:CPU > 記憶體 > 硬碟 32位CPU 8 16 32 64位CPU 8 16 32 64 32位的通用暫存器只有八個; 每個暫存器存值範圍是 0 - FFFF FFFF
計算機如何向暫存器存值?
MOV 指令
mov 存的地址,存得數 mov 存的地址1,存得地址2
不同的暫存器
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代表低8位 ,H代表高8位
除了通用暫存器之外,那麼其他的暫存器每一位都有它特定的作用。
-
記憶體
暫存器很小,不夠用,所以需要將資料放到記憶體。
每個程式程式都有4GB的記憶體空間,類似於空頭支票,並不真的給4GB。
怎麼算的呢?程式真正執行的時候,才會用到實體記憶體。
1B = 8bit;
1KB = 1024B;
1MB = 1024KB;
1GB = 1024MB;
4G的記憶體,4096m => 最終計算為位,就是這個可以儲存的最大容量。
記憶體地址
32位: 定址能力,4GB是上限。
FFFF FFFF + 1 = 1 0000 0000,最大的值
位是怎麼限制記憶體大小的。
1 0000 0000 記憶體地址 * 8 = 位 : 8 0000 0000
轉換成10進位制/8 : 4,294,967,296位元組
再/1024 : 4,194,304 KB
再/1024 : 4096 MB 也就是4GB,這就說明,32位的定址能力就是4GB。
64位: FFFF FFFF FFFF FFFF 大!!!!
所以每個記憶體地址都有一個編號,,可以通過編號去存值。
記憶體如何存值?
1. 資料寬度 byte word dword
2. 地址的位置 0xFFFFFFFF
彙編如何向記憶體中寫值?
不是任意的地址都可以寫東西,都是申請使用的,也就是說只有程式申請的才可以使用。
mov 資料寬度 記憶體地址,1
mov byte/word/dword/qword ptr ds:[0x19FF70], 1
要注意傳遞的值得資料寬度。
記憶體 有多種寫法
相關文章
- TypeScript初步瞭解TypeScript
- 彙編學習筆記筆記
- 逆向之彙編筆記筆記
- iOS逆向學習筆記 - 彙編(一) - 初識彙編iOS筆記
- 站在彙編角度深入瞭解 Swift(十一)Swift
- 站在彙編角度深入瞭解 Swift(十二)Swift
- 站在彙編角度深入瞭解 Swift(一)Swift
- 站在彙編角度深入瞭解 Swift(二)Swift
- 站在彙編角度深入瞭解 Swift(三)Swift
- 站在彙編角度深入瞭解 Swift(四)Swift
- 筆記:瞭解Elasticsearch筆記Elasticsearch
- 【自用】彙編初學筆記 #1筆記
- 彙編基礎學習筆記筆記
- 彙編筆記(持續更新中)筆記
- 大資料初步瞭解大資料
- 初步瞭解 JS 繼承JS繼承
- Java集合類初步瞭解Java
- 學習筆記分享之彙編---2.彙編指令/語法筆記
- 初步瞭解軟體測試
- 對函式的初步瞭解函式
- JDBC的初步瞭解及使用JDBC
- 彙編學習筆記之轉移指令筆記
- vue瞭解與初步接觸/使用Vue
- 初步瞭解AQS是什麼(二)AQS
- Solidity語言學習筆記————38、Solidity彙編Solid筆記
- 《機器學習初步》筆記機器學習筆記
- 【筆記/模板】網路流初步筆記
- 委託初步瞭解(程式碼段展示)
- python之對元組的初步瞭解Python
- Flask入門學習---初步瞭解模板Flask
- 初步瞭解URL(介面測試必備)
- Solidity語言學習筆記————39、獨立彙編Solid筆記
- Kubernetes筆記(五):瞭解Pod(容器組)筆記
- 初步瞭解Windows7下部署SonarWindows
- java基礎-多執行緒初步瞭解Java執行緒
- 初步瞭解C語言Windows程式設計C語言Windows程式設計
- 逆向學習筆記3——暫存器與彙編指令筆記
- 彙編學習筆記07——BCD碼及調整指令筆記