語言的發(fā)展
機(jī)器語言: 由0和1組成的機(jī)器指令. 如:0101 0001 1101 0110
匯編語言(assembly language): 使用符號(hào)代替機(jī)器語言,也稱為符號(hào)語言,如:mov ax,bx
高級(jí)語言: C\C++\Java\OC\Swift,更加接近人類的自然語言 如:int a = b;
我們的代碼在終端設(shè)備上是這樣的過程:

- 匯編語言與機(jī)器語言一一對(duì)應(yīng),每一條機(jī)器指令都有與之對(duì)應(yīng)的匯編指令
- 匯編語言可以通過編譯得到機(jī)器語言,機(jī)器語言可以通過反匯編得到匯編語言
- 高級(jí)語言可以通過編譯得到匯編語言 \ 機(jī)器語言,但匯編語言\機(jī)器語言幾乎不可能還原成高級(jí)語言
匯編語言的特點(diǎn)
可以直接訪問、控制各種硬件設(shè)備,比如存儲(chǔ)器、CPU等,能最大限度地發(fā)揮硬件的功能
能夠不受編譯器的限制,對(duì)生成的二進(jìn)制代碼進(jìn)行完全的控制
目標(biāo)代碼簡(jiǎn)短,占用內(nèi)存少,執(zhí)行速度快
匯編指令是機(jī)器指令的助記符,同機(jī)器指令一一對(duì)應(yīng)。每一種CPU都有自己的機(jī)器指令集\匯編指令集,所以匯編語言不具備可移植性
知識(shí)點(diǎn)過多,開發(fā)者需要對(duì)CPU等硬件結(jié)構(gòu)有所了解,不易于編寫、調(diào)試、維護(hù)
不區(qū)分大小寫,比如mov和MOV是一樣的
匯編的用途
- 編寫驅(qū)動(dòng)程序、操作系統(tǒng)(比如Linux內(nèi)核的某些關(guān)鍵部分)
- 對(duì)性能要求極高的程序或者代碼片段,可與高級(jí)語言混合使用(內(nèi)聯(lián)匯編)
- 軟件安全,病毒分析與防治,逆向\加殼\脫殼\破解\外掛\免殺\加密解密\漏洞\黑客
- 理解整個(gè)計(jì)算機(jī)系統(tǒng)的最佳起點(diǎn)和最有效途徑
- 為編寫高效代碼打下基礎(chǔ)
- 弄清代碼的本質(zhì)
- 函數(shù)的本質(zhì)究竟是什么?
- sizeof
- ++a + ++a + ++a 底層如何執(zhí)行的?
- 編譯器到底幫我們干了什么?
- DEBUG模式和RELEASE模式有什么關(guān)鍵的地方被我們忽略
- ......
越底層越單純!真正的程序員都需要了解的一門非常重要的語言,匯編!
匯編語言的種類
- 目前討論比較多的匯編語言有
- 8086匯編(8086處理器是16bit的CPU)
- Win32匯編
- Win64匯編
- ARM匯編(嵌入式、Mac、iOS)
- ......
- 我們iPhone里面用到的是ARM匯編,但是不同的設(shè)備也有差異.因CPU的架構(gòu)不同.
| 架構(gòu) | 設(shè)備 |
|---|---|
| armv6 | iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch |
| armv7 | iPhone3GS, iPhone4, iPhone4S,iPad, iPad2, iPad3(The New iPad), iPad mini, iPod Touch 3G, iPod Touch4 |
| armv7s | iPhone5, iPhone5C, iPad4(iPad with Retina Display) |
| arm64 | iPhone6s , iphone6s plus,iPhone6, iPhone6 plus,iPhone5S ,iPad Air, iPad mini2 |
- 因?yàn)閷W(xué)習(xí)所以建議先從最為經(jīng)典的8086開始
- 結(jié)構(gòu)簡(jiǎn)潔,容易理解
- 指令簡(jiǎn)單,便于記憶
- 原理相通
幾個(gè)必要的常識(shí)
- 要想學(xué)好匯編,首先需要了解CPU等硬件結(jié)構(gòu)
- APP/程序的執(zhí)行過程
- 硬件相關(guān)最為重要是CPU/內(nèi)存
- 在匯編中,大部分指令都是和CPU與內(nèi)存相關(guān)的

總線

- 每一個(gè)CPU芯片都有許多管腳,這些管腳和總線相連,CPU通過總線跟外部器件進(jìn)行交互
- 總線:一根根導(dǎo)線的集合
- 總線的分類 1.地址總線 2.數(shù)據(jù)總線 3.控制總線
舉個(gè)例子

-
地址總線
- 它的寬度決定了CPU的尋址能力
- 8086的地址總線寬度是20,所以尋址能力是1M( 2^20 )
0x00000000000000000000 最小地址
0x111111111111111111111最大地址 間隔2^20
-
數(shù)據(jù)總線
- 它的寬度決定了CPU的單次數(shù)據(jù)傳送量,也就是數(shù)據(jù)傳送速度
- 8086的數(shù)據(jù)總線寬度是16,所以單次最大傳遞2個(gè)字節(jié)的數(shù)據(jù)
8088的數(shù)據(jù)總線寬度是8,8086的數(shù)據(jù)總線寬度是16,分別向內(nèi)存中寫入89D8H如下圖:注意:這里是16進(jìn)制,后方的H是單詞Hexadecimal的意思


-
控制總線
- 它的寬度決定了CPU對(duì)其他器件的控制能力、能有多少種控制
做個(gè)小練習(xí)

內(nèi)存



內(nèi)存地址空間的大小受CPU地址總線寬度的限制。8086的地址總線寬度為20,可以定位2^20個(gè)不同的內(nèi)存單元(內(nèi)存地址范圍0x00000~0xFFFFF),所以8086的內(nèi)存空間大小為1MB
0x00000~0x9FFFF:主存儲(chǔ)器??勺x可寫
0xA0000~0xBFFFF:向顯存中寫入數(shù)據(jù),這些數(shù)據(jù)會(huì)被顯卡輸出到顯示器。可讀可寫
0xC0000~0xFFFFF:存儲(chǔ)各種硬件\系統(tǒng)信息。只讀
寄存器
內(nèi)部部件之間由總線連接

- 對(duì)程序員來說,CPU中最主要部件是寄存器,可以通過改變寄存器的內(nèi)容來實(shí)現(xiàn)對(duì)CPU的控制
- 不同的CPU,寄存器的個(gè)數(shù)、結(jié)構(gòu)是不相同的(8086是16位結(jié)構(gòu)的CPU)
- 8086有14個(gè)寄存器
- 都是16位的寄存器
-
可以存放2個(gè)字節(jié)
8086內(nèi)部寄存器
通用寄存器
AX、BX、CX、DX這4個(gè)寄存器通常用來存放一般性的數(shù)據(jù),稱為通用寄存器(有時(shí)也有特定用途),通常,CPU會(huì)先將內(nèi)存中的數(shù)據(jù)存儲(chǔ)到通用寄存器中,然后再對(duì)通用寄存器中的數(shù)據(jù)進(jìn)行運(yùn)算
假設(shè)內(nèi)存中有塊紅色內(nèi)存空間的值是3,現(xiàn)在想把它的值加1,并將結(jié)果存儲(chǔ)到藍(lán)色內(nèi)存空間
* CPU首先會(huì)將紅色內(nèi)存空間的值放到AX寄存器中:mov ax,紅色內(nèi)存空間
* 然后讓AX寄存器與1相加:add ax,1
* 最后將值賦值給內(nèi)存空間:mov 藍(lán)色內(nèi)存空間,ax
AX、BX、CX、DX這4個(gè)通用寄存器都是16位的,上一代8086的寄存器都是8位的,為了保證兼容, AX、BX、CX、DX都可分為2個(gè)獨(dú)立的8位寄存器來使用
* H代表高位寄存器
* L代表低位寄存器

字和字節(jié)
在匯編的數(shù)據(jù)存儲(chǔ)中,有2個(gè)比較常用的單位
字節(jié):byte,1個(gè)字節(jié)由8bit組成,可以存儲(chǔ)在8位寄存器中
字:word,1個(gè)字由2個(gè)字節(jié)組成,這2個(gè)字節(jié)分別稱為字的高字節(jié)和低字節(jié)
-
比如數(shù)據(jù)20000(4E20H,0100111000100000B),高字節(jié)的值是78,低字節(jié)的值是32
1個(gè)字可以存在1個(gè)16位寄存器中,這個(gè)字的高字節(jié)、低字節(jié)分別存儲(chǔ)在這個(gè)寄存器的高8位寄存器、低8位寄存器中


