基本格式
nasm -f <format> <filename> [-o <output>]
比如:
nasm -f elf myfile.asm ; 将myfile.asm 编译成 elf文件格式,的 myfile.o文件,elf 是linux的可执行程序格式
常用编译命令
-f
指定要编译的格式,
windows 用 -f win32 或者win64
linux用 -f elf
裸机用 -f bin
-o
指定编译后的文件的名称 否则会有默认的文件名称
-i
%include指定要查找的目录,最好是能在 NASMENV 环境变量里设置固定的路径,省的每次设置
-d
宏定义,编译的时候添加宏定义,这样就可以在编译的时候决定代码的内容了
-l (小写的L)
主要是查看汇编结果,调试之前对照用的,看哪里那个地址是不是写错了什么的
-e
这个也是调试的时候用的,主要是查看宏展开的等是否正确
举例
nasm myfile.asm -d debug -I c: asmlib -f bin -o myfile.bin -l myfile.list
编译 myfile.asm 文件
定义 debug 宏定义,如果文件中有条件宏 就可以根据我这里定义的debug 宏来是更多调试用的指令有效了
添加搜索文件的路径为 c:
asmlib 这样如果我的文件中有%include 那么他就知道去哪里搜索对应的文件了
定义要变的格式是 bin格式
输出文件的名称叫 myfile.bin
同时产生列表文件交 myfile.list
NASMENV 环境变量
NASMENV 会附加在每个编译之后,但是环境变量会被空格分开,所以nasm有个特性就是环境变量的第一个字符当做空格(不能是减号)
比如
'!-s!-ic:
asmlib 第一个字符是! 所以这里会把当成是空格,而真正的空格就当成一个普通的字符,所以这个就等效于-s -ic:
asmlib
NASM -h 简单解释
-f
参数指定 编译的结果的格式
bin flat-form binary files (e.g. DOS .COM, .SYS)
ith Intel hex
srec Motorola S-records
aout Linux a.out object files
aoutb NetBSD/FreeBSD a.out object files
coff COFF (i386) object files (e.g. DJGPP for DOS)
elf32 ELF32 (i386) object files (e.g. Linux)
elf64 ELF64 (x86_64) object files (e.g. Linux)
elfx32 ELFX32 (x86_64) object files (e.g. Linux)
as86 Linux as86 (bin86 version 0.3) object files
obj MS-DOS 16-bit/32-bit OMF object files
win32 Microsoft Win32 (i386) object files
win64 Microsoft Win64 (x86-64) object files
rdf Relocatable Dynamic Object File Format v2.0
ieee IEEE-695 (LADsoft variant) object file format
macho32 NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (i386) object files
macho64 NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (x86_64) object files
dbg Trace of all info passed to output stage
elf ELF (short name for ELF32)
macho MACHO (short name for MACHO32)
win WIN (short name for WIN32)
-l
(小写的L) 参数 可以生成 汇编而二进制文件的对照
格式 nasm -f bin myfile.asm -l myfile.list
使用 nasm -h 参看说明
-o
指定输出的文件名称
nasm -f elf myfile.asm -o self.o
-i
指定搜索路径,主要是用在%include 伪指令包含的文件的所搜路径
-d/-D
添加预定义宏指令
就相当于在asm 文件前面自动添加一条 %define XXXX 指令
比如
nasm myfile.asm -dFOO=100
作为在文件中写下面一行语句的一种替代实现:
%define FOO 100
-u/-U
与上一条相反就是取消一个宏定义
-e
仅预处理,包括对 宏的展开等,但是不能处理计算任务,所以 如果有 $-tablestart 会报错
-p
预包含一个文件
就相当于在asm 文件前面自动添加一条 %include "filename" 伪指令
-M
产生对应的MAKEFILE文件
-F
使得输出文件带有调试信息
-g
使得调试信息有效
-E
将错误信息输出到文件中
-s
把出错信息输出到stdout 中
-a
这是在和IDE集成的时候,取消掉自身的预处理的指令,一般直接用命令行的话是用不到的
-On
n是数字,指优化的次数,默认是两遍
-t
TASM兼容模式,用不到
-w
开启或者关闭某些警告
格式
-w+orphan-labels 开启 orphan-labels 的警告
-w-orphan-labels 关闭 orphan-labels 的警告
可操作性的类型有
other any warning not specifially mentioned below (default on)
macro-params macro calls with wrong parameter count (default on)
macro-selfref cyclic macro references (default off)
macro-defaults macros with more default than optional parameters (default on)
orphan-labels labels alone on lines without trailing `:' (default on)
number-overflow numeric constant does not fit (default on)
gnu-elf-extensions using 8- or 16-bit relocation in ELF32, a GNU extension (default off)
float-overflow floating point overflow (default on)
float-denorm floating point denormal (default off)
float-underflow floating point underflow (default off)
float-toolong too many digits in floating-point number (default on)
user %warning directives (default on)
lock lock prefix on unlockable instructions (default on)
hle invalid hle prefixes (default on)
bnd invalid bnd prefixes (default on)
zext-reloc relocation zero-extended to match output format (default on)
ptr non-NASM keyword used in other assemblers (default on)
bad-pragma empty or malformed %pragma (default off)
unknown-pragma unknown %pragma facility or directive (default off)
not-my-pragma %pragma not applicable to this compilation (default off)
unknown-warning unknown warning in -W/-w or warning directive (default off)
all all possible warnings
-v
打印版本信息