|
Nasm編譯命令如下:
|
“Nasm -f elf hello.asm”是將把hello.asm匯編成elf object文件。“gcc -o hello hello.o”會把hello.asm匯編成二進制可執行文件hello.com 。
Nasm -f命令的參數主要有aout和elf兩種,如果不能確定Linux系統應該用aout還是elf,可以在Nasm目錄中輸入命令file Nasm,如果輸出“Nasm: ELF 32-bit LSB executable i386(386 and up) Version 1”應該使用elf;如果輸出“Nasm: Linux/i386 demand-paged executable(QMAGIC) ”應該使用aout。用命令Nasm -h可以取得Nasm命令行的完整說明。
程序說明
hello.asm是調用了Linux系統的puts函數,原理與調用DOS下C語言的函數相同,先用extern聲明puts是外部函數,再把參數(即msg的地址)壓入堆棧,最后call函數實現輸出。 再來看一個程序:
|
這個程序與DOS程序十分相似,而且結果同hello.asm一樣,它用的是Linux中的80h中斷,相當于DOS下的21h中斷,只是因為Linux是32位操作系統,所以采用了eax、ebx等寄存器。
Nasm與Masm的區別
1.大小寫問題
與Linux系統一樣,Nasm是區分大小寫的,Hello與hello將是不同的標識符。而在DOS或OS/2下使用Masm進行匯編,需要加入UPPERCASE參數才能區分大小寫。
2.對[ ]的使用
Nasm對[ ]的使用與Masm也有所不同,Nasm規定所有的表達式和內存操作數都必須寫在[ ]中。下面舉兩個例子來說明。
Masm的語法:
|
Nasm的語法:
|
3.關于變量類型
Nasm中不存儲變量類型,Masm中即使是通過[ ]尋址方式的變量也必須要指定變量類型。Nasm中不支持LODS, MOVS、STOS、SCAS、CMPS、INS、OUTS等類型,只支持lodsb、lodsw等已經指定類型的操作,并且Nasm中不再有assume操作,段地址完全取決于存入段寄存器的值。
關于Nasm詳細的使用方法及語法還可以參閱Nasm使用手冊。
小結
Linux作為一個多用戶的操作系統,與DOS有著非常大的區別的,特別涉及到操作系統原理時,與DOS可以說是截然不同。Linux操作系統實際是從抽象資源操作到具體硬件操作之間的接口。
對Linux這樣的多用戶操作系統來說,它需要避免用戶對硬件的直接訪問,并防止用戶之間的互相干擾,所以Linux接管了BIOS調用和端口輸入輸出,如果要通過Linux對硬件進行訪問就需要用到SystemCall。它實際上是許多C函數的集合,可以在匯編程序中被調用,調用方法與DOS下的匯編完全相同,并且用Nasm匯編時不用鏈接額外的庫函數。