匯(hui)編語(yu)(yu)言(yan)(yan)(Assembly Language)是任何一(yi)種用于電子(zi)計算機(ji)、微(wei)處理器(qi)、微(wei)控制器(qi)或(huo)其他可編程器(qi)件的(de)(de)低級語(yu)(yu)言(yan)(yan),亦(yi)稱為符號(hao)語(yu)(yu)言(yan)(yan)。在匯(hui)編語(yu)(yu)言(yan)(yan)中,用助記符代替機(ji)器(qi)指(zhi)(zhi)令(ling)(ling)的(de)(de)操(cao)作(zuo)碼,用地址符號(hao)或(huo)標號(hao)代替指(zhi)(zhi)令(ling)(ling)或(huo)操(cao)作(zuo)數(shu)的(de)(de)地址。在不同的(de)(de)設備中,匯(hui)編語(yu)(yu)言(yan)(yan)對應(ying)著(zhu)不同的(de)(de)機(ji)器(qi)語(yu)(yu)言(yan)(yan)指(zhi)(zhi)令(ling)(ling)集(ji),通(tong)過匯(hui)編過程轉換成機(ji)器(qi)指(zhi)(zhi)令(ling)(ling)。特定(ding)的(de)(de)匯(hui)編語(yu)(yu)言(yan)(yan)和特定(ding)的(de)(de)機(ji)器(qi)語(yu)(yu)言(yan)(yan)指(zhi)(zhi)令(ling)(ling)集(ji)是一(yi)一(yi)對應(ying)的(de)(de),不同平(ping)臺(tai)之(zhi)間不可直接移植。
匯編(bian)語(yu)(yu)(yu)言(yan)(yan),即第(di)二(er)代計(ji)算(suan)機(ji)語(yu)(yu)(yu)言(yan)(yan),用一些容易理解和(he)(he)(he)記憶(yi)的(de)(de)(de)(de)縮寫單詞來代替一些特定(ding)的(de)(de)(de)(de)指(zhi)令(ling),例如(ru):用"ADD"代表(biao)加法操作(zuo)指(zhi)令(ling),"SUB"代表(biao)減法操作(zuo)指(zhi)令(ling),以(yi)及(ji)"INC"代表(biao)增加1,"DEC"代表(biao)減去1,"MOV"代表(biao)變(bian)(bian)量傳遞(di)等等,通(tong)過這種方(fang)法,人們(men)很(hen)容易去閱讀(du)已經完(wan)成的(de)(de)(de)(de)程(cheng)序(xu)或者理解程(cheng)序(xu)正在(zai)執行(xing)(xing)的(de)(de)(de)(de)功能(neng),對現有(you)程(cheng)序(xu)的(de)(de)(de)(de)bug修復以(yi)及(ji)運營維護都變(bian)(bian)得更加簡(jian)單方(fang)便。但(dan)計(ji)算(suan)機(ji)的(de)(de)(de)(de)硬(ying)件不認(ren)識(shi)字母符(fu)(fu)號,這時候(hou)就(jiu)需(xu)要一個專門的(de)(de)(de)(de)程(cheng)序(xu)把這些字符(fu)(fu)變(bian)(bian)成計(ji)算(suan)機(ji)能(neng)夠識(shi)別的(de)(de)(de)(de)二(er)進制數(shu)或機(ji)器(qi)(qi)語(yu)(yu)(yu)言(yan)(yan)。因為匯編(bian)語(yu)(yu)(yu)言(yan)(yan)只是將(jiang)機(ji)器(qi)(qi)語(yu)(yu)(yu)言(yan)(yan)做了(le)簡(jian)單編(bian)譯,所以(yi)并(bing)沒有(you)根本(ben)上解決機(ji)器(qi)(qi)語(yu)(yu)(yu)言(yan)(yan)的(de)(de)(de)(de)特定(ding)性(xing),所以(yi)匯編(bian)語(yu)(yu)(yu)言(yan)(yan)和(he)(he)(he)機(ji)器(qi)(qi)自(zi)身(shen)的(de)(de)(de)(de)編(bian)程(cheng)環境息息相關,推廣和(he)(he)(he)移植很(hen)難,但(dan)是還是保持了(le)機(ji)器(qi)(qi)語(yu)(yu)(yu)言(yan)(yan)優秀的(de)(de)(de)(de)執行(xing)(xing)效(xiao)率,因為他(ta)(ta)的(de)(de)(de)(de)可閱讀(du)性(xing)和(he)(he)(he)簡(jian)便性(xing),匯編(bian)語(yu)(yu)(yu)言(yan)(yan)到現在(zai)依然是常用的(de)(de)(de)(de)編(bian)程(cheng)語(yu)(yu)(yu)言(yan)(yan)之一。匯編(bian)語(yu)(yu)(yu)言(yan)(yan)不像其他(ta)(ta)大(da)多數(shu)的(de)(de)(de)(de)程(cheng)序(xu)設計(ji)語(yu)(yu)(yu)言(yan)(yan)一樣(yang)被廣泛用于(yu)程(cheng)序(xu)設計(ji)。在(zai)今天的(de)(de)(de)(de)實(shi)(shi)際應用中,它通(tong)常被應用在(zai)底(di)層,硬(ying)件操作(zuo)和(he)(he)(he)高要求的(de)(de)(de)(de)程(cheng)序(xu)優化(hua)的(de)(de)(de)(de)場合。驅(qu)動程(cheng)序(xu)、嵌入式操作(zuo)系統和(he)(he)(he)實(shi)(shi)時運行(xing)(xing)程(cheng)序(xu)都需(xu)要匯編(bian)語(yu)(yu)(yu)言(yan)(yan)。
自從(cong)1946年世(shi)界上第一臺(tai)電子(zi)計算機問世(shi),人類和機器(qi)的(de)(de)(de)交流(liu)方式和語(yu)(yu)(yu)言(yan)(yan)(yan)就成(cheng)為了(le)軟(ruan)件工程(cheng)師(shi)(shi)和計算機從(cong)業者的(de)(de)(de)主要研究方向,更有效更簡便的(de)(de)(de)編(bian)(bian)(bian)程(cheng)語(yu)(yu)(yu)言(yan)(yan)(yan)成(cheng)為了(le)軟(ruan)件工程(cheng)師(shi)(shi)的(de)(de)(de)新寵兒,伴隨(sui)著計算機的(de)(de)(de)飛(fei)速發展,計算機的(de)(de)(de)硬件升級速度也越(yue)來越(yue)快,對編(bian)(bian)(bian)程(cheng)語(yu)(yu)(yu)言(yan)(yan)(yan)的(de)(de)(de)要求(qiu)(qiu)也日益(yi)嚴格。在(zai)過去的(de)(de)(de)幾十年,編(bian)(bian)(bian)程(cheng)語(yu)(yu)(yu)言(yan)(yan)(yan)有了(le)長足的(de)(de)(de)發展,至今已經(jing)有四代(dai)語(yu)(yu)(yu)言(yan)(yan)(yan)問世(shi)。大量(liang)的(de)(de)(de)編(bian)(bian)(bian)程(cheng)語(yu)(yu)(yu)言(yan)(yan)(yan)為了(le)滿(man)足不同領域的(de)(de)(de)編(bian)(bian)(bian)程(cheng)要求(qiu)(qiu)和軟(ruan)件功(gong)能(neng)(neng),經(jing)歷了(le)被(bei)修改,被(bei)取(qu)代(dai),被(bei)發展等過程(cheng),最終發展成(cheng)了(le)現(xian)在(zai)編(bian)(bian)(bian)程(cheng)語(yu)(yu)(yu)言(yan)(yan)(yan)的(de)(de)(de)多樣化。盡管人們多次試圖尋找一個能(neng)(neng)夠適應所有編(bian)(bian)(bian)程(cheng)環(huan)境的(de)(de)(de)通用語(yu)(yu)(yu)言(yan)(yan)(yan),但是卻沒有一次成(cheng)功(gong)。程(cheng)序設計語(yu)(yu)(yu)言(yan)(yan)(yan)正在(zai)與現(xian)代(dai)科技日益(yi)飛(fei)躍,人類的(de)(de)(de)智慧在(zai)日益(yi)彰顯(xian)。
計算(suan)機(ji)(ji)(ji)(ji)的(de)(de)硬(ying)件作為(wei)一種(zhong)電(dian)(dian)路(lu)元件,它的(de)(de)輸出和輸入只(zhi)(zhi)能(neng)是(shi)有電(dian)(dian)或(huo)者(zhe)(zhe)沒電(dian)(dian),也就(jiu)是(shi)所說的(de)(de)高(gao)電(dian)(dian)平(ping)和低(di)電(dian)(dian)平(ping),所以(yi)計算(suan)機(ji)(ji)(ji)(ji)傳遞的(de)(de)數據(ju)是(shi)由(you)(you)“0”和“1”組成的(de)(de)二(er)進(jin)制數,所以(yi)說二(er)進(jin)制的(de)(de)語(yu)(yu)(yu)(yu)(yu)言(yan)是(shi)計算(suan)機(ji)(ji)(ji)(ji)語(yu)(yu)(yu)(yu)(yu)言(yan)的(de)(de)本(ben)質。計算(suan)機(ji)(ji)(ji)(ji)發(fa)明之初,人們(men)為(wei)了(le)去(qu)控(kong)(kong)制計算(suan)機(ji)(ji)(ji)(ji)完(wan)成自(zi)己的(de)(de)任務或(huo)者(zhe)(zhe)項目(mu),只(zhi)(zhi)能(neng)去(qu)編(bian)寫“0”、“1”這樣(yang)的(de)(de)二(er)進(jin)制數字串(chuan)去(qu)控(kong)(kong)制電(dian)(dian)腦,其實就(jiu)是(shi)控(kong)(kong)制計算(suan)機(ji)(ji)(ji)(ji)硬(ying)件的(de)(de)高(gao)低(di)電(dian)(dian)平(ping)或(huo)通(tong)路(lu)開路(lu),這種(zhong)語(yu)(yu)(yu)(yu)(yu)言(yan)就(jiu)是(shi)機(ji)(ji)(ji)(ji)器(qi)語(yu)(yu)(yu)(yu)(yu)言(yan)。直觀上看(kan),機(ji)(ji)(ji)(ji)器(qi)語(yu)(yu)(yu)(yu)(yu)言(yan)十分晦(hui)澀難懂,其中的(de)(de)含義往(wang)往(wang)要(yao)通(tong)過查(cha)表或(huo)者(zhe)(zhe)手(shou)冊才能(neng)理解,使用(yong)的(de)(de)時候非(fei)常痛苦,尤(you)其當你(ni)需(xu)要(yao)修改已(yi)經完(wan)成的(de)(de)程(cheng)序時,這種(zhong)看(kan)起來無(wu)序的(de)(de)機(ji)(ji)(ji)(ji)器(qi)語(yu)(yu)(yu)(yu)(yu)言(yan)會(hui)讓你(ni)無(wu)從(cong)下手(shou),也很難找到程(cheng)序的(de)(de)錯誤(wu)。而且,不同(tong)計算(suan)機(ji)(ji)(ji)(ji)的(de)(de)運行環境不同(tong),指令方式操作方式也不盡相(xiang)同(tong),所以(yi)當你(ni)在這種(zhong)機(ji)(ji)(ji)(ji)器(qi)語(yu)(yu)(yu)(yu)(yu)言(yan)就(jiu)有了(le)特定性(xing),只(zhi)(zhi)能(neng)在特定的(de)(de)計算(suan)機(ji)(ji)(ji)(ji)上執行,而一旦(dan)換了(le)機(ji)(ji)(ji)(ji)器(qi)就(jiu)需(xu)要(yao)重新編(bian)程(cheng),這極大的(de)(de)降低(di)了(le)程(cheng)序的(de)(de)使用(yong)和推(tui)廣效率。但由(you)(you)于機(ji)(ji)(ji)(ji)器(qi)語(yu)(yu)(yu)(yu)(yu)言(yan)具有特定性(xing),完(wan)美適配特定型(xing)號的(de)(de)計算(suan)機(ji)(ji)(ji)(ji),故而運行效率遠遠高(gao)過其他(ta)語(yu)(yu)(yu)(yu)(yu)言(yan)。機(ji)(ji)(ji)(ji)器(qi)語(yu)(yu)(yu)(yu)(yu)言(yan),也就(jiu)是(shi)第一代編(bian)程(cheng)語(yu)(yu)(yu)(yu)(yu)言(yan)。
不難(nan)看出機(ji)器語(yu)(yu)言作為(wei)一種編(bian)程(cheng)(cheng)語(yu)(yu)言,靈活性(xing)較差可(ke)閱讀(du)性(xing)也很(hen)(hen)差,為(wei)了減輕機(ji)器語(yu)(yu)言帶給(gei)軟件(jian)工程(cheng)(cheng)師的(de)(de)(de)不適應,人們對機(ji)器語(yu)(yu)言進行了升級和改進:用一些容易理(li)解(jie)和記憶的(de)(de)(de)字母,單詞來代替一個特(te)定的(de)(de)(de)指令。通(tong)過這種方法,人們很(hen)(hen)容易去閱讀(du)已(yi)經完(wan)成(cheng)的(de)(de)(de)程(cheng)(cheng)序(xu)或者理(li)解(jie)程(cheng)(cheng)序(xu)正在(zai)執行的(de)(de)(de)功能(neng),對現有程(cheng)(cheng)序(xu)的(de)(de)(de)bug修復以及運營維護都變得(de)更加簡單方便,這種語(yu)(yu)言就(jiu)是我們所說(shuo)的(de)(de)(de)匯編(bian)語(yu)(yu)言,即第二代計算機(ji)語(yu)(yu)言。
比起(qi)機(ji)器(qi)語(yu)言,匯(hui)編語(yu)言具(ju)有更高(gao)的(de)機(ji)器(qi)相關性,更加便于記(ji)憶和書寫,但又同時保留了(le)機(ji)器(qi)語(yu)言高(gao)速度和高(gao)效率的(de)特點。匯(hui)編語(yu)言仍是面向機(ji)器(qi)的(de)語(yu)言,很(hen)難從其(qi)代碼上理解程序(xu)設計(ji)(ji)意圖,設計(ji)(ji)出來的(de)程序(xu)不易(yi)被(bei)(bei)移(yi)植(zhi),故不像其(qi)他大(da)多數的(de)高(gao)級(ji)計(ji)(ji)算機(ji)語(yu)言一樣被(bei)(bei)廣泛應(ying)用(yong)。所以(yi)在高(gao)級(ji)語(yu)言高(gao)度發展的(de)今天,它通常被(bei)(bei)用(yong)在底層,通常是程序(xu)優化或(huo)硬件操作的(de)場合。
在(zai)(zai)編(bian)程(cheng)(cheng)語(yu)(yu)(yu)言(yan)(yan)(yan)(yan)(yan)(yan)經歷了(le)(le)(le)機(ji)(ji)器(qi)(qi)語(yu)(yu)(yu)言(yan)(yan)(yan)(yan)(yan)(yan),匯編(bian)語(yu)(yu)(yu)言(yan)(yan)(yan)(yan)(yan)(yan)等更新之后(hou),人(ren)(ren)們(men)發現了(le)(le)(le)限制程(cheng)(cheng)序推廣(guang)的(de)(de)(de)(de)(de)關鍵因素(su)——程(cheng)(cheng)序的(de)(de)(de)(de)(de)可移植性。需(xu)要(yao)設計(ji)(ji)一個(ge)能夠不(bu)依(yi)賴于(yu)計(ji)(ji)算(suan)(suan)機(ji)(ji)硬件,能夠在(zai)(zai)不(bu)同機(ji)(ji)器(qi)(qi)上運行的(de)(de)(de)(de)(de)程(cheng)(cheng)序。這(zhe)樣可以免(mian)去很(hen)多編(bian)程(cheng)(cheng)的(de)(de)(de)(de)(de)重復過程(cheng)(cheng),提高(gao)效率,同時(shi)這(zhe)種語(yu)(yu)(yu)言(yan)(yan)(yan)(yan)(yan)(yan)又要(yao)接近(jin)于(yu)數學語(yu)(yu)(yu)言(yan)(yan)(yan)(yan)(yan)(yan)或人(ren)(ren)的(de)(de)(de)(de)(de)自然語(yu)(yu)(yu)言(yan)(yan)(yan)(yan)(yan)(yan)。在(zai)(zai)計(ji)(ji)算(suan)(suan)機(ji)(ji)還很(hen)稀缺的(de)(de)(de)(de)(de)50年(nian)代(dai),誕生(sheng)了(le)(le)(le)第一個(ge)高(gao)級編(bian)程(cheng)(cheng)語(yu)(yu)(yu)言(yan)(yan)(yan)(yan)(yan)(yan)。當時(shi)計(ji)(ji)算(suan)(suan)機(ji)(ji)的(de)(de)(de)(de)(de)造(zao)價不(bu)菲(fei),但是每天的(de)(de)(de)(de)(de)計(ji)(ji)算(suan)(suan)量(liang)又有(you)限,如(ru)何有(you)效的(de)(de)(de)(de)(de)利用計(ji)(ji)算(suan)(suan)機(ji)(ji)有(you)限的(de)(de)(de)(de)(de)計(ji)(ji)算(suan)(suan)能力成為(wei)了(le)(le)(le)當時(shi)人(ren)(ren)們(men)面對的(de)(de)(de)(de)(de)問題。同時(shi),因為(wei)資(zi)源(yuan)的(de)(de)(de)(de)(de)稀缺,計(ji)(ji)算(suan)(suan)機(ji)(ji)的(de)(de)(de)(de)(de)運行效率也成為(wei)了(le)(le)(le)那個(ge)年(nian)代(dai)工程(cheng)(cheng)師追尋的(de)(de)(de)(de)(de)目標。為(wei)了(le)(le)(le)更高(gao)效的(de)(de)(de)(de)(de)使(shi)用計(ji)(ji)算(suan)(suan)機(ji)(ji),人(ren)(ren)們(men)設計(ji)(ji)出了(le)(le)(le)高(gao)級編(bian)程(cheng)(cheng)語(yu)(yu)(yu)言(yan)(yan)(yan)(yan)(yan)(yan),來滿足(zu)人(ren)(ren)們(men)對于(yu)高(gao)效簡潔的(de)(de)(de)(de)(de)編(bian)程(cheng)(cheng)語(yu)(yu)(yu)言(yan)(yan)(yan)(yan)(yan)(yan)的(de)(de)(de)(de)(de)追求。
由于匯(hui)編指令(ling)系(xi)統(tong)龐(pang)大,因而(er)需構建(jian)指令(ling)系(xi)統(tong)體系(xi),其(qi)指令(ling)數量龐(pang)大,格式(shi)復雜,可記憶性差(cha)等。指令(ling)中最難(nan)的(de)(de)是(shi)指令(ling)所支持的(de)(de)尋(xun)址方式(shi),其(qi)實質就(jiu)是(shi)指令(ling)中操作數如(ru)何(he)獲(huo)取。對(dui)于處理(li)(li)器而(er)言(yan),就(jiu)是(shi)如(ru)何(he)找到他所需的(de)(de)數據。但(dan)對(dui)于計算機底層的(de)(de)匯(hui)編語言(yan)而(er)言(yan),這種尋(xun)址方式(shi)將涉及大量的(de)(de)計算存儲(chu)格式(shi),與復雜的(de)(de)存儲(chu)管理(li)(li)方式(shi)緊密相(xiang)關,因而(er)難(nan)以(yi)理(li)(li)解。最后,匯(hui)編指令(ling)還關系(xi)到如(ru)何(he)影響標志位,但(dan)處理(li)(li)器標志位非常復雜,因而(er)對(dui)其(qi)機制掌(zhang)握(wo)就(jiu)比(bi)較困難(nan)。
包(bao)括通用數據(ju)傳(chuan)送(song)指令MOV、條件傳(chuan)送(song)指令CMOVcc、堆棧(zhan)操(cao)作指令PUSH/PUSHA/PUSHAD/POP/POPA/POPAD、交換(huan)指令XCHG/XLAT/BSWAP、地址(zhi)或段描述符選擇子傳(chuan)送(song)指令LEA/LDS/LES/LFS/LGS/LSS等。
這部分指(zhi)令(ling)(ling)(ling)用于執(zhi)行(xing)算術和(he)邏輯運算,包括加法指(zhi)令(ling)(ling)(ling)ADD/ADC、減法指(zhi)令(ling)(ling)(ling)SUB/SBB、加一指(zhi)令(ling)(ling)(ling)INC、減一指(zhi)令(ling)(ling)(ling)DEC、比較操(cao)作指(zhi)令(ling)(ling)(ling)CMP、乘法指(zhi)令(ling)(ling)(ling)MUL/IMUL、除法指(zhi)令(ling)(ling)(ling)DIV/IDIV、符號擴展指(zhi)令(ling)(ling)(ling)CBW/CWDE/CDQE、十(shi)進制調整(zheng)指(zhi)令(ling)(ling)(ling)DAA/DAS/AAA/AAS、邏輯運算指(zhi)令(ling)(ling)(ling)NOT/AND/OR/XOR/TEST等。
這(zhe)部(bu)分指(zhi)(zhi)(zhi)令(ling)用(yong)于將寄存器或內存操作數(shu)移動指(zhi)(zhi)(zhi)定的次數(shu)。包(bao)括邏(luo)輯(ji)左(zuo)移指(zhi)(zhi)(zhi)令(ling)SHL、邏(luo)輯(ji)右移指(zhi)(zhi)(zhi)令(ling)SHR、算(suan)術左(zuo)移指(zhi)(zhi)(zhi)令(ling)SAL、算(suan)術右移指(zhi)(zhi)(zhi)令(ling)SAR、循環左(zuo)移指(zhi)(zhi)(zhi)令(ling)ROL、循環右移指(zhi)(zhi)(zhi)令(ling)ROR等。
這部分指(zhi)(zhi)令(ling)包括位測試(shi)(shi)指(zhi)(zhi)令(ling)BT、位測試(shi)(shi)并置(zhi)位指(zhi)(zhi)令(ling)BTS、位測試(shi)(shi)并復(fu)位指(zhi)(zhi)令(ling)BTR、位測試(shi)(shi)并取反(fan)指(zhi)(zhi)令(ling)BTC、位向(xiang)前(qian)掃描指(zhi)(zhi)令(ling)BSF、位向(xiang)后掃描指(zhi)(zhi)令(ling)BSR等。
這(zhe)部分包括無條件(jian)轉移指令(ling)(ling)(ling)JMP、條件(jian)轉移指令(ling)(ling)(ling)JCC/JCXZ、循環指令(ling)(ling)(ling)LOOP/LOOPE/LOOPNE、過程(cheng)調(diao)用(yong)指令(ling)(ling)(ling)CALL、子過程(cheng)返回指令(ling)(ling)(ling)RET、中斷指令(ling)(ling)(ling)INTn、INT3、INTO、IRET等(deng)。
這(zhe)部分指(zhi)(zhi)令(ling)(ling)用于對數據串(chuan)(chuan)(chuan)進(jin)行(xing)操作,包括(kuo)串(chuan)(chuan)(chuan)傳送(song)指(zhi)(zhi)令(ling)(ling)MOVS、串(chuan)(chuan)(chuan)比(bi)較(jiao)指(zhi)(zhi)令(ling)(ling)CMPS、串(chuan)(chuan)(chuan)掃描指(zhi)(zhi)令(ling)(ling)SCANS、串(chuan)(chuan)(chuan)加載指(zhi)(zhi)令(ling)(ling)LODS、串(chuan)(chuan)(chuan)保存指(zhi)(zhi)令(ling)(ling)STOS,這(zhe)些指(zhi)(zhi)令(ling)(ling)可以有選(xuan)擇地使用REP/REPE/REPZ/REPNE和REPNZ的前(qian)綴以連續操作。
這部分指(zhi)令(ling)用于同外圍設(she)備交換數據(ju),包(bao)括端口(kou)輸入指(zhi)令(ling)IN/INS、端口(kou)輸出指(zhi)令(ling)OUT/OUTS。
匯編語(yu)(yu)言(yan)是計算機提供給用戶的(de)最快最有(you)效的(de)語(yu)(yu)言(yan),也是能夠利用計算機的(de)所有(you)硬件(jian)特性并能夠直接(jie)控(kong)制硬件(jian)的(de)唯一(yi)語(yu)(yu)言(yan)。但(dan)是由于編寫和調(diao)試匯編語(yu)(yu)言(yan)程序要(yao)比(bi)高級語(yu)(yu)言(yan)復(fu)雜,因(yin)此目前其應用不(bu)如(ru)高級語(yu)(yu)言(yan)廣泛(fan)。
匯編語言比機器(qi)語言的(de)可(ke)讀(du)性(xing)要好,但跟(gen)高(gao)級語言比較(jiao)而(er)言,可(ke)讀(du)性(xing)還是(shi)(shi)較(jiao)差。不過(guo)采用(yong)(yong)(yong)它編寫的(de)程(cheng)序具有存(cun)儲空間占用(yong)(yong)(yong)少、執行速度快的(de)特點,這些(xie)是(shi)(shi)高(gao)級語言所(suo)無法(fa)取(qu)代的(de)。在實際應(ying)用(yong)(yong)(yong)中,是(shi)(shi)否使用(yong)(yong)(yong)匯編語言,取(qu)決(jue)于具體應(ying)用(yong)(yong)(yong)要求、開發時(shi)間和質量等方(fang)面作權衡(heng)。
匯(hui)編語言(yan)作(zuo)為機器語言(yan)之上(shang)的第二代編程語言(yan),它(ta)也有很多優點:
可以輕松的讀取存(cun)儲器狀態(tai)以及硬件(jian)I/O接口情況
編寫的(de)代碼因為少(shao)了很(hen)多編譯的(de)環(huan)節,可以能夠準(zhun)確的(de)被執(zhi)行
作(zuo)為一種低級語言,可擴展性很高
因為(wei)代碼非常單調,特殊(shu)指令(ling)字符很少,所以造成了代碼的冗(rong)長以及編(bian)寫的困難
因為匯(hui)編仍然需要自己去(qu)調用存儲(chu)器(qi)存儲(chu)數(shu)據,很(hen)容易(yi)出現BUG,而且調試起來也不容易(yi)
就算完成(cheng)了一個(ge)程(cheng)序,后期維護時候也需要耗費大量的時間。
因為機(ji)器的(de)特殊性造成(cheng)了代(dai)碼兼容性差的(de)缺陷。
匯編(bian)(bian)語言的(de)特(te)點是(shi)容易被計(ji)算機識別和執行(xing),使用(yong)它進(jin)行(xing)編(bian)(bian)程可以減少占用(yong)空(kong)間、提高運行(xing)速度,并(bing)能直接對硬件實施控(kong)(kong)制。在(zai)需(xu)要(yao)實時(shi)(shi)控(kong)(kong)制的(de)時(shi)(shi)候,有著(zhu)不(bu)可替(ti)代的(de)重要(yao)地位,但(dan)匯編(bian)(bian)語言在(zai)編(bian)(bian)程和理解時(shi)(shi)要(yao)復雜(za)、困難(nan)一(yi)些,尤其是(shi)在(zai)進(jin)行(xing)數據處理或是(shi)邏輯運算時(shi)(shi)更加凸顯出其劣(lie)勢。
高級語言(yan)(yan)是面向使用者(zhe)的(de)(de)語言(yan)(yan),能(neng)更準確地被程(cheng)(cheng)序員所理解,它的(de)(de)表達能(neng)力強,功能(neng)多(duo),編程(cheng)(cheng)效率高,上手速(su)度快(kuai),自(zi)動化程(cheng)(cheng)度高,因而更受歡迎(ying)。在(zai)大部分軟件(jian)開發中,使用者(zhe)都采用高級語言(yan)(yan)編程(cheng)(cheng),以提高編程(cheng)(cheng)效率。但在(zai)要求存儲空間小,執行(xing)速(su)度快(kuai),需直接對(dui)硬件(jian)進(jin)行(xing)控制(zhi)的(de)(de)場合,則應用匯編語言(yan)(yan)編程(cheng)(cheng),以達到優化程(cheng)(cheng)序速(su)度的(de)(de)目的(de)(de)。
這樣兩種看(kan)似(si)差別(bie)很(hen)大的(de)(de)語(yu)(yu)(yu)言(yan),它們之(zhi)(zhi)間又(you)有(you)著緊密的(de)(de)聯系。在一些程(cheng)(cheng)序(xu)設(she)計當中,如(ru)果把兩者結合(he)起來(lai)使(shi)用(yong),將兩種語(yu)(yu)(yu)言(yan)的(de)(de)優(you)勢同時發揮(hui)出來(lai),則可(ke)以(yi)(yi)解決很(hen)多(duo)特性難題。在許(xu)多(duo)程(cheng)(cheng)序(xu)的(de)(de)設(she)計當中,高(gao)(gao)(gao)級(ji)語(yu)(yu)(yu)言(yan)和匯(hui)編(bian)(bian)語(yu)(yu)(yu)言(yan)可(ke)以(yi)(yi)相互(hu)交叉(cha)調用(yong),進行參(can)數傳遞,共享(xiang)數據信息,這便(bian)是所謂的(de)(de)混合(he)編(bian)(bian)程(cheng)(cheng)。程(cheng)(cheng)序(xu)員往往在高(gao)(gao)(gao)級(ji)語(yu)(yu)(yu)言(yan)程(cheng)(cheng)序(xu)中直接嵌入匯(hui)編(bian)(bian)語(yu)(yu)(yu)句,以(yi)(yi)實現(xian)對硬件直接進行控制的(de)(de)功(gong)能(neng),這是混合(he)編(bian)(bian)程(cheng)(cheng)中常見的(de)(de)做法(fa)。也可(ke)以(yi)(yi)在高(gao)(gao)(gao)級(ji)語(yu)(yu)(yu)言(yan)程(cheng)(cheng)序(xu)中使(shi)用(yong)匯(hui)編(bian)(bian)語(yu)(yu)(yu)言(yan)中定義的(de)(de)變量和常量,或使(shi)用(yong)內(nei)部函數對匯(hui)編(bian)(bian)語(yu)(yu)(yu)句進行調用(yong)。簡而(er)言(yan)之(zhi)(zhi),這類混合(he)編(bian)(bian)程(cheng)(cheng)的(de)(de)方法(fa)可(ke)以(yi)(yi)讓高(gao)(gao)(gao)級(ji)語(yu)(yu)(yu)言(yan)與匯(hui)編(bian)(bian)語(yu)(yu)(yu)言(yan)互(hu)相取(qu)長補(bu)短,各自發揮(hui)各自優(you)勢,同時減(jian)少各自缺點所帶(dai)來(lai)的(de)(de)不(bu)便(bian),善用(yong)這個方法(fa)可(ke)以(yi)(yi)使(shi)開(kai)發和編(bian)(bian)程(cheng)(cheng)工作達到事半功(gong)倍(bei)的(de)(de)效果。
典型的(de)現(xian)代(dai)匯編器(Assembler)建造目標代(dai)碼(ma),由解譯(yi)(yi)組(zu)語指令(ling)集(ji)的(de)易記碼(ma)(Mnemonics)到操作碼(ma)(OpCode),并解析符號(hao)名稱(Symbolic Names)成(cheng)為(wei)存儲器地址以及其它的(de)實體(ti)。使用符號(hao)參考是(shi)匯編器的(de)一個(ge)重(zhong)要特征,它可以節省修改程(cheng)序后人工轉址的(de)乏味耗時計算(suan)。基本就是(shi)把機器碼(ma)變成(cheng)一些字(zi)母而已,編譯(yi)(yi)的(de)時候(hou)再把輸(shu)入的(de)指令(ling)字(zi)母替換成(cheng)為(wei)晦(hui)澀難懂(dong)機器碼(ma)。
用匯編(bian)語言等非機器(qi)(qi)語言書寫好的(de)符號程(cheng)(cheng)序稱為源(yuan)程(cheng)(cheng)序,匯編(bian)語言編(bian)譯器(qi)(qi)的(de)作用是(shi)將(jiang)源(yuan)程(cheng)(cheng)序翻譯成目(mu)(mu)標程(cheng)(cheng)序。目(mu)(mu)標程(cheng)(cheng)序是(shi)機器(qi)(qi)語言程(cheng)(cheng)序,當(dang)它被(bei)安置(zhi)在內存(cun)的(de)預定位置(zhi)上后(hou),就(jiu)能被(bei)計算機的(de)CPU處理和執行(xing)。
匯編的(de)調試環境總的(de)來說比(bi)較(jiao)少,也很(hen)少有非常好的(de)編譯(yi)器(qi)(qi)。編譯(yi)器(qi)(qi)的(de)選(xuan)擇依賴于目標處理器(qi)(qi)的(de)類型和具體的(de)系統平臺。一般來說,功能良好的(de)編譯(yi)器(qi)(qi)用(yong)起來應當(dang)(dang)非常方便,比(bi)如,應當(dang)(dang)可以自動整(zheng)理格(ge)式、語法高亮(liang)顯示,集編譯(yi)、鏈(lian)接(jie)和調試為一體,方便實用(yong)。
對(dui)于廣泛使(shi)用(yong)的(de)個(ge)人計(ji)算機(ji)來說,可以自由選擇的(de)匯(hui)(hui)編(bian)(bian)語言編(bian)(bian)譯(yi)(yi)器有MASM、NASM、TASM、GAS、FASM、RADASM等,但大都不具備調試功(gong)能。如果是(shi)為(wei)了學(xue)習(xi)匯(hui)(hui)編(bian)(bian)語言,輕松匯(hui)(hui)編(bian)(bian)因為(wei)擁有一(yi)個(ge)完善的(de)集(ji)成(cheng)環境,是(shi)一(yi)款非常適合初學(xue)者的(de)匯(hui)(hui)編(bian)(bian)編(bian)(bian)譯(yi)(yi)器。
隨著現代軟(ruan)件系(xi)統越來越龐大(da)復雜,大(da)量經過了封(feng)裝的(de)(de)高(gao)(gao)級語(yu)言(yan)(yan)如C/C++,Pascal/Object Pascal也應(ying)運而生。這些新的(de)(de)語(yu)言(yan)(yan)使得程序(xu)員在開發(fa)過程中(zhong)能夠更(geng)簡單,更(geng)有效(xiao)率(lv),使軟(ruan)件開發(fa)人員得以應(ying)付快速的(de)(de)軟(ruan)件開發(fa)的(de)(de)要求(qiu)。而匯編(bian)語(yu)言(yan)(yan)由(you)于(yu)其(qi)復雜性(xing)使得其(qi)適用(yong)(yong)(yong)領域逐步(bu)減小(xiao)。但這并不意味著匯編(bian)已無用(yong)(yong)(yong)武之地。由(you)于(yu)匯編(bian)更(geng)接(jie)近機器語(yu)言(yan)(yan),能夠直接(jie)對硬件進行(xing)操作,生成的(de)(de)程序(xu)與其(qi)他(ta)的(de)(de)語(yu)言(yan)(yan)相比(bi)具(ju)有更(geng)高(gao)(gao)的(de)(de)運行(xing)速度,占用(yong)(yong)(yong)更(geng)小(xiao)的(de)(de)內存(cun),因此(ci)在一些對于(yu)時效(xiao)性(xing)要求(qiu)很高(gao)(gao)的(de)(de)程序(xu)、許多大(da)型程序(xu)的(de)(de)核心模塊以及工業控制方面(mian)大(da)量應(ying)用(yong)(yong)(yong)。
雖(sui)然隨著半(ban)導(dao)體(ti)技(ji)術(shu)(shu)、編程技(ji)術(shu)(shu)的(de)不(bu)斷發展(zhan),在(zai)實際工程應用(yong)中確實很少看到匯(hui)編語言(yan)的(de)身影,但這并不(bu)能說明(ming)匯(hui)編語言(yan)沒用(yong),已被其他(ta)高級(ji)語言(yan)所取(qu)代。嵌入式(shi)系統(tong)的(de)底層驅動、計算(suan)(suan)機(ji)的(de)BIOS還是要(yao)用(yong)匯(hui)編語言(yan)實現。匯(hui)編語言(yan)是培(pei)養學生理解硬件資源的(de)語言(yan),是學習和理解其他(ta)高級(ji)程序設(she)計語言(yan)的(de)基(ji)礎(chu),是計算(suan)(suan)機(ji)組(zu)成原理、接口(kou)與通信技(ji)術(shu)(shu)、計算(suan)(suan)機(ji)控制技(ji)術(shu)(shu)和數據采集等許(xu)多專(zhuan)業課的(de)前導(dao)課程,是必要(yao)的(de)基(ji)礎(chu)知識,起(qi)著承(cheng)上啟下的(de)作用(yong)。