匯編基礎(chǔ)(一)

語言的發(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è)備上是這樣的過程:

匯編.png
  • 匯編語言機(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)的
APP/程序的執(zhí)行過程.png

總線

CPU
  • 每一個(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)存

各類存儲(chǔ)區(qū)的邏輯連接
各類存儲(chǔ)器的邏輯連接-物理地址對(duì)應(yīng)圖
各類存儲(chǔ)器的物理地址情況
  • 內(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)部部件之間由總線連接

CPU的典型構(gòu)成

  • 對(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位寄存器中

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容