(2020.11.17 Tues)
指令instruction
計(jì)算機(jī)做的事其實(shí)很簡(jiǎn)單惯退,我們給CPU發(fā)出指令(instruction)赌髓,CPU會(huì)執(zhí)行基礎(chǔ)動(dòng)作。指令通常由一串二進(jìn)制的序列構(gòu)成。CPU會(huì)識(shí)別并執(zhí)行這些指令锁蠕。每款CPU都有一套指令集夷野,如ARM CPU使用的精簡(jiǎn)指令集。
一條指令能做的事很少荣倾,比如計(jì)算寄存器中兩個(gè)數(shù)的和悯搔,又如把內(nèi)存中的數(shù)據(jù)移入寄存器。寄存器(register)是CPU的臨時(shí)存儲(chǔ)空間舌仍。在樹(shù)莓派中妒貌,一個(gè)簡(jiǎn)單的要求,比如求和铸豁,也需要多條指令灌曙。
- 把內(nèi)存1號(hào)地址的數(shù)據(jù)放入寄存器a
- 把內(nèi)存2號(hào)地址的數(shù)據(jù)放入寄存器b
- 對(duì)寄存器a和寄存器b的數(shù)值求和,并放入寄存器a
- 把寄存器a的結(jié)果放入內(nèi)存3號(hào)地址
除了搬運(yùn)數(shù)據(jù)和計(jì)算节芥,CPU指令還可以控制計(jì)算機(jī)內(nèi)的其他硬件乃至外設(shè)在刺。早期程序員必須熟記CPU的指令集,用指令寫(xiě)程序头镊,需要把任務(wù)分解成一條條CPU可以直接理解的指令蚣驼,這樣的程序稱(chēng)為機(jī)器程序(machine code),機(jī)器程序可以用匯編語(yǔ)言(assembly language)編寫(xiě)拧晕。加法程序用匯編可以表示如下
MOV AX, [20H]
MOV BX, [10H]
ADD AX, BX
MOV [20H], AX
AX和BX代表了寄存器的兩個(gè)位置隙姿,[20h]和[10H]是內(nèi)存的兩個(gè)位置。
C程序和程序編譯
考慮到計(jì)算機(jī)經(jīng)常重復(fù)執(zhí)行某些特定任務(wù)厂捞,于是高級(jí)語(yǔ)言被發(fā)明出來(lái)输玷,用一些特殊的語(yǔ)法來(lái)抽象某些常見(jiàn)的指令組合。Linux系統(tǒng)的大部分程序靡馁,是用C語(yǔ)言這一高級(jí)語(yǔ)言寫(xiě)成的欲鹏。
C語(yǔ)言中包含了很多抽象語(yǔ)法,所以計(jì)算機(jī)不能直接理解C語(yǔ)言的語(yǔ)法臭墨。高級(jí)C語(yǔ)言必須首先編譯成匯編程序赔嚎,再轉(zhuǎn)成機(jī)器程序運(yùn)行。編譯C程序的指令如下
$gcc demo.c
編譯完成胧弛,當(dāng)前目錄下會(huì)出現(xiàn)一個(gè)a.out(默認(rèn)輸出)的二進(jìn)制可執(zhí)行文件尤误,運(yùn)行該文件
$./a.out
這里的a.out就是一個(gè)指令式的程序,是經(jīng)過(guò)編譯的结缚。用apt-get下載的應(yīng)用都是被編譯好的二進(jìn)制可執(zhí)行文件损晤。
如果apt-get沒(méi)能找到想要的軟件,需要從源代碼出發(fā)红竭,對(duì)程序進(jìn)行編譯尤勋。一般而言喘落,會(huì)有一個(gè)名為configure的腳本用于設(shè)置,編譯的第一步就是運(yùn)行這個(gè)腳本
$./configure
之后運(yùn)行make命令
$make
make命令會(huì)根據(jù)工程中的makefile來(lái)解析代碼文件之間的依賴(lài)關(guān)系最冰。通常來(lái)說(shuō)一個(gè)工程會(huì)包含多個(gè)C語(yǔ)言程序瘦棋。由于C語(yǔ)言可以跨文件的調(diào)用函數(shù)和變量,所以在編譯時(shí)暖哨,代碼文件之間相互依賴(lài)赌朋。make命令會(huì)根據(jù)依賴(lài)關(guān)系來(lái)編譯文件。
最后把編譯好的二進(jìn)制可執(zhí)行文件放到configure設(shè)定的目標(biāo)路徑中
$sudo make install
Reference
1 Vamei篇裁,周梓昕著箕慧,樹(shù)莓派開(kāi)始玩轉(zhuǎn)Linux,中國(guó)工信出版集團(tuán)茴恰,電子工業(yè)出版社