視頻地址:http://study.163.com/course/courseMain.htm?courseId=1003265009程序員
近來研究操做系統,涉及到彙編語言相關知識點,故有此學習和記錄!安全
彙編語言基礎:
1. 課程講解
追求的目標,是從本質上知道程序是如何運行的。
好比if(){}else{}中,如何讓else的那個不執行?
工做幾年的程序員最大的悲哀,是隻會調函數、畫界面,進行重複勞動。作安全、架構,或者管理……
基礎最重要!架構
2. 編譯器
編譯器將彙編語言轉爲機器語言 inc eax --> 0100 0000
C語言編譯器 將 A+B --> 0100 0000
本質是編譯器愈來愈牛b,是編譯器幫咱們作了更多事情。
不懂彙編的人,必定不專業。
不懂堆棧的人,必定不瞭解外掛。函數
3. 進制
如將十進制定義爲:由十個符號組成,分別是0132876945.
那麼,這個新的定義作成加密,會對解密者形成極大的困擾
量子計算機:不止0和1學習
4. 數據寬度:
存儲超過最大值時,直接丟棄。編碼
5. 無符號數和有符號數
無符號數(正數):10011010直接存儲,表示0x9A,或154(十進制)
有符號數:最高位是0爲正數!!1爲負數。
負數與正數編碼規則不一樣。
原碼:當前數的絕對值(正數的反碼,補碼,原碼相同)
反碼(負數):符號位不變,其他位取反
補碼(負數):反碼加一(負數以補碼形式存儲)
即,-1:原碼,反碼,補碼
1000 0001
1111 1110
1111 1111 //FF:內存中以補碼存儲
6. 位運算
你能夠說知道2+3=5,可是若是僅僅只作CRUD,太low。
寫代碼就是體力活,理解原理很重要。
int表示32位
1. 與運算:
都是1纔是1,不然爲0
1011 0001
and(&) 1101 1000
-----------------
1001 0000
2. 或運算:
只要有一個爲1就是1
1011 0001
or(|) 1101 1000
-----------------
1111 1001
3. 異或運算:
不同的時候是1
1011 0001
xor(^) 1101 1000
-----------------
0110 1001
4. 非運算:
0就是1,1就是0
not(~) 1101 1000
-----------------
0010 0111
5. 左移:
各二進位所有左移若干位,高位丟棄,低位補0
shl(<<)
1101 1000 左移2位爲:0110 0000
6. 右移(略複雜):分兩種狀況
各二進位所有右移若干位,低位丟棄,高位補0或者補符號位
shr 1101 0101 -> 0011 0101
對應C語言(>>)
unsigned int a = 10
printf("%d\n",a>>2);
----------------
sar 1101 0101 -> 1111 0101
對應C語言(>>)
int a = 10;
printf("%d\n",a>>2);
7. 總結:計算機只會作位運算,沒法直接作加減乘除。加密
7. 經過位運算實現加減乘除:
1. 加法:先異或,再與(與後作左移)。再將兩個結果異或,直到與運算結果爲0爲止操作系統
2. 減法,至關於加法
4 - 5 = 4 + (-5)視頻
3. 乘法:X * Y,乘法的本質是加法(x個y)htm
4. 除法:本質是減法,X/Y表示X能減去多少個Y