32汇编语言程序说明_Linux 汇编语言学习--编译和链接
上次我們提到了匯編語(yǔ)言的兩種格式,Intel 和 AT&T 格式,今天講的是對(duì)應(yīng)兩種編譯器的一些使用。
我們知道,編譯器就是一個(gè)將一種程序語(yǔ)言翻譯成另外一種語(yǔ)言的程序。編譯的過(guò)程其實(shí)共有5個(gè)流程:詞法分析、語(yǔ)法分析、語(yǔ)義分析和中間代碼生成、優(yōu)化、目標(biāo)代碼生成。具體是怎么實(shí)現(xiàn)的,有興趣的話,可以找一本好的《編譯原理》書(shū)看一看,順便自己也嘗試寫(xiě)一個(gè)編譯器。
對(duì)于匯編語(yǔ)言呢,不同平臺(tái)不同格式都有各自不同的編譯器,也有一些可以跨平臺(tái)的編譯器。那么上次我們提到的Intel 格式和AT&T格式匯編使用的編譯器是什么呢?
Linux 中編譯Intel 格式使用 Nasm, 編譯AT&T格式使用Gas。
下面以Hello World程序做個(gè)示范,為了區(qū)分格式,我們將Intel格式的匯編代碼文件后綴名寫(xiě)為.asm,而AT&T的寫(xiě)為.s.
Intel:
$> nasm -f elf hello.asm或者
$> nasm -f elf64 hello.asm上面的兩條命令都會(huì)生成一個(gè)hello.o目標(biāo)文件,下面的那條命令可以對(duì)上兼容。elf64相當(dāng)于說(shuō)是說(shuō)明64位機(jī)器,elf是32位。看我們的代碼可以知道,如果寄存器中使用的rax之類的,那么一定是64位的。當(dāng)然,這個(gè)問(wèn)題都不大,不管使用那一條命令,其實(shí)都能通過(guò)。
生成.o文件之后,我們就需要用鏈接器(linker)將目標(biāo)文件鏈接起來(lái),生成可執(zhí)行文件
$> ld -m elf_i386 -o hello hello.o $> ld -o hello hello.o $> ld -o -m elf_x86_64 -o hello hello.o上面的第1條鏈接命令對(duì)應(yīng)前面的第一條編譯命令,第2,3條是等價(jià)的,對(duì)應(yīng)前面第二條編譯命令。之前也說(shuō)了,這是一個(gè)對(duì)應(yīng)機(jī)器位數(shù)的問(wèn)題。如果混用,會(huì)出現(xiàn)不匹配問(wèn)題,看圖說(shuō)話。
情況就是這么個(gè)情況,不要問(wèn)為什么。這就跟找對(duì)象一樣,合適是很重要了。
AT&T
使用Gas編譯AT&T格式匯編。Gas 是GNU中自帶的,如果是Linux系統(tǒng)的話,基本上都自帶了,不需要再安裝。
Gas編譯起來(lái)沒(méi)有那么多花樣
$> as -o hello.o hello.s
$> ld -o hello helle.o
通也是生成了可執(zhí)行文件hello
測(cè)試一下
關(guān)于編譯和鏈接的一些參數(shù),可以通過(guò)使用 --help 參數(shù)來(lái)查看,一般來(lái)說(shuō)掌握幾個(gè)基本參數(shù)即可。
到目前來(lái)說(shuō)呢,基本的概念和幾個(gè)工具都已經(jīng)簡(jiǎn)單講完了,后面將會(huì)開(kāi)始正式的開(kāi)始我們的匯編語(yǔ)言學(xué)習(xí)。為了好看吧,將會(huì)以Intel格式來(lái)講解,期待一波吧。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的32汇编语言程序说明_Linux 汇编语言学习--编译和链接的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 太阳果如何烹饪?
- 下一篇: linux 其他常用命令