新聞中心
匯編語(yǔ)言是一種用于計(jì)算機(jī)指令的逐條翻譯的程序設(shè)計(jì)語(yǔ)言。它是一種底層語(yǔ)言,離硬件更近,因此常用于編寫(xiě)操作系統(tǒng)、驅(qū)動(dòng)程序和嵌入式系統(tǒng)等。Linux作為一種開(kāi)源操作系統(tǒng),自然可以支持匯編語(yǔ)言編程。

10年積累的成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先制作網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有紅橋免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
但由于匯編語(yǔ)言編程需要對(duì)硬件架構(gòu)和指令集非常熟悉,因此對(duì)于初學(xué)者來(lái)說(shuō),學(xué)習(xí)起來(lái)可能會(huì)比較困難。本篇文章旨在給大家提供一份,幫助大家盡快掌握匯編語(yǔ)言編程。
之一步:安裝匯編器
在Linux下,我們通常使用GNU Assembler(簡(jiǎn)稱GAS)來(lái)編寫(xiě)匯編語(yǔ)言。因此,我們需要先安裝GAS。在Ubuntu上可以通過(guò)以下命令進(jìn)行安裝:
“`
sudo apt-get install build-essential
“`
上述命令安裝了編譯器和鏈接器等工具集,在其中就包括了GAS。
第二步:了解匯編語(yǔ)言基礎(chǔ)
了解匯編語(yǔ)言的基礎(chǔ)知識(shí)是我們學(xué)習(xí)匯編語(yǔ)言編程的首要步驟。匯編語(yǔ)言與高級(jí)語(yǔ)言不同,它直接操作計(jì)算機(jī)的硬件資源,因此需要對(duì)CPU架構(gòu)、內(nèi)存布局、指令集等有深入的了解。以下是一些匯編語(yǔ)言的基本概念:
– 操作碼:指令中操作的類型。
– 寄存器:CPU中用于存儲(chǔ)數(shù)據(jù)和指針的存儲(chǔ)器單元。
– 內(nèi)存地址:指定計(jì)算機(jī)內(nèi)存中的位置。
– 標(biāo)號(hào):匯編程序中標(biāo)識(shí)特定地址的符號(hào)。
– 段:內(nèi)存區(qū)域,包含代碼、數(shù)據(jù)和堆棧等。
– 棧:用于存儲(chǔ)函數(shù)局部變量和函數(shù)調(diào)用的返回地址。
初學(xué)者可以通過(guò)網(wǎng)上課程或圖書(shū)了解匯編語(yǔ)言基礎(chǔ),同時(shí)也可以嘗試從代碼示例中了解常用的指令和格式。
第三步:寫(xiě)一個(gè)簡(jiǎn)單的程序
接下來(lái),我們可以寫(xiě)一個(gè)簡(jiǎn)單的匯編程序來(lái)了解匯編語(yǔ)言的基本結(jié)構(gòu)和語(yǔ)法。下面是一個(gè)簡(jiǎn)單的程序,它的功能是在屏幕上輸出一行文字“Hello, world!”:
“`
section .data
message db ‘Hello, world!’, 0
section .text
global _start
_start:
mov eax, 4 ;輸出操作碼
mov ebx, 1 ;文件句柄
mov ecx, message ;要輸出的字符串
mov edx, 13 ;字符串長(zhǎng)度
int 0x80 ;調(diào)用Linux內(nèi)核進(jìn)行操作
mov eax, 1 ;退出操作碼
xor ebx, ebx ;退出代碼
int 0x80 ;調(diào)用Linux內(nèi)核進(jìn)行操作
“`
以上代碼中,`.data`和`.text`是程序的兩個(gè)段,分別用于存放數(shù)據(jù)和代碼。`message`是一個(gè)字符串常量,它用`db`指令定義。`_start`是程序的入口點(diǎn),也就是代碼段的之一行指令。程序輸出的過(guò)程是通過(guò)`mov`指令將輸出字符串的信息傳遞給Linux內(nèi)核完成的。
第四步:測(cè)試程序
我們?cè)谕瓿沙绦蚓帉?xiě)后,需要測(cè)試程序是否能夠正常工作。以下是一個(gè)簡(jiǎn)單的測(cè)試過(guò)程:
1. 將程序保存為`hello.a`文件。
2. 執(zhí)行以下命令將程序匯編成二進(jìn)制文件:
“`
na -f elf64 hello.a -o hello.o
“`
上述命令對(duì)程序進(jìn)行了匯編,生成了一個(gè)ELF格式的目標(biāo)文件。
3. 執(zhí)行以下命令進(jìn)行鏈接,將目標(biāo)文件與Linux庫(kù)文件鏈接:
“`
ld hello.o -o hello
“`
上述命令將目標(biāo)文件與Linux系統(tǒng)庫(kù)文件進(jìn)行鏈接,并生成了一個(gè)可執(zhí)行文件。
4. 執(zhí)行以下命令運(yùn)行程序:
“`
./hello
“`
如果程序沒(méi)有出現(xiàn)錯(cuò)誤,那么在終端就能看到“Hello, world!”這句話被輸出。
本篇文章介紹了,包括安裝匯編器、了解匯編語(yǔ)言基礎(chǔ)、編寫(xiě)一個(gè)簡(jiǎn)單程序以及測(cè)試程序等步驟。匯編語(yǔ)言相比高級(jí)語(yǔ)言更接近底層,因此對(duì)于程序員來(lái)說(shuō)是必備的技能之一。通過(guò)掌握匯編語(yǔ)言基礎(chǔ)知識(shí),初學(xué)者可以逐步提高對(duì)計(jì)算機(jī)硬件的理解和掌握,從而能夠編寫(xiě)更為底層的程序。
相關(guān)問(wèn)題拓展閱讀:
- 如何在64位的Linux系統(tǒng)上使用匯編和C語(yǔ)言混
如何在64位的Linux系統(tǒng)上使用匯編和C語(yǔ)言混
編譯和鏈接的時(shí)候使用的指令:(AMD處理器,64位操作系統(tǒng))
編譯鏈接指令
1 na -f elf foo.s -o foo.o
2 gcc -c bar.c -o bar.o
3 ld -s -o foobar bar.o foo.o
匯編語(yǔ)言用na編寫(xiě)并用na編譯器編譯,而C語(yǔ)言用的是gcc編譯,這些都沒(méi)有問(wèn)題,但是在鏈接的時(shí)候出錯(cuò)了,提示如下:
ld: i386 architecture of input file `foo.o’ is incompatible with i386:x86-64 output
google了一下,意思就是na 編譯產(chǎn)生的是32位的目標(biāo)代碼,gcc 在64位平臺(tái)上默認(rèn)產(chǎn)生的是64位的目標(biāo)代碼,這兩者在鏈接的時(shí)候出錯(cuò),gcc在64位平臺(tái)上默認(rèn)以64位的方式鏈接。
這樣在解決的時(shí)候就會(huì)有兩種解決方案:
讓gcc 產(chǎn)生32位的代碼,并在鏈接的時(shí)候以32位的方式進(jìn)行鏈接
在這種情況下只需要修改編譯和鏈接指令即可,具體如下:
32位的編譯鏈接指令
1 na -f elf foo.s -o foo.o
2 gcc -m32 -c bar.c -o bar.o
3 ld -m elf_i386 -s -o foobar foo.o bar.o
具體的-m32 和 -m elf_i386 請(qǐng)自行查閱gcc (man gcc)
如果你是高版本的gcc(可能是由于更新內(nèi)核造成的),可能簡(jiǎn)單的使用-m32 的時(shí)候會(huì)提示以下錯(cuò)誤(使用別人的歷程,自己未曾遇到):
> In file included from /usr/include/stdio.h:28:0,
> from test.c:1:
> /usr/include/features.h:323:26: fatal error: bits/predefs.h: No such file or directory
> compilation terminated.
這應(yīng)該是缺少構(gòu)建32 位可執(zhí)行程序缺少的包,使用以下指令安裝:
sudo apt-get install libc6-dev-i386
此時(shí)應(yīng)該就沒(méi)有什么問(wèn)題了。
編譯和鏈接的時(shí)候使用的指令:(AMD處理器,64位操作系統(tǒng))
編譯鏈接指令
1 na -f elf foo.s -o foo.o
2 gcc -c bar.c -o bar.o
3 ld -s -o foobar bar.o foo.o
匯編語(yǔ)數(shù)如言用na編寫(xiě)并用na編譯器編譯,而C語(yǔ)言用的是gcc編譯,這些都沒(méi)有問(wèn)題,但是在鏈接的時(shí)候出錯(cuò)了,提示如下:
ld: i386 architecture of input file `foo.o’ is incompatible with i386:x86-64 output
google了一下,意思就是na 編譯產(chǎn)生的是32位的目標(biāo)代碼,gcc 在64位平臺(tái)上默認(rèn)產(chǎn)生的是64位的目標(biāo)代碼,這兩者在鏈接的時(shí)候出錯(cuò),gcc在64位平臺(tái)上默認(rèn)以64位的方式鏈接。
這樣在解決的時(shí)候就會(huì)有兩種解決方案:
讓gcc 產(chǎn)生32位的代碼,并在鏈接的時(shí)候以32位的方式進(jìn)行鏈接
在這種情況下只需要修滑正改編譯和鏈接指令即可,具體如下:
32位的編譯鏈接指令
1 na -f elf foo.s -o foo.o
2 gcc -m32 -c bar.c -o bar.o
3 ld -m elf_i386 -s -o foobar foo.o bar.o
具體的-m32 和 -m elf_i386 請(qǐng)自行查閱gcc (man gcc)
如果你是高版本的gcc(可能是由于更新內(nèi)核造成的),可能簡(jiǎn)單的使用-m32 的時(shí)候會(huì)提示以下錯(cuò)誤(使用別人的歷程,自己薯讓啟未曾遇到):
> In file included from /usr/include/stdio.h:28:0,
> from test.c:1:
> /usr/include/features.h:323:26: fatal error: bits/predefs.h: No such file or directory
> compilation terminated.
這應(yīng)該是缺少構(gòu)建32 位可執(zhí)行程序缺少的包,使用以下指令安裝:
sudo apt-get install libc6-dev-i386
此時(shí)應(yīng)該就沒(méi)有什么問(wèn)題了。
編譯和鏈接的時(shí)候使用的指令:(AMD處理器,64位操作系統(tǒng))
編譯鏈接指令
1 na -f elf foo.s -o foo.o
2 gcc -c bar.c -o bar.o
3 ld -s -o foobar bar.o foo.o
匯編語(yǔ)言用na編寫(xiě)并用na編譯器編譯,而C語(yǔ)言用的是gcc編譯,這些都沒(méi)有問(wèn)題,但是在鏈接的時(shí)候出錯(cuò)了,提示如下:
ld: i386 architecture of input file `foo.o’ is incompatible with i386:x86-64 output
google了一下,意思就是na 編譯產(chǎn)生的是32位的目標(biāo)代碼,gcc 在64位平臺(tái)上默認(rèn)產(chǎn)生的是64位的目標(biāo)代碼,這兩者在鏈接的時(shí)候出錯(cuò),gcc在64位平臺(tái)上默認(rèn)以64位的方式鏈銀缺蠢接。
這樣在解決的時(shí)候就會(huì)有兩種解決方案:
讓gcc 產(chǎn)生32位的代碼,并在鏈接的時(shí)候以32位的方式進(jìn)行鏈接
在這種情況下只需要修改編譯和鏈接指令即可,具體如下:
32位的編譯鏈接指令
1 na -f elf foo.s -o foo.o
2 gcc -m32 -c bar.c -o bar.o
3 ld -m elf_i386 -s -o foobar foo.o bar.o
具體的-m32 和 -m elf_i386 請(qǐng)自行查閱gcc (man gcc)
如果你是高版本的gcc(可能是由于更新內(nèi)核造成的扮枯),可能簡(jiǎn)單的使用-m32 的時(shí)候會(huì)提示以下錯(cuò)誤(使用別人的歷程,自己未曾遇到):
> In file included from /usr/include/stdio.h:28:0,
> from test.c:1:
> /usr/include/鋒陪features.h:323:26: fatal error: bits/predefs.h: No such file or directory
> compilation terminated.
這應(yīng)該是缺少構(gòu)建32 位可執(zhí)行程序缺少的包,使用以下指令安裝:
sudo apt-get install libc6-dev-i386
關(guān)于linux下的匯編的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都服務(wù)器托管選創(chuàng)新互聯(lián),先上架開(kāi)通再付費(fèi)。
創(chuàng)新互聯(lián)(www.cdcxhl.com)專業(yè)-網(wǎng)站建設(shè),軟件開(kāi)發(fā)老牌服務(wù)商!微信小程序開(kāi)發(fā),APP開(kāi)發(fā),網(wǎng)站制作,網(wǎng)站營(yíng)銷推廣服務(wù)眾多企業(yè)。電話:028-86922220
網(wǎng)頁(yè)題目:Linux下的匯編編程指南 (linux下的匯編)
網(wǎng)頁(yè)地址:http://m.5511xx.com/article/coihcjd.html


咨詢
建站咨詢
