nasmdoc.src
上传用户:yuppie_zhu
上传日期:2007-01-08
资源大小:535k
文件大小:370k
源码类别:

编译器/解释器

开发平台:

C/C++

  1. # $Id: nasmdoc.src,v 2.3 1999/06/03 20:23:53 hpa Exp $
  2. #
  3. # Source code to NASM documentation
  4. #
  5. IR{-D} c{-D} option
  6. IR{-E} c{-E} option
  7. IR{-I} c{-I} option
  8. IR{-P} c{-P} option
  9. IR{-U} c{-U} option
  10. IR{-a} c{-a} option
  11. IR{-d} c{-d} option
  12. IR{-e} c{-e} option
  13. IR{-f} c{-f} option
  14. IR{-i} c{-i} option
  15. IR{-l} c{-l} option
  16. IR{-o} c{-o} option
  17. IR{-p} c{-p} option
  18. IR{-s} c{-s} option
  19. IR{-u} c{-u} option
  20. IR{-w} c{-w} option
  21. IR{!=} c{!=} operator
  22. IR{$ here} c{$} Here token
  23. IR{$$} c{$$} token
  24. IR{%} c{%} operator
  25. IR{%%} c{%%} operator
  26. IR{%+1} c{%+1} and c{%-1} syntax
  27. IA{%-1}{%+1}
  28. IR{%0} c{%0} parameter count
  29. IR{&} c{&} operator
  30. IR{&&} c{&&} operator
  31. IR{*} c{*} operator
  32. IR{..@} c{..@} symbol prefix
  33. IR{/} c{/} operator
  34. IR{//} c{//} operator
  35. IR{<} c{<} operator
  36. IR{<<} c{<<} operator
  37. IR{<=} c{<=} operator
  38. IR{<>} c{<>} operator
  39. IR{=} c{=} operator
  40. IR{==} c{==} operator
  41. IR{>} c{>} operator
  42. IR{>=} c{>=} operator
  43. IR{>>} c{>>} operator
  44. IR{?} c{?} MASM syntax
  45. IR{^} c{^} operator
  46. IR{^^} c{^^} operator
  47. IR{|} c{|} operator
  48. IR{||} c{||} operator
  49. IR{~} c{~} operator
  50. IR{%$} c{%$} and c{%$$} prefixes
  51. IA{%$$}{%$}
  52. IR{+ opaddition} c{+} operator, binary
  53. IR{+ opunary} c{+} operator, unary
  54. IR{+ modifier} c{+} modifier
  55. IR{- opsubtraction} c{-} operator, binary
  56. IR{- opunary} c{-} operator, unary
  57. IR{alignment, in bin sections} alignment, in c{bin} sections
  58. IR{alignment, in elf sections} alignment, in c{elf} sections
  59. IR{alignment, in win32 sections} alignment, in c{win32} sections
  60. IR{alignment, of elf common variables} alignment, of c{elf} common
  61. variables
  62. IR{alignment, in obj sections} alignment, in c{obj} sections
  63. IR{a.out, bsd version} c{a.out}, BSD version
  64. IR{a.out, linux version} c{a.out}, Linux version
  65. IR{autoconf} Autoconf
  66. IR{bitwise and} bitwise AND
  67. IR{bitwise or} bitwise OR
  68. IR{bitwise xor} bitwise XOR
  69. IR{block ifs} block IFs
  70. IR{borland pascal} Borland, Pascal
  71. IR{borland's win32 compilers} Borland, Win32 compilers
  72. IR{braces, after % sign} braces, after c{%} sign
  73. IR{bsd} BSD
  74. IR{c calling convention} C calling convention
  75. IR{c symbol names} C symbol names
  76. IA{critical expressions}{critical expression}
  77. IA{command line}{command-line}
  78. IA{case sensitivity}{case sensitive}
  79. IA{case-sensitive}{case sensitive}
  80. IA{case-insensitive}{case sensitive}
  81. IA{character constants}{character constant}
  82. IR{common object file format} Common Object File Format
  83. IR{common variables, alignment in elf} common variables, alignment
  84. in c{elf}
  85. IR{common, elf extensions to} c{COMMON}, c{elf} extensions to
  86. IR{common, obj extensions to} c{COMMON}, c{obj} extensions to
  87. IR{declaring structure} declaring structures
  88. IR{default-wrt mechanism} default-c{WRT} mechanism
  89. IR{devpac} DevPac
  90. IR{djgpp} DJGPP
  91. IR{dll symbols, exporting} DLL symbols, exporting
  92. IR{dll symbols, importing} DLL symbols, importing
  93. IR{dos} DOS
  94. IR{dos archive} DOS archive
  95. IR{dos source archive} DOS source archive
  96. IA{effective address}{effective addresses}
  97. IA{effective-address}{effective addresses}
  98. IR{elf shared libraries} c{elf} shared libraries
  99. IR{freebsd} FreeBSD
  100. IR{freelink} FreeLink
  101. IR{functions, c calling convention} functions, C calling convention
  102. IR{functions, pascal calling convention} functions, Pascal calling
  103. convention
  104. IR{global, aoutb extensions to} c{GLOBAL}, c{aoutb} extensions to
  105. IR{global, elf extensions to} c{GLOBAL}, c{elf} extensions to
  106. IR{got} GOT
  107. IR{got relocations} c{GOT} relocations
  108. IR{gotoff relocation} c{GOTOFF} relocations
  109. IR{gotpc relocation} c{GOTPC} relocations
  110. IR{linux elf} Linux ELF
  111. IR{logical and} logical AND
  112. IR{logical or} logical OR
  113. IR{logical xor} logical XOR
  114. IR{masm} MASM
  115. IA{memory reference}{memory references}
  116. IA{misc directory}{misc subdirectory}
  117. IR{misc subdirectory} c{misc} subdirectory
  118. IR{microsoft omf} Microsoft OMF
  119. IR{mmx registers} MMX registers
  120. IA{modr/m}{modr/m byte}
  121. IR{modr/m byte} ModR/M byte
  122. IR{ms-dos} MS-DOS
  123. IR{ms-dos device drivers} MS-DOS device drivers
  124. IR{multipush} c{multipush} macro
  125. IR{nasm version} NASM version
  126. IR{netbsd} NetBSD
  127. IR{omf} OMF
  128. IR{openbsd} OpenBSD
  129. IR{operating-system} operating system
  130. IR{os/2} OS/2
  131. IR{pascal calling convention}Pascal calling convention
  132. IR{passes} passes, assembly
  133. IR{perl} Perl
  134. IR{pic} PIC
  135. IR{pharlap} PharLap
  136. IR{plt} PLT
  137. IR{plt} c{PLT} relocations
  138. IA{pre-defining macros}{pre-define}
  139. IR{qbasic} QBasic
  140. IA{rdoff subdirectory}{rdoff}
  141. IR{rdoff} c{rdoff} subdirectory
  142. IR{relocatable dynamic object file format} Relocatable Dynamic
  143. Object File Format
  144. IR{relocations, pic-specific} relocations, PIC-specific
  145. IA{repeating}{repeating code}
  146. IR{section alignment, in elf} section alignment, in c{elf}
  147. IR{section alignment, in bin} section alignment, in c{bin}
  148. IR{section alignment, in obj} section alignment, in c{obj}
  149. IR{section alignment, in win32} section alignment, in c{win32}
  150. IR{section, elf extensions to} c{SECTION}, c{elf} extensions to
  151. IR{section, win32 extensions to} c{SECTION}, c{win32} extensions to
  152. IR{segment alignment, in bin} segment alignment, in c{bin}
  153. IR{segment alignment, in obj} segment alignment, in c{obj}
  154. IR{segment, obj extensions to} c{SEGMENT}, c{elf} extensions to
  155. IR{segment names, borland pascal} segment names, Borland Pascal
  156. IR{shift commane} c{shift} command
  157. IA{sib}{sib byte}
  158. IR{sib byte} SIB byte
  159. IA{standard section names}{standardised section names}
  160. IR{symbols, exporting from dlls} symbols, exporting from DLLs
  161. IR{symbols, importing from dlls} symbols, importing from DLLs
  162. IR{tasm} TASM
  163. IR{test subdirectory} c{test} subdirectory
  164. IR{tlink} TLINK
  165. IR{underscore, in c symbols} underscore, in C symbols
  166. IR{unix} Unix
  167. IR{unix source archive} Unix source archive
  168. IR{val} VAL
  169. IR{version number of nasm} version number of NASM
  170. IR{visual c++} Visual C++
  171. IR{www page} WWW page
  172. IR{win32} Win32
  173. IR{windows} Windows
  174. IR{windows 95} Windows 95
  175. IR{windows nt} Windows NT
  176. # IC{program entry point}{entry point, program}
  177. # IC{program entry point}{start point, program}
  178. # IC{MS-DOS device drivers}{device drivers, MS-DOS}
  179. # IC{16-bit mode, versus 32-bit mode}{32-bit mode, versus 16-bit mode}
  180. # IC{c symbol names}{symbol names, in C}
  181. C{intro} Introduction
  182. H{whatsnasm} What Is NASM?
  183. The Netwide Assembler, NASM, is an 80x86 assembler designed for
  184. portability and modularity. It supports a range of object file
  185. formats, including Linux c{a.out} and ELF, NetBSD/FreeBSD, COFF,
  186. Microsoft 16-bit OBJ and Win32. It will also output plain binary
  187. files. Its syntax is designed to be simple and easy to understand,
  188. similar to Intel's but less complex. It supports Pentium, P6 and MMX
  189. opcodes, and has macro capability.
  190. S{yaasm} Why Yet Another Assembler?
  191. The Netwide Assembler grew out of an idea on ic{comp.lang.asm.x86}
  192. (or possibly ic{alt.lang.asm} - I forget which), which was
  193. essentially that there didn't seem to be a good free x86-series
  194. assembler around, and that maybe someone ought to write one.
  195. b ic{a86} is good, but not free, and in particular you don't get any
  196. 32-bit capability until you pay. It's DOS only, too.
  197. b ic{gas} is free, and ports over DOS and Unix, but it's not very good,
  198. since it's designed to be a back end to ic{gcc}, which always feeds
  199. it correct code. So its error checking is minimal. Also, its syntax
  200. is horrible, from the point of view of anyone trying to actually
  201. e{write} anything in it. Plus you can't write 16-bit code in it
  202. (properly).
  203. b ic{as86} is Linux-specific, and (my version at least) doesn't seem to
  204. have much (or any) documentation.
  205. b i{MASM} isn't very good, and it's expensive, and it runs only under
  206. DOS.
  207. b i{TASM} is better, but still strives for i{MASM} compatibility, which
  208. means millions of directives and tons of red tape. And its syntax is
  209. essentially i{MASM}'s, with the contradictions and quirks that entails
  210. (although it sorts out some of those by means of Ideal mode). It's
  211. expensive too. And it's DOS-only.
  212. So here, for your coding pleasure, is NASM. At present it's
  213. still in prototype stage - we don't promise that it can outperform
  214. any of these assemblers. But please, e{please} send us bug reports,
  215. fixes, helpful information, and anything else you can get your hands
  216. on (and thanks to the many people who've done this already! You all
  217. know who you are), and we'll improve it out of all recognition.
  218. Again.
  219. S{legal} Licence Conditions
  220. Please see the file c{Licence}, supplied as part of any NASM
  221. distribution archive, for the i{licence} conditions under which you
  222. may use NASM.
  223. H{contact} Contact Information
  224. The current version of NASM (since 0.98) are maintained by H. Peter
  225. Anvin, W{mailto:hpa@zytor.com}c{hpa@zytor.com}. If you want to report
  226. a bug, please read k{bugs} first.
  227. NASM has a i{WWW page} at
  228. W{http://www.cryogen.com/Nasm}c{http://www.cryogen.com/Nasm}.
  229. The original authors are i{e-mail}able as
  230. W{mailto:jules@earthcorp.com}c{jules@earthcorp.com} and
  231. W{mailto:anakin@pobox.com}c{anakin@pobox.com}.
  232. i{New releases} of NASM are uploaded to
  233. W{ftp://ftp.kernel.org/pub/software/devel/nasm/}ic{ftp.kernel.org},
  234. W{ftp://sunsite.unc.edu/pub/Linux/devel/lang/assemblers/}ic{sunsite.unc.edu},
  235. W{ftp://ftp.simtel.net/pub/simtelnet/msdos/asmutl/}ic{ftp.simtel.net}
  236. and
  237. W{ftp://ftp.coast.net/coast/msdos/asmutil/}ic{ftp.coast.net}.
  238. Announcements are posted to
  239. W{news:comp.lang.asm.x86}ic{comp.lang.asm.x86},
  240. W{news:alt.lang.asm}ic{alt.lang.asm},
  241. W{news:comp.os.linux.announce}ic{comp.os.linux.announce} and
  242. W{news:comp.archives.msdos.announce}ic{comp.archives.msdos.announce}
  243. (the last one is done automagically by uploading to
  244. W{ftp://ftp.simtel.net/pub/simtelnet/msdos/asmutl/}c{ftp.simtel.net}).
  245. If you don't have Usenet access, or would rather be informed by
  246. i{e-mail} when new releases come out, you can subscribe to the
  247. c{nasm-announce} email list by sending an email containing the line
  248. c{subscribe nasm-announce} to
  249. W{mailto:majordomo@linux.kernel.org}c{majordomo@linux.kernel.org}.
  250. If you want information about NASM beta releases, please subscribe to
  251. the c{nasm-beta} email list by sending an email containing the line
  252. c{subscribe nasm-beta} to
  253. W{mailto:majordomo@linux.kernel.org}c{majordomo@linux.kernel.org}.
  254. H{install} Installation
  255. S{instdos} i{Installing} NASM under MS-i{DOS} or Windows
  256. Once you've obtained the i{DOS archive} for NASM, ic{nasmXXX.zip}
  257. (where c{XXX} denotes the version number of NASM contained in the
  258. archive), unpack it into its own directory (for example
  259. c{c:\nasm}).
  260. The archive will contain four executable files: the NASM executable
  261. files ic{nasm.exe} and ic{nasmw.exe}, and the NDISASM executable
  262. files ic{ndisasm.exe} and ic{ndisasmw.exe}. In each case, the
  263. file whose name ends in c{w} is a i{Win32} executable, designed to
  264. run under i{Windows 95} or i{Windows NT} Intel, and the other one
  265. is a 16-bit i{DOS} executable.
  266. The only file NASM needs to run is its own executable, so copy
  267. (at least) one of c{nasm.exe} and c{nasmw.exe} to a directory on
  268. your PATH, or alternatively edit ic{autoexec.bat} to add the
  269. c{nasm} directory to your ic{PATH}. (If you're only installing the
  270. Win32 version, you may wish to rename it to c{nasm.exe}.)
  271. That's it - NASM is installed. You don't need the c{nasm} directory
  272. to be present to run NASM (unless you've added it to your c{PATH}),
  273. so you can delete it if you need to save space; however, you may
  274. want to keep the documentation or test programs.
  275. If you've downloaded the i{DOS source archive}, ic{nasmXXXs.zip},
  276. the c{nasm} directory will also contain the full NASM i{source
  277. code}, and a selection of i{Makefiles} you can (hopefully) use to
  278. rebuild your copy of NASM from scratch. The file c{Readme} lists the
  279. various Makefiles and which compilers they work with.
  280. Note that the source files c{insnsa.c}, c{insnsd.c}, c{insnsi.h}
  281. and c{insnsn.c} are automatically generated from the master
  282. instruction table c{insns.dat} by a Perl script; the file
  283. c{macros.c} is generated from c{standard.mac} by another Perl
  284. script. Although the NASM 0.98 distribution includes these generated
  285. files, you will need to rebuild them (and hence, will need a Perl
  286. interpreter) if you change c{insns.dat}, c{standard.mac} or the
  287. documentation. It is possible future source distributions may not
  288. include these files at all.  Ports of i{Perl} for a variety of
  289. platforms, including DOS and Windows, are available from
  290. W{http://www.cpan.org/ports/}i{www.cpan.org}.
  291. S{instdos} Installing NASM under i{Unix}
  292. Once you've obtained the i{Unix source archive} for NASM,
  293. ic{nasm-X.XX.tar.gz} (where c{X.XX} denotes the version number of
  294. NASM contained in the archive), unpack it into a directory such
  295. as c{/usr/local/src}. The archive, when unpacked, will create its
  296. own subdirectory c{nasm-X.XX}.
  297. NASM is an I{Autoconf}Ic{configure}auto-configuring package: once
  298. you've unpacked it, c{cd} to the directory it's been unpacked into
  299. and type c{./configure}. This shell script will find the best C
  300. compiler to use for building NASM and set up i{Makefiles}
  301. accordingly.
  302. Once NASM has auto-configured, you can type ic{make} to build the
  303. c{nasm} and c{ndisasm} binaries, and then c{make install} to
  304. install them in c{/usr/local/bin} and install the i{man pages}
  305. ic{nasm.1} and ic{ndisasm.1} in c{/usr/local/man/man1}.
  306. Alternatively, you can give options such as c{--prefix} to the
  307. c{configure} script (see the file ic{INSTALL} for more details), or
  308. install the programs yourself.
  309. NASM also comes with a set of utilities for handling the RDOFF
  310. custom object-file format, which are in the ic{rdoff} subdirectory
  311. of the NASM archive. You can build these with c{make rdf} and
  312. install them with c{make rdf_install}, if you want them.
  313. If NASM fails to auto-configure, you may still be able to make it
  314. compile by using the fall-back Unix makefile ic{Makefile.unx}.
  315. Copy or rename that file to c{Makefile} and try typing c{make}.
  316. There is also a c{Makefile.unx} file in the c{rdoff} subdirectory.
  317. C{running} Running NASM
  318. H{syntax} NASM i{Command-Line} Syntax
  319. To assemble a file, you issue a command of the form
  320. c nasm -f <format> <filename> [-o <output>]
  321. For example,
  322. c nasm -f elf myfile.asm
  323. will assemble c{myfile.asm} into an ELF object file c{myfile.o}. And
  324. c nasm -f bin myfile.asm -o myfile.com
  325. will assemble c{myfile.asm} into a raw binary file c{myfile.com}.
  326. To produce a listing file, with the hex codes output from NASM
  327. displayed on the left of the original sources, use the c{-l} option
  328. to give a listing file name, for example:
  329. c nasm -f coff myfile.asm -l myfile.lst
  330. To get further usage instructions from NASM, try typing
  331. c nasm -h
  332. This will also list the available output file formats, and what they
  333. are.
  334. If you use Linux but aren't sure whether your system is c{a.out} or
  335. ELF, type
  336. c file nasm
  337. (in the directory in which you put the NASM binary when you
  338. installed it). If it says something like
  339. c nasm: ELF 32-bit LSB executable i386 (386 and up) Version 1
  340. then your system is ELF, and you should use the option c{-f elf}
  341. when you want NASM to produce Linux object files. If it says
  342. c nasm: Linux/i386 demand-paged executable (QMAGIC)
  343. or something similar, your system is c{a.out}, and you should use
  344. c{-f aout} instead (Linux c{a.out} systems are considered obsolete,
  345. and are rare these days.)
  346. Like Unix compilers and assemblers, NASM is silent unless it
  347. goes wrong: you won't see any output at all, unless it gives error
  348. messages.
  349. S{opt-o} The ic{-o} Option: Specifying the Output File Name
  350. NASM will normally choose the name of your output file for you;
  351. precisely how it does this is dependent on the object file format.
  352. For Microsoft object file formats (ic{obj} and ic{win32}), it
  353. will remove the c{.asm} i{extension} (or whatever extension you
  354. like to use - NASM doesn't care) from your source file name and
  355. substitute c{.obj}. For Unix object file formats (ic{aout},
  356. ic{coff}, ic{elf} and ic{as86}) it will substitute c{.o}. For
  357. ic{rdf}, it will use c{.rdf}, and for the ic{bin} format it
  358. will simply remove the extension, so that c{myfile.asm} produces
  359. the output file c{myfile}.
  360. If the output file already exists, NASM will overwrite it, unless it
  361. has the same name as the input file, in which case it will give a
  362. warning and use ic{nasm.out} as the output file name instead.
  363. For situations in which this behaviour is unacceptable, NASM
  364. provides the c{-o} command-line option, which allows you to specify
  365. your desired output file name. You invoke c{-o} by following it
  366. with the name you wish for the output file, either with or without
  367. an intervening space. For example:
  368. c nasm -f bin program.asm -o program.com
  369. c nasm -f bin driver.asm -odriver.sys
  370. S{opt-f} The ic{-f} Option: Specifying the i{Output File Format}
  371. If you do not supply the c{-f} option to NASM, it will choose an
  372. output file format for you itself. In the distribution versions of
  373. NASM, the default is always ic{bin}; if you've compiled your own
  374. copy of NASM, you can redefine ic{OF_DEFAULT} at compile time and
  375. choose what you want the default to be.
  376. Like c{-o}, the intervening space between c{-f} and the output
  377. file format is optional; so c{-f elf} and c{-felf} are both valid.
  378. A complete list of the available output file formats can be given by
  379. issuing the command ic{nasm -h}.
  380. S{opt-l} The ic{-l} Option: Generating a i{Listing File}
  381. If you supply the c{-l} option to NASM, followed (with the usual
  382. optional space) by a file name, NASM will generate a
  383. i{source-listing file} for you, in which addresses and generated
  384. code are listed on the left, and the actual source code, with
  385. expansions of multi-line macros (except those which specifically
  386. request no expansion in source listings: see k{nolist}) on the
  387. right. For example:
  388. c nasm -f elf myfile.asm -l myfile.lst
  389. S{opt-E} The ic{-E} Option: Send Errors to a File
  390. Under MS-i{DOS} it can be difficult (though there are ways) to
  391. redirect the standard-error output of a program to a file. Since
  392. NASM usually produces its warning and i{error messages} on
  393. ic{stderr}, this can make it hard to capture the errors if (for
  394. example) you want to load them into an editor.
  395. NASM therefore provides the c{-E} option, taking a filename argument
  396. which causes errors to be sent to the specified files rather than
  397. standard error. Therefore you can I{redirecting errors}redirect
  398. the errors into a file by typing
  399. c nasm -E myfile.err -f obj myfile.asm
  400. S{opt-s} The ic{-s} Option: Send Errors to ic{stdout}
  401. The c{-s} option redirects i{error messages} to c{stdout} rather
  402. than c{stderr}, so it can be redirected under MS-i{DOS}.  To
  403. assemble the file c{myfile.asm} and pipe its output to the c{more}
  404. program, you can type:
  405. c nasm -s -f obj myfile.asm | more
  406. See also the c{-E} option, k{opt-E}.
  407. S{opt-i} The ic{-i}Ic{-I} Option: Include File Search Directories
  408. When NASM sees the ic{%include} directive in a source file (see
  409. k{include}), it will search for the given file not only in the
  410. current directory, but also in any directories specified on the
  411. command line by the use of the c{-i} option. Therefore you can
  412. include files from a i{macro library}, for example, by typing
  413. c nasm -ic:\macrolib\ -f obj myfile.asm
  414. (As usual, a space between c{-i} and the path name is allowed, and
  415. optional).
  416. NASM, in the interests of complete source-code portability, does not
  417. understand the file naming conventions of the OS it is running on;
  418. the string you provide as an argument to the c{-i} option will be
  419. prepended exactly as written to the name of the include file.
  420. Therefore the trailing backslash in the above example is necessary.
  421. Under Unix, a trailing forward slash is similarly necessary.
  422. (You can use this to your advantage, if you're really i{perverse},
  423. by noting that the option c{-ifoo} will cause c{%include "bar.i"}
  424. to search for the file c{foobar.i}...)
  425. If you want to define a e{standard} i{include search path},
  426. similar to c{/usr/include} on Unix systems, you should place one or
  427. more c{-i} directives in the c{NASM} environment variable (see
  428. k{nasmenv}).
  429. For Makefile compatibility with many C compilers, this option can also
  430. be specified as c{-I}.
  431. S{opt-p} The ic{-p}Ic{-P} Option: I{pre-including files}Pre-Include a File
  432. Ic{%include}NASM allows you to specify files to be
  433. e{pre-included} into your source file, by the use of the c{-p}
  434. option. So running
  435. c nasm myfile.asm -p myinc.inc
  436. is equivalent to running c{nasm myfile.asm} and placing the
  437. directive c{%include "myinc.inc"} at the start of the file.
  438. For consistency with the c{-I}, c{-D} and c{-U} options, this
  439. option can also be specified as c{-P}.
  440. S{opt-d} The ic{-d}Ic{-D} Option: I{pre-defining macros} Pre-Define a Macro
  441. Ic{%define}Just as the c{-p} option gives an alternative to placing
  442. c{%include} directives at the start of a source file, the c{-d}
  443. option gives an alternative to placing a c{%define} directive. You
  444. could code
  445. c nasm myfile.asm -dFOO=100
  446. as an alternative to placing the directive
  447. c %define FOO 100
  448. at the start of the file. You can miss off the macro value, as well:
  449. the option c{-dFOO} is equivalent to coding c{%define FOO}. This
  450. form of the directive may be useful for selecting i{assembly-time
  451. options} which are then tested using c{%ifdef}, for example
  452. c{-dDEBUG}.
  453. For Makefile compatibility with many C compilers, this option can also
  454. be specified as c{-D}.
  455. S{opt-u} The ic{-u}Ic{-U} Option: I{Undefining macros} Undefine a Macro
  456. Ic{%undef}The c{-u} option undefines a macro that would otherwise
  457. have been pre-defined, either automatically or by a c{-p} or c{-d}
  458. option specified earlier on the command lines.
  459. For example, the following command line:
  460. c nasm myfile.asm -dFOO=100 -uFOO
  461. would result in c{FOO} e{not} being a predefined macro in the
  462. program.  This is useful to override options specified at a different
  463. point in a Makefile.
  464. For Makefile compatibility with many C compilers, this option can also
  465. be specified as c{-U}.
  466. S{opt-e} The ic{-e} Option: Preprocess Only
  467. NASM allows the i{preprocessor} to be run on its own, up to a
  468. point. Using the c{-e} option (which requires no arguments) will
  469. cause NASM to preprocess its input file, expand all the macro
  470. references, remove all the comments and preprocessor directives, and
  471. print the resulting file on standard output (or save it to a file,
  472. if the c{-o} option is also used).
  473. This option cannot be applied to programs which require the
  474. preprocessor to evaluate I{preprocessor expressions}i{expressions}
  475. which depend on the values of symbols: so code such as
  476. c %assign tablesize ($-tablestart)
  477. will cause an error in i{preprocess-only mode}.
  478. S{opt-a} The ic{-a} Option: Don't Preprocess At All
  479. If NASM is being used as the back end to a compiler, it might be
  480. desirable to I{suppressing preprocessing}suppress preprocessing
  481. completely and assume the compiler has already done it, to save time
  482. and increase compilation speeds. The c{-a} option, requiring no
  483. argument, instructs NASM to replace its powerful i{preprocessor}
  484. with a i{stub preprocessor} which does nothing.
  485. S{opt-w} The ic{-w} Option: Enable or Disable Assembly i{Warnings}
  486. NASM can observe many conditions during the course of assembly which
  487. are worth mentioning to the user, but not a sufficiently severe
  488. error to justify NASM refusing to generate an output file. These
  489. conditions are reported like errors, but come up with the word
  490. `warning' before the message. Warnings do not prevent NASM from
  491. generating an output file and returning a success status to the
  492. operating system.
  493. Some conditions are even less severe than that: they are only
  494. sometimes worth mentioning to the user. Therefore NASM supports the
  495. c{-w} command-line option, which enables or disables certain
  496. classes of assembly warning. Such warning classes are described by a
  497. name, for example c{orphan-labels}; you can enable warnings of
  498. this class by the command-line option c{-w+orphan-labels} and
  499. disable it by c{-w-orphan-labels}.
  500. The i{suppressible warning} classes are:
  501. b ic{macro-params} covers warnings about i{multi-line macros}
  502. being invoked with the wrong number of parameters. This warning
  503. class is enabled by default; see k{mlmacover} for an example of why
  504. you might want to disable it.
  505. b ic{orphan-labels} covers warnings about source lines which
  506. contain no instruction but define a label without a trailing colon.
  507. NASM does not warn about this somewhat obscure condition by default;
  508. see k{syntax} for an example of why you might want it to.
  509. b ic{number-overflow} covers warnings about numeric constants which
  510. don't fit in 32 bits (for example, it's easy to type one too many Fs
  511. and produce c{0x7ffffffff} by mistake). This warning class is
  512. enabled by default.
  513. S{nasmenv} The c{NASM} i{Environment} Variable
  514. If you define an environment variable called c{NASM}, the program
  515. will interpret it as a list of extra command-line options, which are
  516. processed before the real command line. You can use this to define
  517. standard search directories for include files, by putting c{-i}
  518. options in the c{NASM} variable.
  519. The value of the variable is split up at white space, so that the
  520. value c{-s -ic:\nasmlib} will be treated as two separate options.
  521. However, that means that the value c{-dNAME="my name"} won't do
  522. what you might want, because it will be split at the space and the
  523. NASM command-line processing will get confused by the two
  524. nonsensical words c{-dNAME="my} and c{name"}.
  525. To get round this, NASM provides a feature whereby, if you begin the
  526. c{NASM} environment variable with some character that isn't a minus
  527. sign, then NASM will treat this character as the i{separator
  528. character} for options. So setting the c{NASM} variable to the
  529. value c{!-s!-ic:\nasmlib} is equivalent to setting it to c{-s
  530. -ic:\nasmlib}, but c{!-dNAME="my name"} will work.
  531. H{qstart} i{Quick Start} for i{MASM} Users
  532. If you're used to writing programs with MASM, or with i{TASM} in
  533. MASM-compatible (non-Ideal) mode, or with ic{a86}, this section
  534. attempts to outline the major differences between MASM's syntax and
  535. NASM's. If you're not already used to MASM, it's probably worth
  536. skipping this section.
  537. S{qscs} NASM Is I{case sensitivity}Case-Sensitive
  538. One simple difference is that NASM is case-sensitive. It makes a
  539. difference whether you call your label c{foo}, c{Foo} or c{FOO}.
  540. If you're assembling to DOS or OS/2 c{.OBJ} files, you can invoke
  541. the ic{UPPERCASE} directive (documented in k{objfmt}) to ensure
  542. that all symbols exported to other code modules are forced to be
  543. upper case; but even then, e{within} a single module, NASM will
  544. distinguish between labels differing only in case.
  545. S{qsbrackets} NASM Requires i{Square Brackets} For i{Memory References}
  546. NASM was designed with simplicity of syntax in mind. One of the
  547. i{design goals} of NASM is that it should be possible, as far as is
  548. practical, for the user to look at a single line of NASM code
  549. and tell what opcode is generated by it. You can't do this in MASM:
  550. if you declare, for example,
  551. c foo       equ 1
  552. c bar       dw 2
  553. then the two lines of code
  554. c           mov ax,foo
  555. c           mov ax,bar
  556. generate completely different opcodes, despite having
  557. identical-looking syntaxes.
  558. NASM avoids this undesirable situation by having a much simpler
  559. syntax for memory references. The rule is simply that any access to
  560. the e{contents} of a memory location requires square brackets
  561. around the address, and any access to the e{address} of a variable
  562. doesn't. So an instruction of the form c{mov ax,foo} will
  563. e{always} refer to a compile-time constant, whether it's an c{EQU}
  564. or the address of a variable; and to access the e{contents} of the
  565. variable c{bar}, you must code c{mov ax,[bar]}.
  566. This also means that NASM has no need for MASM's ic{OFFSET}
  567. keyword, since the MASM code c{mov ax,offset bar} means exactly the
  568. same thing as NASM's c{mov ax,bar}. If you're trying to get
  569. large amounts of MASM code to assemble sensibly under NASM, you
  570. can always code c{%idefine offset} to make the preprocessor treat
  571. the c{OFFSET} keyword as a no-op.
  572. This issue is even more confusing in ic{a86}, where declaring a
  573. label with a trailing colon defines it to be a `label' as opposed to
  574. a `variable' and causes c{a86} to adopt NASM-style semantics; so in
  575. c{a86}, c{mov ax,var} has different behaviour depending on whether
  576. c{var} was declared as c{var: dw 0} (a label) or c{var dw 0} (a
  577. word-size variable). NASM is very simple by comparison:
  578. e{everything} is a label.
  579. NASM, in the interests of simplicity, also does not support the
  580. i{hybrid syntaxes} supported by MASM and its clones, such as
  581. c{mov ax,table[bx]}, where a memory reference is denoted by one
  582. portion outside square brackets and another portion inside. The
  583. correct syntax for the above is c{mov ax,[table+bx]}. Likewise,
  584. c{mov ax,es:[di]} is wrong and c{mov ax,[es:di]} is right.
  585. S{qstypes} NASM Doesn't Store i{Variable Types}
  586. NASM, by design, chooses not to remember the types of variables you
  587. declare. Whereas MASM will remember, on seeing c{var dw 0}, that
  588. you declared c{var} as a word-size variable, and will then be able
  589. to fill in the i{ambiguity} in the size of the instruction c{mov
  590. var,2}, NASM will deliberately remember nothing about the symbol
  591. c{var} except where it begins, and so you must explicitly code
  592. c{mov word [var],2}.
  593. For this reason, NASM doesn't support the c{LODS}, c{MOVS},
  594. c{STOS}, c{SCAS}, c{CMPS}, c{INS}, or c{OUTS} instructions,
  595. but only supports the forms such as c{LODSB}, c{MOVSW}, and
  596. c{SCASD}, which explicitly specify the size of the components of
  597. the strings being manipulated.
  598. S{qsassume} NASM Doesn't ic{ASSUME}
  599. As part of NASM's drive for simplicity, it also does not support the
  600. c{ASSUME} directive. NASM will not keep track of what values you
  601. choose to put in your segment registers, and will never
  602. e{automatically} generate a i{segment override} prefix.
  603. S{qsmodel} NASM Doesn't Support i{Memory Models}
  604. NASM also does not have any directives to support different 16-bit
  605. memory models. The programmer has to keep track of which functions
  606. are supposed to be called with a i{far call} and which with a
  607. i{near call}, and is responsible for putting the correct form of
  608. c{RET} instruction (c{RETN} or c{RETF}; NASM accepts c{RET}
  609. itself as an alternate form for c{RETN}); in addition, the
  610. programmer is responsible for coding CALL FAR instructions where
  611. necessary when calling e{external} functions, and must also keep
  612. track of which external variable definitions are far and which are
  613. near.
  614. S{qsfpu} i{Floating-Point} Differences
  615. NASM uses different names to refer to floating-point registers from
  616. MASM: where MASM would call them c{ST(0)}, c{ST(1)} and so on, and
  617. ic{a86} would call them simply c{0}, c{1} and so on, NASM
  618. chooses to call them c{st0}, c{st1} etc.
  619. As of version 0.96, NASM now treats the instructions with
  620. i{`nowait'} forms in the same way as MASM-compatible assemblers.
  621. The idiosyncratic treatment employed by 0.95 and earlier was based
  622. on a misunderstanding by the authors.
  623. S{qsother} Other Differences
  624. For historical reasons, NASM uses the keyword ic{TWORD} where MASM
  625. and compatible assemblers use ic{TBYTE}.
  626. NASM does not declare i{uninitialised storage} in the same way as
  627. MASM: where a MASM programmer might use c{stack db 64 dup (?)},
  628. NASM requires c{stack resb 64}, intended to be read as `reserve 64
  629. bytes'. For a limited amount of compatibility, since NASM treats
  630. c{?} as a valid character in symbol names, you can code c{? equ 0}
  631. and then writing c{dw ?} will at least do something vaguely useful.
  632. Ic{RESB}ic{DUP} is still not a supported syntax, however.
  633. In addition to all of this, macros and directives work completely
  634. differently to MASM. See k{preproc} and k{directive} for further
  635. details.
  636. C{lang} The NASM Language
  637. H{syntax} Layout of a NASM Source Line
  638. Like most assemblers, each NASM source line contains (unless it
  639. is a macro, a preprocessor directive or an assembler directive: see
  640. k{preproc} and k{directive}) some combination of the four fields
  641. c label:    instruction operands        ; comment
  642. As usual, most of these fields are optional; the presence or absence
  643. of any combination of a label, an instruction and a comment is allowed.
  644. Of course, the operand field is either required or forbidden by the
  645. presence and nature of the instruction field.
  646. NASM places no restrictions on white space within a line: labels may
  647. have white space before them, or instructions may have no space
  648. before them, or anything. The i{colon} after a label is also
  649. optional. (Note that this means that if you intend to code c{lodsb}
  650. alone on a line, and type c{lodab} by accident, then that's still a
  651. valid source line which does nothing but define a label. Running
  652. NASM with the command-line option
  653. I{orphan-labels}c{-w+orphan-labels} will cause it to warn you if
  654. you define a label alone on a line without a i{trailing colon}.)
  655. i{Valid characters} in labels are letters, numbers, c{_}, c{$},
  656. c{#}, c{@}, c{~}, c{.}, and c{?}. The only characters which may
  657. be used as the e{first} character of an identifier are letters,
  658. c{.} (with special meaning: see k{locallab}), c{_} and c{?}.
  659. An identifier may also be prefixed with a I{$prefix}c{$} to
  660. indicate that it is intended to be read as an identifier and not a
  661. reserved word; thus, if some other module you are linking with
  662. defines a symbol called c{eax}, you can refer to c{$eax} in NASM
  663. code to distinguish the symbol from the register.
  664. The instruction field may contain any machine instruction: Pentium
  665. and P6 instructions, FPU instructions, MMX instructions and even
  666. undocumented instructions are all supported. The instruction may be
  667. prefixed by c{LOCK}, c{REP}, c{REPE}/c{REPZ} or
  668. c{REPNE}/c{REPNZ}, in the usual way. Explicit I{address-size
  669. prefixes}address-size and i{operand-size prefixes} c{A16},
  670. c{A32}, c{O16} and c{O32} are provided - one example of their use
  671. is given in k{mixsize}. You can also use the name of a I{segment
  672. override}segment register as an instruction prefix: coding
  673. c{es mov [bx],ax} is equivalent to coding c{mov [es:bx],ax}. We
  674. recommend the latter syntax, since it is consistent with other
  675. syntactic features of the language, but for instructions such as
  676. c{LODSB}, which has no operands and yet can require a segment
  677. override, there is no clean syntactic way to proceed apart from
  678. c{es lodsb}.
  679. An instruction is not required to use a prefix: prefixes such as
  680. c{CS}, c{A32}, c{LOCK} or c{REPE} can appear on a line by
  681. themselves, and NASM will just generate the prefix bytes.
  682. In addition to actual machine instructions, NASM also supports a
  683. number of pseudo-instructions, described in k{pseudop}.
  684. Instruction i{operands} may take a number of forms: they can be
  685. registers, described simply by the register name (e.g. c{ax},
  686. c{bp}, c{ebx}, c{cr0}: NASM does not use the c{gas}-style
  687. syntax in which register names must be prefixed by a c{%} sign), or
  688. they can be i{effective addresses} (see k{effaddr}), constants
  689. (k{const}) or expressions (k{expr}).
  690. For i{floating-point} instructions, NASM accepts a wide range of
  691. syntaxes: you can use two-operand forms like MASM supports, or you
  692. can use NASM's native single-operand forms in most cases. Details of
  693. all forms of each supported instruction are given in
  694. k{iref}. For example, you can code:
  695. c           fadd st1               ; this sets st0 := st0 + st1
  696. c           fadd st0,st1           ; so does this
  697. c
  698. c           fadd st1,st0           ; this sets st1 := st1 + st0
  699. c           fadd to st1            ; so does this
  700. Almost any floating-point instruction that references memory must
  701. use one of the prefixes ic{DWORD}, ic{QWORD} or ic{TWORD} to
  702. indicate what size of i{memory operand} it refers to.
  703. H{pseudop} i{Pseudo-Instructions}
  704. Pseudo-instructions are things which, though not real x86 machine
  705. instructions, are used in the instruction field anyway because
  706. that's the most convenient place to put them. The current
  707. pseudo-instructions are ic{DB}, ic{DW}, ic{DD}, ic{DQ} and
  708. ic{DT}, their i{uninitialised} counterparts ic{RESB},
  709. ic{RESW}, ic{RESD}, ic{RESQ} and ic{REST}, the ic{INCBIN}
  710. command, the ic{EQU} command, and the ic{TIMES} prefix.
  711. S{db} c{DB} and friends: Declaring Initialised Data
  712. ic{DB}, ic{DW}, ic{DD}, ic{DQ} and ic{DT} are used, much
  713. as in MASM, to declare initialised data in the output file. They can
  714. be invoked in a wide range of ways:
  715. I{floating-point}I{character constant}I{string constant}
  716. c           db 0x55                ; just the byte 0x55
  717. c           db 0x55,0x56,0x57      ; three bytes in succession
  718. c           db 'a',0x55            ; character constants are OK
  719. c           db 'hello',13,10,'$'   ; so are string constants
  720. c           dw 0x1234              ; 0x34 0x12
  721. c           dw 'a'                 ; 0x41 0x00 (it's just a number)
  722. c           dw 'ab'                ; 0x41 0x42 (character constant)
  723. c           dw 'abc'               ; 0x41 0x42 0x43 0x00 (string)
  724. c           dd 0x12345678          ; 0x78 0x56 0x34 0x12
  725. c           dd 1.234567e20         ; floating-point constant
  726. c           dq 1.234567e20         ; double-precision float
  727. c           dt 1.234567e20         ; extended-precision float
  728. c{DQ} and c{DT} do not accept i{numeric constants} or string
  729. constants as operands.
  730. S{resb} c{RESB} and friends: Declaring i{Uninitialised} Data
  731. ic{RESB}, ic{RESW}, ic{RESD}, ic{RESQ} and ic{REST} are
  732. designed to be used in the BSS section of a module: they declare
  733. e{uninitialised} storage space. Each takes a single operand, which
  734. is the number of bytes, words, doublewords or whatever to reserve.
  735. As stated in k{qsother}, NASM does not support the MASM/TASM syntax
  736. of reserving uninitialised space by writing Ic{?}c{DW ?} or
  737. similar things: this is what it does instead. The operand to a
  738. c{RESB}-type pseudo-instruction is a ie{critical expression}: see
  739. k{crit}.
  740. For example:
  741. c buffer:   resb 64                ; reserve 64 bytes
  742. c wordvar:  resw 1                 ; reserve a word
  743. c realarray resq 10                ; array of ten reals
  744. S{incbin} ic{INCBIN}: Including External i{Binary Files}
  745. c{INCBIN} is borrowed from the old Amiga assembler i{DevPac}: it
  746. includes a binary file verbatim into the output file. This can be
  747. handy for (for example) including i{graphics} and i{sound} data
  748. directly into a game executable file. It can be called in one of
  749. these three ways:
  750. c           incbin "file.dat"      ; include the whole file
  751. c           incbin "file.dat",1024 ; skip the first 1024 bytes
  752. c           incbin "file.dat",1024,512 ; skip the first 1024, and
  753. c                                  ; actually include at most 512
  754. S{equ} ic{EQU}: Defining Constants
  755. c{EQU} defines a symbol to a given constant value: when c{EQU} is
  756. used, the source line must contain a label. The action of c{EQU} is
  757. to define the given label name to the value of its (only) operand.
  758. This definition is absolute, and cannot change later. So, for
  759. example,
  760. c message   db 'hello, world'
  761. c msglen    equ $-message
  762. defines c{msglen} to be the constant 12. c{msglen} may not then be
  763. redefined later. This is not a i{preprocessor} definition either:
  764. the value of c{msglen} is evaluated e{once}, using the value of
  765. c{$} (see k{expr} for an explanation of c{$}) at the point of
  766. definition, rather than being evaluated wherever it is referenced
  767. and using the value of c{$} at the point of reference. Note that
  768. the operand to an c{EQU} is also a i{critical expression}
  769. (k{crit}).
  770. S{times} ic{TIMES}: i{Repeating} Instructions or Data
  771. The c{TIMES} prefix causes the instruction to be assembled multiple
  772. times. This is partly present as NASM's equivalent of the ic{DUP}
  773. syntax supported by i{MASM}-compatible assemblers, in that you can
  774. code
  775. c zerobuf:  times 64 db 0
  776. or similar things; but c{TIMES} is more versatile than that. The
  777. argument to c{TIMES} is not just a numeric constant, but a numeric
  778. e{expression}, so you can do things like
  779. c buffer:   db 'hello, world'
  780. c           times 64-$+buffer db ' '
  781. which will store exactly enough spaces to make the total length of
  782. c{buffer} up to 64. Finally, c{TIMES} can be applied to ordinary
  783. instructions, so you can code trivial i{unrolled loops} in it:
  784. c           times 100 movsb
  785. Note that there is no effective difference between c{times 100 resb
  786. 1} and c{resb 100}, except that the latter will be assembled about
  787. 100 times faster due to the internal structure of the assembler.
  788. The operand to c{TIMES}, like that of c{EQU} and those of c{RESB}
  789. and friends, is a critical expression (k{crit}).
  790. Note also that c{TIMES} can't be applied to i{macros}: the reason
  791. for this is that c{TIMES} is processed after the macro phase, which
  792. allows the argument to c{TIMES} to contain expressions such as
  793. c{64-$+buffer} as above. To repeat more than one line of code, or a
  794. complex macro, use the preprocessor ic{%rep} directive.
  795. H{effaddr} Effective Addresses
  796. An i{effective address} is any operand to an instruction which
  797. I{memory reference}references memory. Effective addresses, in NASM,
  798. have a very simple syntax: they consist of an expression evaluating
  799. to the desired address, enclosed in i{square brackets}. For
  800. example:
  801. c wordvar   dw 123
  802. c           mov ax,[wordvar]
  803. c           mov ax,[wordvar+1]
  804. c           mov ax,[es:wordvar+bx]
  805. Anything not conforming to this simple system is not a valid memory
  806. reference in NASM, for example c{es:wordvar[bx]}.
  807. More complicated effective addresses, such as those involving more
  808. than one register, work in exactly the same way:
  809. c           mov eax,[ebx*2+ecx+offset]
  810. c           mov ax,[bp+di+8]
  811. NASM is capable of doing i{algebra} on these effective addresses,
  812. so that things which don't necessarily e{look} legal are perfectly
  813. all right:
  814. c           mov eax,[ebx*5]        ; assembles as [ebx*4+ebx]
  815. c           mov eax,[label1*2-label2] ; ie [label1+(label1-label2)]
  816. Some forms of effective address have more than one assembled form;
  817. in most such cases NASM will generate the smallest form it can. For
  818. example, there are distinct assembled forms for the 32-bit effective
  819. addresses c{[eax*2+0]} and c{[eax+eax]}, and NASM will generally
  820. generate the latter on the grounds that the former requires four
  821. bytes to store a zero offset.
  822. NASM has a hinting mechanism which will cause c{[eax+ebx]} and
  823. c{[ebx+eax]} to generate different opcodes; this is occasionally
  824. useful because c{[esi+ebp]} and c{[ebp+esi]} have different
  825. default segment registers.
  826. However, you can force NASM to generate an effective address in a
  827. particular form by the use of the keywords c{BYTE}, c{WORD},
  828. c{DWORD} and c{NOSPLIT}. If you need c{[eax+3]} to be assembled
  829. using a double-word offset field instead of the one byte NASM will
  830. normally generate, you can code c{[dword eax+3]}. Similarly, you
  831. can force NASM to use a byte offset for a small value which it
  832. hasn't seen on the first pass (see k{crit} for an example of such a
  833. code fragment) by using c{[byte eax+offset]}. As special cases,
  834. c{[byte eax]} will code c{[eax+0]} with a byte offset of zero, and
  835. c{[dword eax]} will code it with a double-word offset of zero. The
  836. normal form, c{[eax]}, will be coded with no offset field.
  837. Similarly, NASM will split c{[eax*2]} into c{[eax+eax]} because
  838. that allows the offset field to be absent and space to be saved; in
  839. fact, it will also split c{[eax*2+offset]} into
  840. c{[eax+eax+offset]}. You can combat this behaviour by the use of
  841. the c{NOSPLIT} keyword: c{[nosplit eax*2]} will force
  842. c{[eax*2+0]} to be generated literally.
  843. H{const} i{Constants}
  844. NASM understands four different types of constant: numeric,
  845. character, string and floating-point.
  846. S{numconst} i{Numeric Constants}
  847. A numeric constant is simply a number. NASM allows you to specify
  848. numbers in a variety of number bases, in a variety of ways: you can
  849. suffix c{H}, c{Q} and c{B} for i{hex}, i{octal} and i{binary},
  850. or you can prefix c{0x} for hex in the style of C, or you can
  851. prefix c{$} for hex in the style of Borland Pascal. Note, though,
  852. that the I{$prefix}c{$} prefix does double duty as a prefix on
  853. identifiers (see k{syntax}), so a hex number prefixed with a c{$}
  854. sign must have a digit after the c{$} rather than a letter.
  855. Some examples:
  856. c           mov ax,100             ; decimal
  857. c           mov ax,0a2h            ; hex
  858. c           mov ax,$0a2            ; hex again: the 0 is required
  859. c           mov ax,0xa2            ; hex yet again
  860. c           mov ax,777q            ; octal
  861. c           mov ax,10010011b       ; binary
  862. S{chrconst} i{Character Constants}
  863. A character constant consists of up to four characters enclosed in
  864. either single or double quotes. The type of quote makes no
  865. difference to NASM, except of course that surrounding the constant
  866. with single quotes allows double quotes to appear within it and vice
  867. versa.
  868. A character constant with more than one character will be arranged
  869. with i{little-endian} order in mind: if you code
  870. c           mov eax,'abcd'
  871. then the constant generated is not c{0x61626364}, but
  872. c{0x64636261}, so that if you were then to store the value into
  873. memory, it would read c{abcd} rather than c{dcba}. This is also
  874. the sense of character constants understood by the Pentium's
  875. ic{CPUID} instruction (see k{insCPUID}).
  876. S{strconst} String Constants
  877. String constants are only acceptable to some pseudo-instructions,
  878. namely the Ic{DW}Ic{DD}Ic{DQ}Ic{DT}ic{DB} family and
  879. ic{INCBIN}.
  880. A string constant looks like a character constant, only longer. It
  881. is treated as a concatenation of maximum-size character constants
  882. for the conditions. So the following are equivalent:
  883. c           db 'hello'             ; string constant
  884. c           db 'h','e','l','l','o' ; equivalent character constants
  885. And the following are also equivalent:
  886. c           dd 'ninechars'         ; doubleword string constant
  887. c           dd 'nine','char','s'   ; becomes three doublewords
  888. c           db 'ninechars',0,0,0   ; and really looks like this
  889. Note that when used as an operand to c{db}, a constant like
  890. c{'ab'} is treated as a string constant despite being short enough
  891. to be a character constant, because otherwise c{db 'ab'} would have
  892. the same effect as c{db 'a'}, which would be silly. Similarly,
  893. three-character or four-character constants are treated as strings
  894. when they are operands to c{dw}.
  895. S{fltconst} I{floating-point, constants}Floating-Point Constants
  896. i{Floating-point} constants are acceptable only as arguments to
  897. ic{DD}, ic{DQ} and ic{DT}. They are expressed in the
  898. traditional form: digits, then a period, then optionally more
  899. digits, then optionally an c{E} followed by an exponent. The period
  900. is mandatory, so that NASM can distinguish between c{dd 1}, which
  901. declares an integer constant, and c{dd 1.0} which declares a
  902. floating-point constant.
  903. Some examples:
  904. c           dd 1.2                 ; an easy one
  905. c           dq 1.e10               ; 10,000,000,000
  906. c           dq 1.e+10              ; synonymous with 1.e10
  907. c           dq 1.e-10              ; 0.000 000 000 1
  908. c           dt 3.141592653589793238462 ; pi
  909. NASM cannot do compile-time arithmetic on floating-point constants.
  910. This is because NASM is designed to be portable - although it always
  911. generates code to run on x86 processors, the assembler itself can
  912. run on any system with an ANSI C compiler. Therefore, the assembler
  913. cannot guarantee the presence of a floating-point unit capable of
  914. handling the i{Intel number formats}, and so for NASM to be able to
  915. do floating arithmetic it would have to include its own complete set
  916. of floating-point routines, which would significantly increase the
  917. size of the assembler for very little benefit.
  918. H{expr} i{Expressions}
  919. Expressions in NASM are similar in syntax to those in C.
  920. NASM does not guarantee the size of the integers used to evaluate
  921. expressions at compile time: since NASM can compile and run on
  922. 64-bit systems quite happily, don't assume that expressions are
  923. evaluated in 32-bit registers and so try to make deliberate use of
  924. i{integer overflow}. It might not always work. The only thing NASM
  925. will guarantee is what's guaranteed by ANSI C: you always have e{at
  926. least} 32 bits to work in.
  927. NASM supports two special tokens in expressions, allowing
  928. calculations to involve the current assembly position: the
  929. I{$ here}c{$} and ic{$$} tokens. c{$} evaluates to the assembly
  930. position at the beginning of the line containing the expression; so
  931. you can code an i{infinite loop} using c{JMP $}. c{$$} evaluates
  932. to the beginning of the current section; so you can tell how far
  933. into the section you are by using c{($-$$)}.
  934. The arithmetic i{operators} provided by NASM are listed here, in
  935. increasing order of i{precedence}.
  936. S{expor} ic{|}: i{Bitwise OR} Operator
  937. The c{|} operator gives a bitwise OR, exactly as performed by the
  938. c{OR} machine instruction. Bitwise OR is the lowest-priority
  939. arithmetic operator supported by NASM.
  940. S{expxor} ic{^}: i{Bitwise XOR} Operator
  941. c{^} provides the bitwise XOR operation.
  942. S{expand} ic{&}: i{Bitwise AND} Operator
  943. c{&} provides the bitwise AND operation.
  944. S{expshift} ic{<<} and ic{>>}: i{Bit Shift} Operators
  945. c{<<} gives a bit-shift to the left, just as it does in C. So c{5<<3}
  946. evaluates to 5 times 8, or 40. c{>>} gives a bit-shift to the
  947. right; in NASM, such a shift is e{always} unsigned, so that
  948. the bits shifted in from the left-hand end are filled with zero
  949. rather than a sign-extension of the previous highest bit.
  950. S{expplmi} I{+ opaddition}c{+} and I{- opsubtraction}c{-}:
  951. i{Addition} and i{Subtraction} Operators
  952. The c{+} and c{-} operators do perfectly ordinary addition and
  953. subtraction.
  954. S{expmul} ic{*}, ic{/}, ic{//}, ic{%} and ic{%%}:
  955. i{Multiplication} and i{Division}
  956. c{*} is the multiplication operator. c{/} and c{//} are both
  957. division operators: c{/} is i{unsigned division} and c{//} is
  958. i{signed division}. Similarly, c{%} and c{%%} provide I{unsigned
  959. modulo}I{modulo operators}unsigned and
  960. i{signed modulo} operators respectively.
  961. NASM, like ANSI C, provides no guarantees about the sensible
  962. operation of the signed modulo operator.
  963. Since the c{%} character is used extensively by the macro
  964. i{preprocessor}, you should ensure that both the signed and unsigned
  965. modulo operators are followed by white space wherever they appear.
  966. S{expmul} i{Unary Operators}: I{+ opunary}c{+}, I{- opunary}c{-},
  967. ic{~} and ic{SEG}
  968. The highest-priority operators in NASM's expression grammar are
  969. those which only apply to one argument. c{-} negates its operand,
  970. c{+} does nothing (it's provided for symmetry with c{-}), c{~}
  971. computes the i{one's complement} of its operand, and c{SEG}
  972. provides the i{segment address} of its operand (explained in more
  973. detail in k{segwrt}).
  974. H{segwrt} ic{SEG} and ic{WRT}
  975. When writing large 16-bit programs, which must be split into
  976. multiple i{segments}, it is often necessary to be able to refer to
  977. the I{segment address}segment part of the address of a symbol. NASM
  978. supports the c{SEG} operator to perform this function.
  979. The c{SEG} operator returns the ie{preferred} segment base of a
  980. symbol, defined as the segment base relative to which the offset of
  981. the symbol makes sense. So the code
  982. c           mov ax,seg symbol
  983. c           mov es,ax
  984. c           mov bx,symbol
  985. will load c{ES:BX} with a valid pointer to the symbol c{symbol}.
  986. Things can be more complex than this: since 16-bit segments and
  987. i{groups} may I{overlapping segments}overlap, you might occasionally
  988. want to refer to some symbol using a different segment base from the
  989. preferred one. NASM lets you do this, by the use of the c{WRT}
  990. (With Reference To) keyword. So you can do things like
  991. c           mov ax,weird_seg       ; weird_seg is a segment base
  992. c           mov es,ax
  993. c           mov bx,symbol wrt weird_seg
  994. to load c{ES:BX} with a different, but functionally equivalent,
  995. pointer to the symbol c{symbol}.
  996. NASM supports far (inter-segment) calls and jumps by means of the
  997. syntax c{call segment:offset}, where c{segment} and c{offset}
  998. both represent immediate values. So to call a far procedure, you
  999. could code either of
  1000. c           call (seg procedure):procedure
  1001. c           call weird_seg:(procedure wrt weird_seg)
  1002. (The parentheses are included for clarity, to show the intended
  1003. parsing of the above instructions. They are not necessary in
  1004. practice.)
  1005. NASM supports the syntax Ic{CALL FAR}c{call far procedure} as a
  1006. synonym for the first of the above usages. c{JMP} works identically
  1007. to c{CALL} in these examples.
  1008. To declare a i{far pointer} to a data item in a data segment, you
  1009. must code
  1010. c           dw symbol, seg symbol
  1011. NASM supports no convenient synonym for this, though you can always
  1012. invent one using the macro processor.
  1013. H{crit} i{Critical Expressions}
  1014. A limitation of NASM is that it is a i{two-pass assembler}; unlike
  1015. TASM and others, it will always do exactly two I{passes}i{assembly
  1016. passes}. Therefore it is unable to cope with source files that are
  1017. complex enough to require three or more passes.
  1018. The first pass is used to determine the size of all the assembled
  1019. code and data, so that the second pass, when generating all the
  1020. code, knows all the symbol addresses the code refers to. So one
  1021. thing NASM can't handle is code whose size depends on the value of a
  1022. symbol declared after the code in question. For example,
  1023. c           times (label-$) db 0
  1024. c label:    db 'Where am I?'
  1025. The argument to ic{TIMES} in this case could equally legally
  1026. evaluate to anything at all; NASM will reject this example because
  1027. it cannot tell the size of the c{TIMES} line when it first sees it.
  1028. It will just as firmly reject the slightly I{paradox}paradoxical
  1029. code
  1030. c           times (label-$+1) db 0
  1031. c label:    db 'NOW where am I?'
  1032. in which e{any} value for the c{TIMES} argument is by definition
  1033. wrong!
  1034. NASM rejects these examples by means of a concept called a
  1035. e{critical expression}, which is defined to be an expression whose
  1036. value is required to be computable in the first pass, and which must
  1037. therefore depend only on symbols defined before it. The argument to
  1038. the c{TIMES} prefix is a critical expression; for the same reason,
  1039. the arguments to the ic{RESB} family of pseudo-instructions are
  1040. also critical expressions.
  1041. Critical expressions can crop up in other contexts as well: consider
  1042. the following code.
  1043. c           mov ax,symbol1
  1044. c symbol1   equ symbol2
  1045. c symbol2:
  1046. On the first pass, NASM cannot determine the value of c{symbol1},
  1047. because c{symbol1} is defined to be equal to c{symbol2} which NASM
  1048. hasn't seen yet. On the second pass, therefore, when it encounters
  1049. the line c{mov ax,symbol1}, it is unable to generate the code for
  1050. it because it still doesn't know the value of c{symbol1}. On the
  1051. next line, it would see the ic{EQU} again and be able to determine
  1052. the value of c{symbol1}, but by then it would be too late.
  1053. NASM avoids this problem by defining the right-hand side of an
  1054. c{EQU} statement to be a critical expression, so the definition of
  1055. c{symbol1} would be rejected in the first pass.
  1056. There is a related issue involving i{forward references}: consider
  1057. this code fragment.
  1058. c           mov eax,[ebx+offset]
  1059. c offset    equ 10
  1060. NASM, on pass one, must calculate the size of the instruction c{mov
  1061. eax,[ebx+offset]} without knowing the value of c{offset}. It has no
  1062. way of knowing that c{offset} is small enough to fit into a
  1063. one-byte offset field and that it could therefore get away with
  1064. generating a shorter form of the i{effective-address} encoding; for
  1065. all it knows, in pass one, c{offset} could be a symbol in the code
  1066. segment, and it might need the full four-byte form. So it is forced
  1067. to compute the size of the instruction to accommodate a four-byte
  1068. address part. In pass two, having made this decision, it is now
  1069. forced to honour it and keep the instruction large, so the code
  1070. generated in this case is not as small as it could have been. This
  1071. problem can be solved by defining c{offset} before using it, or by
  1072. forcing byte size in the effective address by coding c{[byte
  1073. ebx+offset]}.
  1074. H{locallab} i{Local Labels}
  1075. NASM gives special treatment to symbols beginning with a i{period}.
  1076. A label beginning with a single period is treated as a e{local}
  1077. label, which means that it is associated with the previous non-local
  1078. label. So, for example:
  1079. c label1    ; some code
  1080. c .loop     ; some more code
  1081. c           jne .loop
  1082. c           ret
  1083. c label2    ; some code
  1084. c .loop     ; some more code
  1085. c           jne .loop
  1086. c           ret
  1087. In the above code fragment, each c{JNE} instruction jumps to the
  1088. line immediately before it, because the two definitions of c{.loop}
  1089. are kept separate by virtue of each being associated with the
  1090. previous non-local label.
  1091. This form of local label handling is borrowed from the old Amiga
  1092. assembler i{DevPac}; however, NASM goes one step further, in
  1093. allowing access to local labels from other parts of the code. This
  1094. is achieved by means of e{defining} a local label in terms of the
  1095. previous non-local label: the first definition of c{.loop} above is
  1096. really defining a symbol called c{label1.loop}, and the second
  1097. defines a symbol called c{label2.loop}. So, if you really needed
  1098. to, you could write
  1099. c label3    ; some more code
  1100. c           ; and some more
  1101. c           jmp label1.loop
  1102. Sometimes it is useful - in a macro, for instance - to be able to
  1103. define a label which can be referenced from anywhere but which
  1104. doesn't interfere with the normal local-label mechanism. Such a
  1105. label can't be non-local because it would interfere with subsequent
  1106. definitions of, and references to, local labels; and it can't be
  1107. local because the macro that defined it wouldn't know the label's
  1108. full name. NASM therefore introduces a third type of label, which is
  1109. probably only useful in macro definitions: if a label begins with
  1110. the I{label prefix}special prefix ic{..@}, then it does nothing
  1111. to the local label mechanism. So you could code
  1112. c label1:   ; a non-local label
  1113. c .local:   ; this is really label1.local
  1114. c ..@foo:   ; this is a special symbol
  1115. c label2:   ; another non-local label
  1116. c .local:   ; this is really label2.local
  1117. c           jmp ..@foo             ; this will jump three lines up
  1118. NASM has the capacity to define other special symbols beginning with
  1119. a double period: for example, c{..start} is used to specify the
  1120. entry point in the c{obj} output format (see k{dotdotstart}).
  1121. C{preproc} The NASM i{Preprocessor}
  1122. NASM contains a powerful i{macro processor}, which supports
  1123. conditional assembly, multi-level file inclusion, two forms of macro
  1124. (single-line and multi-line), and a `context stack' mechanism for
  1125. extra macro power. Preprocessor directives all begin with a c{%}
  1126. sign.
  1127. H{slmacro} i{Single-Line Macros}
  1128. S{define} The Normal Way: Ic{%idefine}ic{%define}
  1129. Single-line macros are defined using the c{%define} preprocessor
  1130. directive. The definitions work in a similar way to C; so you can do
  1131. things like
  1132. c %define ctrl 0x1F &
  1133. c %define param(a,b) ((a)+(a)*(b))
  1134. c           mov byte [param(2,ebx)], ctrl 'D'
  1135. which will expand to
  1136. c           mov byte [(2)+(2)*(ebx)], 0x1F & 'D'
  1137. When the expansion of a single-line macro contains tokens which
  1138. invoke another macro, the expansion is performed at invocation time,
  1139. not at definition time. Thus the code
  1140. c %define a(x) 1+b(x)
  1141. c %define b(x) 2*x
  1142. c           mov ax,a(8)
  1143. will evaluate in the expected way to c{mov ax,1+2*8}, even though
  1144. the macro c{b} wasn't defined at the time of definition of c{a}.
  1145. Macros defined with c{%define} are i{case sensitive}: after
  1146. c{%define foo bar}, only c{foo} will expand to c{bar}: c{Foo} or
  1147. c{FOO} will not. By using c{%idefine} instead of c{%define} (the
  1148. `i' stands for `insensitive') you can define all the case variants
  1149. of a macro at once, so that c{%idefine foo bar} would cause
  1150. c{foo}, c{Foo}, c{FOO}, c{fOO} and so on all to expand to
  1151. c{bar}.
  1152. There is a mechanism which detects when a macro call has occurred as
  1153. a result of a previous expansion of the same macro, to guard against
  1154. i{circular references} and infinite loops. If this happens, the
  1155. preprocessor will only expand the first occurrence of the macro.
  1156. Hence, if you code
  1157. c %define a(x) 1+a(x)
  1158. c           mov ax,a(3)
  1159. the macro c{a(3)} will expand once, becoming c{1+a(3)}, and will
  1160. then expand no further. This behaviour can be useful: see k{32c}
  1161. for an example of its use.
  1162. You can I{overloading, single-line macros}overload single-line
  1163. macros: if you write
  1164. c %define foo(x) 1+x
  1165. c %define foo(x,y) 1+x*y
  1166. the preprocessor will be able to handle both types of macro call,
  1167. by counting the parameters you pass; so c{foo(3)} will become
  1168. c{1+3} whereas c{foo(ebx,2)} will become c{1+ebx*2}. However, if
  1169. you define
  1170. c %define foo bar
  1171. then no other definition of c{foo} will be accepted: a macro with
  1172. no parameters prohibits the definition of the same name as a macro
  1173. e{with} parameters, and vice versa.
  1174. This doesn't prevent single-line macros being e{redefined}: you can
  1175. perfectly well define a macro with
  1176. c %define foo bar
  1177. and then re-define it later in the same source file with
  1178. c %define foo baz
  1179. Then everywhere the macro c{foo} is invoked, it will be expanded
  1180. according to the most recent definition. This is particularly useful
  1181. when defining single-line macros with c{%assign} (see k{assign}).
  1182. You can i{pre-define} single-line macros using the `-d' option on
  1183. the NASM command line: see k{opt-d}.
  1184. S{undef} Undefining macros: ic{%undef}
  1185. Single-line macros can be removed with the c{%undef} command.  For
  1186. example, the following sequence:
  1187. c %define foo bar
  1188. c %undef foo
  1189. c  mov eax, foo
  1190. will expand to the instruction c{mov eax, foo}, since after
  1191. c{%undef} the macro c{foo} is no longer defined.
  1192. Macros that would otherwise be pre-defined can be undefined on the
  1193. command-line using the `-u' option on the NASM command line: see
  1194. k{opt-u}.
  1195. S{assign} i{Preprocessor Variables}: ic{%assign}
  1196. An alternative way to define single-line macros is by means of the
  1197. c{%assign} command (and its i{case sensitive}case-insensitive
  1198. counterpart ic{%iassign}, which differs from c{%assign} in
  1199. exactly the same way that c{%idefine} differs from c{%define}).
  1200. c{%assign} is used to define single-line macros which take no
  1201. parameters and have a numeric value. This value can be specified in
  1202. the form of an expression, and it will be evaluated once, when the
  1203. c{%assign} directive is processed.
  1204. Like c{%define}, macros defined using c{%assign} can be re-defined
  1205. later, so you can do things like
  1206. c %assign i i+1
  1207. to increment the numeric value of a macro.
  1208. c{%assign} is useful for controlling the termination of c{%rep}
  1209. preprocessor loops: see k{rep} for an example of this. Another
  1210. use for c{%assign} is given in k{16c} and k{32c}.
  1211. The expression passed to c{%assign} is a i{critical expression}
  1212. (see k{crit}), and must also evaluate to a pure number (rather than
  1213. a relocatable reference such as a code or data address, or anything
  1214. involving a register).
  1215. H{mlmacro} i{Multi-Line Macros}: Ic{%imacro}ic{%macro}
  1216. Multi-line macros are much more like the type of macro seen in MASM
  1217. and TASM: a multi-line macro definition in NASM looks something like
  1218. this.
  1219. c %macro prologue 1
  1220. c           push ebp
  1221. c           mov ebp,esp
  1222. c           sub esp,%1
  1223. c %endmacro
  1224. This defines a C-like function prologue as a macro: so you would
  1225. invoke the macro with a call such as
  1226. c myfunc:   prologue 12
  1227. which would expand to the three lines of code
  1228. c myfunc:   push ebp
  1229. c           mov ebp,esp
  1230. c           sub esp,12
  1231. The number c{1} after the macro name in the c{%macro} line defines
  1232. the number of parameters the macro c{prologue} expects to receive.
  1233. The use of c{%1} inside the macro definition refers to the first
  1234. parameter to the macro call. With a macro taking more than one
  1235. parameter, subsequent parameters would be referred to as c{%2},
  1236. c{%3} and so on.
  1237. Multi-line macros, like single-line macros, are i{case-sensitive},
  1238. unless you define them using the alternative directive c{%imacro}.
  1239. If you need to pass a comma as e{part} of a parameter to a
  1240. multi-line macro, you can do that by enclosing the entire parameter
  1241. in I{braces, around macro parameters}braces. So you could code
  1242. things like
  1243. c %macro silly 2
  1244. c %2:       db %1
  1245. c %endmacro
  1246. c           silly 'a', letter_a    ; letter_a:  db 'a'
  1247. c           silly 'ab', string_ab  ; string_ab: db 'ab'
  1248. c           silly {13,10}, crlf    ; crlf:      db 13,10
  1249. S{mlmacover} i{Overloading Multi-Line Macros}
  1250. As with single-line macros, multi-line macros can be overloaded by
  1251. defining the same macro name several times with different numbers of
  1252. parameters. This time, no exception is made for macros with no
  1253. parameters at all. So you could define
  1254. c %macro prologue 0
  1255. c           push ebp
  1256. c           mov ebp,esp
  1257. c %endmacro
  1258. to define an alternative form of the function prologue which
  1259. allocates no local stack space.
  1260. Sometimes, however, you might want to `overload' a machine
  1261. instruction; for example, you might want to define
  1262. c %macro push 2
  1263. c           push %1
  1264. c           push %2
  1265. c %endmacro
  1266. so that you could code
  1267. c           push ebx               ; this line is not a macro call
  1268. c           push eax,ecx           ; but this one is
  1269. Ordinarily, NASM will give a warning for the first of the above two
  1270. lines, since c{push} is now defined to be a macro, and is being
  1271. invoked with a number of parameters for which no definition has been
  1272. given. The correct code will still be generated, but the assembler
  1273. will give a warning. This warning can be disabled by the use of the
  1274. c{-w-macro-params} command-line option (see k{opt-w}).
  1275. S{maclocal} i{Macro-Local Labels}
  1276. NASM allows you to define labels within a multi-line macro
  1277. definition in such a way as to make them local to the macro call: so
  1278. calling the same macro multiple times will use a different label
  1279. each time. You do this by prefixing ic{%%} to the label name. So
  1280. you can invent an instruction which executes a c{RET} if the c{Z}
  1281. flag is set by doing this:
  1282. c %macro retz 0
  1283. c           jnz %%skip
  1284. c           ret
  1285. c %%skip:
  1286. c %endmacro
  1287. You can call this macro as many times as you want, and every time
  1288. you call it NASM will make up a different `real' name to substitute
  1289. for the label c{%%skip}. The names NASM invents are of the form
  1290. c{..@2345.skip}, where the number 2345 changes with every macro
  1291. call. The ic{..@} prefix prevents macro-local labels from
  1292. interfering with the local label mechanism, as described in
  1293. k{locallab}. You should avoid defining your own labels in this form
  1294. (the c{..@} prefix, then a number, then another period) in case
  1295. they interfere with macro-local labels.
  1296. S{mlmacgre} i{Greedy Macro Parameters}
  1297. Occasionally it is useful to define a macro which lumps its entire
  1298. command line into one parameter definition, possibly after
  1299. extracting one or two smaller parameters from the front. An example
  1300. might be a macro to write a text string to a file in MS-DOS, where
  1301. you might want to be able to write
  1302. c           writefile [filehandle],"hello, world",13,10
  1303. NASM allows you to define the last parameter of a macro to be
  1304. e{greedy}, meaning that if you invoke the macro with more
  1305. parameters than it expects, all the spare parameters get lumped into
  1306. the last defined one along with the separating commas. So if you
  1307. code:
  1308. c %macro writefile 2+
  1309. c           jmp %%endstr
  1310. c %%str:    db %2
  1311. c %%endstr: mov dx,%%str
  1312. c           mov cx,%%endstr-%%str
  1313. c           mov bx,%1
  1314. c           mov ah,0x40
  1315. c           int 0x21
  1316. c %endmacro
  1317. then the example call to c{writefile} above will work as expected:
  1318. the text before the first comma, c{[filehandle]}, is used as the
  1319. first macro parameter and expanded when c{%1} is referred to, and
  1320. all the subsequent text is lumped into c{%2} and placed after the
  1321. c{db}.
  1322. The greedy nature of the macro is indicated to NASM by the use of
  1323. the I{+ modifier}c{+} sign after the parameter count on the
  1324. c{%macro} line.
  1325. If you define a greedy macro, you are effectively telling NASM how
  1326. it should expand the macro given e{any} number of parameters from
  1327. the actual number specified up to infinity; in this case, for
  1328. example, NASM now knows what to do when it sees a call to
  1329. c{writefile} with 2, 3, 4 or more parameters. NASM will take this
  1330. into account when overloading macros, and will not allow you to
  1331. define another form of c{writefile} taking 4 parameters (for
  1332. example).
  1333. Of course, the above macro could have been implemented as a
  1334. non-greedy macro, in which case the call to it would have had to
  1335. look like
  1336. c           writefile [filehandle], {"hello, world",13,10}
  1337. NASM provides both mechanisms for putting i{commas in macro
  1338. parameters}, and you choose which one you prefer for each macro
  1339. definition.
  1340. See k{sectmac} for a better way to write the above macro.
  1341. S{mlmacdef} i{Default Macro Parameters}
  1342. NASM also allows you to define a multi-line macro with a e{range}
  1343. of allowable parameter counts. If you do this, you can specify
  1344. defaults for i{omitted parameters}. So, for example:
  1345. c %macro die 0-1 "Painful program death has occurred."
  1346. c           writefile 2,%1
  1347. c           mov ax,0x4c01
  1348. c           int 0x21
  1349. c %endmacro
  1350. This macro (which makes use of the c{writefile} macro defined in
  1351. k{mlmacgre}) can be called with an explicit error message, which it
  1352. will display on the error output stream before exiting, or it can be
  1353. called with no parameters, in which case it will use the default
  1354. error message supplied in the macro definition.
  1355. In general, you supply a minimum and maximum number of parameters
  1356. for a macro of this type; the minimum number of parameters are then
  1357. required in the macro call, and then you provide defaults for the
  1358. optional ones. So if a macro definition began with the line
  1359. c %macro foobar 1-3 eax,[ebx+2]
  1360. then it could be called with between one and three parameters, and
  1361. c{%1} would always be taken from the macro call. c{%2}, if not
  1362. specified by the macro call, would default to c{eax}, and c{%3} if
  1363. not specified would default to c{[ebx+2]}.
  1364. You may omit parameter defaults from the macro definition, in which
  1365. case the parameter default is taken to be blank. This can be useful
  1366. for macros which can take a variable number of parameters, since the
  1367. ic{%0} token (see k{percent0}) allows you to determine how many
  1368. parameters were really passed to the macro call.
  1369. This defaulting mechanism can be combined with the greedy-parameter
  1370. mechanism; so the c{die} macro above could be made more powerful,
  1371. and more useful, by changing the first line of the definition to
  1372. c %macro die 0-1+ "Painful program death has occurred.",13,10
  1373. The maximum parameter count can be infinite, denoted by c{*}. In
  1374. this case, of course, it is impossible to provide a e{full} set of
  1375. default parameters. Examples of this usage are shown in k{rotate}.
  1376. S{percent0} ic{%0}: I{counting macro parameters}Macro Parameter Counter
  1377. For a macro which can take a variable number of parameters, the
  1378. parameter reference c{%0} will return a numeric constant giving the
  1379. number of parameters passed to the macro. This can be used as an
  1380. argument to c{%rep} (see k{rep}) in order to iterate through all
  1381. the parameters of a macro. Examples are given in k{rotate}.
  1382. S{rotate} ic{%rotate}: i{Rotating Macro Parameters}
  1383. Unix shell programmers will be familiar with the I{shift
  1384. command}c{shift} shell command, which allows the arguments passed
  1385. to a shell script (referenced as c{$1}, c{$2} and so on) to be
  1386. moved left by one place, so that the argument previously referenced
  1387. as c{$2} becomes available as c{$1}, and the argument previously
  1388. referenced as c{$1} is no longer available at all.
  1389. NASM provides a similar mechanism, in the form of c{%rotate}. As
  1390. its name suggests, it differs from the Unix c{shift} in that no
  1391. parameters are lost: parameters rotated off the left end of the
  1392. argument list reappear on the right, and vice versa.
  1393. c{%rotate} is invoked with a single numeric argument (which may be
  1394. an expression). The macro parameters are rotated to the left by that
  1395. many places. If the argument to c{%rotate} is negative, the macro
  1396. parameters are rotated to the right.
  1397. I{iterating over macro parameters}So a pair of macros to save and
  1398. restore a set of registers might work as follows:
  1399. c %macro multipush 1-*
  1400. c %rep %0
  1401. c           push %1
  1402. c %rotate 1
  1403. c %endrep
  1404. c %endmacro
  1405. This macro invokes the c{PUSH} instruction on each of its arguments
  1406. in turn, from left to right. It begins by pushing its first
  1407. argument, c{%1}, then invokes c{%rotate} to move all the arguments
  1408. one place to the left, so that the original second argument is now
  1409. available as c{%1}. Repeating this procedure as many times as there
  1410. were arguments (achieved by supplying c{%0} as the argument to
  1411. c{%rep}) causes each argument in turn to be pushed.
  1412. Note also the use of c{*} as the maximum parameter count,
  1413. indicating that there is no upper limit on the number of parameters
  1414. you may supply to the ic{multipush} macro.
  1415. It would be convenient, when using this macro, to have a c{POP}
  1416. equivalent, which e{didn't} require the arguments to be given in
  1417. reverse order. Ideally, you would write the c{multipush} macro
  1418. call, then cut-and-paste the line to where the pop needed to be
  1419. done, and change the name of the called macro to c{multipop}, and
  1420. the macro would take care of popping the registers in the opposite
  1421. order from the one in which they were pushed.
  1422. This can be done by the following definition:
  1423. c %macro multipop 1-*
  1424. c %rep %0
  1425. c %rotate -1
  1426. c           pop %1
  1427. c %endrep
  1428. c %endmacro
  1429. This macro begins by rotating its arguments one place to the
  1430. e{right}, so that the original e{last} argument appears as c{%1}.
  1431. This is then popped, and the arguments are rotated right again, so
  1432. the second-to-last argument becomes c{%1}. Thus the arguments are
  1433. iterated through in reverse order.
  1434. S{concat} i{Concatenating Macro Parameters}
  1435. NASM can concatenate macro parameters on to other text surrounding
  1436. them. This allows you to declare a family of symbols, for example,
  1437. in a macro definition. If, for example, you wanted to generate a
  1438. table of key codes along with offsets into the table, you could code
  1439. something like
  1440. c %macro keytab_entry 2
  1441. c keypos%1 equ $-keytab
  1442. c           db %2
  1443. c %endmacro
  1444. c keytab:
  1445. c           keytab_entry F1,128+1
  1446. c           keytab_entry F2,128+2
  1447. c           keytab_entry Return,13
  1448. which would expand to
  1449. c keytab:
  1450. c keyposF1 equ $-keytab
  1451. c           db 128+1
  1452. c keyposF2 equ $-keytab
  1453. c           db 128+2
  1454. c keyposReturn equ $-keytab
  1455. c           db 13
  1456. You can just as easily concatenate text on to the other end of a
  1457. macro parameter, by writing c{%1foo}.
  1458. If you need to append a e{digit} to a macro parameter, for example
  1459. defining labels c{foo1} and c{foo2} when passed the parameter
  1460. c{foo}, you can't code c{%11} because that would be taken as the
  1461. eleventh macro parameter. Instead, you must code
  1462. I{braces, after % sign}c{%{1}1}, which will separate the first
  1463. c{1} (giving the number of the macro parameter) from the second
  1464. (literal text to be concatenated to the parameter).
  1465. This concatenation can also be applied to other preprocessor in-line
  1466. objects, such as macro-local labels (k{maclocal}) and context-local
  1467. labels (k{ctxlocal}). In all cases, ambiguities in syntax can be
  1468. resolved by enclosing everything after the c{%} sign and before the
  1469. literal text in braces: so c{%{%foo}bar} concatenates the text
  1470. c{bar} to the end of the real name of the macro-local label
  1471. c{%%foo}. (This is unnecessary, since the form NASM uses for the
  1472. real names of macro-local labels means that the two usages
  1473. c{%{%foo}bar} and c{%%foobar} would both expand to the same
  1474. thing anyway; nevertheless, the capability is there.)
  1475. S{mlmaccc} i{Condition Codes as Macro Parameters}
  1476. NASM can give special treatment to a macro parameter which contains
  1477. a condition code. For a start, you can refer to the macro parameter
  1478. c{%1} by means of the alternative syntax ic{%+1}, which informs
  1479. NASM that this macro parameter is supposed to contain a condition
  1480. code, and will cause the preprocessor to report an error message if
  1481. the macro is called with a parameter which is e{not} a valid
  1482. condition code.
  1483. Far more usefully, though, you can refer to the macro parameter by
  1484. means of ic{%-1}, which NASM will expand as the e{inverse}
  1485. condition code. So the c{retz} macro defined in k{maclocal} can be
  1486. replaced by a general i{conditional-return macro} like this:
  1487. c %macro retc 1
  1488. c           j%-1 %%skip
  1489. c           ret
  1490. c %%skip:
  1491. c %endmacro
  1492. This macro can now be invoked using calls like c{retc ne}, which
  1493. will cause the conditional-jump instruction in the macro expansion
  1494. to come out as c{JE}, or c{retc po} which will make the jump a
  1495. c{JPE}.
  1496. The c{%+1} macro-parameter reference is quite happy to interpret
  1497. the arguments c{CXZ} and c{ECXZ} as valid condition codes;
  1498. however, c{%-1} will report an error if passed either of these,
  1499. because no inverse condition code exists.
  1500. S{nolist} i{Disabling Listing Expansion}Ic{.nolist}
  1501. When NASM is generating a listing file from your program, it will
  1502. generally expand multi-line macros by means of writing the macro
  1503. call and then listing each line of the expansion. This allows you to
  1504. see which instructions in the macro expansion are generating what
  1505. code; however, for some macros this clutters the listing up
  1506. unnecessarily.
  1507. NASM therefore provides the c{.nolist} qualifier, which you can
  1508. include in a macro definition to inhibit the expansion of the macro
  1509. in the listing file. The c{.nolist} qualifier comes directly after
  1510. the number of parameters, like this:
  1511. c %macro foo 1.nolist
  1512. Or like this:
  1513. c %macro bar 1-5+.nolist a,b,c,d,e,f,g,h
  1514. H{condasm} i{Conditional Assembly}Ic{%if}
  1515. Similarly to the C preprocessor, NASM allows sections of a source
  1516. file to be assembled only if certain conditions are met. The general
  1517. syntax of this feature looks like this:
  1518. c %if<condition>
  1519. c ; some code which only appears if <condition> is met
  1520. c %elif<condition2>
  1521. c ; only appears if <condition> is not met but <condition2> is
  1522. c %else
  1523. c ; this appears if neither <condition> nor <condition2> was met
  1524. c %endif
  1525. The ic{%else} clause is optional, as is the ic{%elif} clause.
  1526. You can have more than one c{%elif} clause as well.
  1527. S{ifdef} ic{%ifdef}: i{Testing Single-Line Macro Existence}
  1528. Beginning a conditional-assembly block with the line c{%ifdef
  1529. MACRO} will assemble the subsequent code if, and only if, a
  1530. single-line macro called c{MACRO} is defined. If not, then the
  1531. c{%elif} and c{%else} blocks (if any) will be processed instead.
  1532. For example, when debugging a program, you might want to write code
  1533. such as
  1534. c           ; perform some function
  1535. c %ifdef DEBUG
  1536. c           writefile 2,"Function performed successfully",13,10
  1537. c %endif
  1538. c           ; go and do something else
  1539. Then you could use the command-line option c{-dDEBUG} to create a
  1540. version of the program which produced debugging messages, and remove
  1541. the option to generate the final release version of the program.
  1542. You can test for a macro e{not} being defined by using
  1543. ic{%ifndef} instead of c{%ifdef}. You can also test for macro
  1544. definitions in c{%elif} blocks by using ic{%elifdef} and
  1545. ic{%elifndef}.
  1546. S{ifctx} ic{%ifctx}: i{Testing the Context Stack}
  1547. The conditional-assembly construct c{%ifctx ctxname} will cause the
  1548. subsequent code to be assembled if and only if the top context on
  1549. the preprocessor's context stack has the name c{ctxname}. As with
  1550. c{%ifdef}, the inverse and c{%elif} forms ic{%ifnctx},
  1551. ic{%elifctx} and ic{%elifnctx} are also supported.
  1552. For more details of the context stack, see k{ctxstack}. For a
  1553. sample use of c{%ifctx}, see k{blockif}.
  1554. S{if} ic{%if}: i{Testing Arbitrary Numeric Expressions}
  1555. The conditional-assembly construct c{%if expr} will cause the
  1556. subsequent code to be assembled if and only if the value of the
  1557. numeric expression c{expr} is non-zero. An example of the use of
  1558. this feature is in deciding when to break out of a c{%rep}
  1559. preprocessor loop: see k{rep} for a detailed example.
  1560. The expression given to c{%if}, and its counterpart ic{%elif}, is
  1561. a critical expression (see k{crit}).
  1562. c{%if} extends the normal NASM expression syntax, by providing a
  1563. set of i{relational operators} which are not normally available in
  1564. expressions. The operators ic{=}, ic{<}, ic{>}, ic{<=},
  1565. ic{>=} and ic{<>} test equality, less-than, greater-than,
  1566. less-or-equal, greater-or-equal and not-equal respectively. The
  1567. C-like forms ic{==} and ic{!=} are supported as alternative
  1568. forms of c{=} and c{<>}. In addition, low-priority logical
  1569. operators ic{&&}, ic{^^} and ic{||} are provided, supplying
  1570. i{logical AND}, i{logical XOR} and i{logical OR}. These work like
  1571. the C logical operators (although C has no logical XOR), in that
  1572. they always return either 0 or 1, and treat any non-zero input as 1
  1573. (so that c{^^}, for example, returns 1 if exactly one of its inputs
  1574. is zero, and 0 otherwise). The relational operators also return 1
  1575. for true and 0 for false.
  1576. S{ifidn} ic{%ifidn} and ic{%ifidni}: i{Testing Exact Text
  1577. Identity}
  1578. The construct c{%ifidn text1,text2} will cause the subsequent code
  1579. to be assembled if and only if c{text1} and c{text2}, after
  1580. expanding single-line macros, are identical pieces of text.
  1581. Differences in white space are not counted.
  1582. c{%ifidni} is similar to c{%ifidn}, but is i{case-insensitive}.
  1583. For example, the following macro pushes a register or number on the
  1584. stack, and allows you to treat c{IP} as a real register:
  1585. c %macro pushparam 1
  1586. c %ifidni %1,ip
  1587. c           call %%label
  1588. c %%label:
  1589. c %else
  1590. c           push %1
  1591. c %endif
  1592. c %endmacro
  1593. Like most other c{%if} constructs, c{%ifidn} has a counterpart
  1594. ic{%elifidn}, and negative forms ic{%ifnidn} and ic{%elifnidn}.
  1595. Similarly, c{%ifidni} has counterparts ic{%elifidni},
  1596. ic{%ifnidni} and ic{%elifnidni}.
  1597. S{iftyp} ic{%ifid}, ic{%ifnum}, ic{%ifstr}: i{Testing Token
  1598. Types}
  1599. Some macros will want to perform different tasks depending on
  1600. whether they are passed a number, a string, or an identifier. For
  1601. example, a string output macro might want to be able to cope with
  1602. being passed either a string constant or a pointer to an existing
  1603. string.
  1604. The conditional assembly construct c{%ifid}, taking one parameter
  1605. (which may be blank), assembles the subsequent code if and only if
  1606. the first token in the parameter exists and is an identifier.
  1607. c{%ifnum} works similarly, but tests for the token being a numeric
  1608. constant; c{%ifstr} tests for it being a string.
  1609. For example, the c{writefile} macro defined in k{mlmacgre} can be
  1610. extended to take advantage of c{%ifstr} in the following fashion:
  1611. c %macro writefile 2-3+
  1612. c %ifstr %2
  1613. c           jmp %%endstr
  1614. c %if %0 = 3
  1615. c %%str:   db %2,%3
  1616. c %else
  1617. c %%str:   db %2
  1618. c %endif
  1619. c %%endstr: mov dx,%%str
  1620. c           mov cx,%%endstr-%%str
  1621. c %else
  1622. c    mov dx,%2
  1623. c    mov cx,%3
  1624. c %endif
  1625. c           mov bx,%1
  1626. c           mov ah,0x40
  1627. c           int 0x21
  1628. c %endmacro
  1629. Then the c{writefile} macro can cope with being called in either of
  1630. the following two ways:
  1631. c           writefile [file], strpointer, length
  1632. c           writefile [file], "hello", 13, 10
  1633. In the first, c{strpointer} is used as the address of an
  1634. already-declared string, and c{length} is used as its length; in
  1635. the second, a string is given to the macro, which therefore declares
  1636. it itself and works out the address and length for itself.
  1637. Note the use of c{%if} inside the c{%ifstr}: this is to detect
  1638. whether the macro was passed two arguments (so the string would be a
  1639. single string constant, and c{db %2} would be adequate) or more (in
  1640. which case, all but the first two would be lumped together into
  1641. c{%3}, and c{db %2,%3} would be required).
  1642. Ic{%ifnid}Ic{%elifid}Ic{%elifnid}Ic{%ifnnum}Ic{%elifnum}Ic{%elifnnum}Ic{%ifnstr}Ic{%elifstr}Ic{%elifnstr}
  1643. The usual c{%elifXXX}, c{%ifnXXX} and c{%elifnXXX} versions exist
  1644. for each of c{%ifid}, c{%ifnum} and c{%ifstr}.
  1645. S{pperror} ic{%error}: Reporting i{User-Defined Errors}
  1646. The preprocessor directive c{%error} will cause NASM to report an
  1647. error if it occurs in assembled code. So if other users are going to
  1648. try to assemble your source files, you can ensure that they define
  1649. the right macros by means of code like this:
  1650. c %ifdef SOME_MACRO
  1651. c ; do some setup
  1652. c %elifdef SOME_OTHER_MACRO
  1653. c ; do some different setup
  1654. c %else
  1655. c %error Neither SOME_MACRO nor SOME_OTHER_MACRO was defined.
  1656. c %endif
  1657. Then any user who fails to understand the way your code is supposed
  1658. to be assembled will be quickly warned of their mistake, rather than
  1659. having to wait until the program crashes on being run and then not
  1660. knowing what went wrong.
  1661. H{rep} i{Preprocessor Loops}I{repeating code}: ic{%rep}
  1662. NASM's c{TIMES} prefix, though useful, cannot be used to invoke a
  1663. multi-line macro multiple times, because it is processed by NASM
  1664. after macros have already been expanded. Therefore NASM provides
  1665. another form of loop, this time at the preprocessor level: c{%rep}.
  1666. The directives c{%rep} and ic{%endrep} (c{%rep} takes a numeric
  1667. argument, which can be an expression; c{%endrep} takes no
  1668. arguments) can be used to enclose a chunk of code, which is then
  1669. replicated as many times as specified by the preprocessor:
  1670. c %assign i 0
  1671. c %rep 64
  1672. c           inc word [table+2*i]
  1673. c %assign i i+1
  1674. c %endrep
  1675. This will generate a sequence of 64 c{INC} instructions,
  1676. incrementing every word of memory from c{[table]} to
  1677. c{[table+126]}.
  1678. For more complex termination conditions, or to break out of a repeat
  1679. loop part way along, you can use the ic{%exitrep} directive to
  1680. terminate the loop, like this:
  1681. c fibonacci:
  1682. c %assign i 0
  1683. c %assign j 1
  1684. c %rep 100
  1685. c %if j > 65535
  1686. c %exitrep
  1687. c %endif
  1688. c           dw j
  1689. c %assign k j+i
  1690. c %assign i j
  1691. c %assign j k
  1692. c %endrep
  1693. c fib_number equ ($-fibonacci)/2
  1694. This produces a list of all the Fibonacci numbers that will fit in
  1695. 16 bits. Note that a maximum repeat count must still be given to
  1696. c{%rep}. This is to prevent the possibility of NASM getting into an
  1697. infinite loop in the preprocessor, which (on multitasking or
  1698. multi-user systems) would typically cause all the system memory to
  1699. be gradually used up and other applications to start crashing.
  1700. H{include} i{Including Other Files}
  1701. Using, once again, a very similar syntax to the C preprocessor,
  1702. NASM's preprocessor lets you include other source files into your
  1703. code. This is done by the use of the ic{%include} directive:
  1704. c %include "macros.mac"
  1705. will include the contents of the file c{macros.mac} into the source
  1706. file containing the c{%include} directive.
  1707. Include files are I{searching for include files}searched for in the
  1708. current directory (the directory you're in when you run NASM, as
  1709. opposed to the location of the NASM executable or the location of
  1710. the source file), plus any directories specified on the NASM command
  1711. line using the c{-i} option.
  1712. The standard C idiom for preventing a file being included more than
  1713. once is just as applicable in NASM: if the file c{macros.mac} has
  1714. the form
  1715. c %ifndef MACROS_MAC
  1716. c %define MACROS_MAC
  1717. c ; now define some macros
  1718. c %endif
  1719. then including the file more than once will not cause errors,
  1720. because the second time the file is included nothing will happen
  1721. because the macro c{MACROS_MAC} will already be defined.
  1722. You can force a file to be included even if there is no c{%include}
  1723. directive that explicitly includes it, by using the ic{-p} option
  1724. on the NASM command line (see k{opt-p}).
  1725. H{ctxstack} The i{Context Stack}
  1726. Having labels that are local to a macro definition is sometimes not
  1727. quite powerful enough: sometimes you want to be able to share labels
  1728. between several macro calls. An example might be a c{REPEAT} ...
  1729. c{UNTIL} loop, in which the expansion of the c{REPEAT} macro
  1730. would need to be able to refer to a label which the c{UNTIL} macro
  1731. had defined. However, for such a macro you would also want to be
  1732. able to nest these loops.
  1733. NASM provides this level of power by means of a e{context stack}.
  1734. The preprocessor maintains a stack of e{contexts}, each of which is
  1735. characterised by a name. You add a new context to the stack using
  1736. the ic{%push} directive, and remove one using ic{%pop}. You can
  1737. define labels that are local to a particular context on the stack.
  1738. S{pushpop} ic{%push} and ic{%pop}: I{creating
  1739. contexts}I{removing contexts}Creating and Removing Contexts
  1740. The c{%push} directive is used to create a new context and place it
  1741. on the top of the context stack. c{%push} requires one argument,
  1742. which is the name of the context. For example:
  1743. c %push foobar
  1744. This pushes a new context called c{foobar} on the stack. You can
  1745. have several contexts on the stack with the same name: they can
  1746. still be distinguished.
  1747. The directive c{%pop}, requiring no arguments, removes the top
  1748. context from the context stack and destroys it, along with any
  1749. labels associated with it.
  1750. S{ctxlocal} i{Context-Local Labels}
  1751. Just as the usage c{%%foo} defines a label which is local to the
  1752. particular macro call in which it is used, the usage I{%$}c{%$foo}
  1753. is used to define a label which is local to the context on the top
  1754. of the context stack. So the c{REPEAT} and c{UNTIL} example given
  1755. above could be implemented by means of:
  1756. c %macro repeat 0
  1757. c %push repeat
  1758. c %$begin:
  1759. c %endmacro
  1760. c %macro until 1
  1761. c           j%-1 %$begin
  1762. c %pop
  1763. c %endmacro
  1764. and invoked by means of, for example,
  1765. c           mov cx,string
  1766. c           repeat
  1767. c           add cx,3
  1768. c           scasb
  1769. c           until e
  1770. which would scan every fourth byte of a string in search of the byte
  1771. in c{AL}.
  1772. If you need to define, or access, labels local to the context
  1773. e{below} the top one on the stack, you can use I{%$$}c{%$$foo}, or
  1774. c{%$$$foo} for the context below that, and so on.
  1775. S{ctxdefine} i{Context-Local Single-Line Macros}
  1776. NASM also allows you to define single-line macros which are local to
  1777. a particular context, in just the same way:
  1778. c %define %$localmac 3
  1779. will define the single-line macro c{%$localmac} to be local to the
  1780. top context on the stack. Of course, after a subsequent c{%push},
  1781. it can then still be accessed by the name c{%$$localmac}.
  1782. S{ctxrepl} ic{%repl}: I{renaming contexts}Renaming a Context
  1783. If you need to change the name of the top context on the stack (in
  1784. order, for example, to have it respond differently to c{%ifctx}),
  1785. you can execute a c{%pop} followed by a c{%push}; but this will
  1786. have the side effect of destroying all context-local labels and
  1787. macros associated with the context that was just popped.
  1788. NASM provides the directive c{%repl}, which e{replaces} a context
  1789. with a different name, without touching the associated macros and
  1790. labels. So you could replace the destructive code
  1791. c %pop
  1792. c %push newname
  1793. with the non-destructive version c{%repl newname}.
  1794. S{blockif} Example Use of the i{Context Stack}: i{Block IFs}
  1795. This example makes use of almost all the context-stack features,
  1796. including the conditional-assembly construct ic{%ifctx}, to
  1797. implement a block IF statement as a set of macros.
  1798. c %macro if 1
  1799. c     %push if
  1800. c     j%-1 %$ifnot
  1801. c %endmacro
  1802. c %macro else 0
  1803. c     %ifctx if
  1804. c         %repl else
  1805. c         jmp %$ifend
  1806. c         %$ifnot:
  1807. c     %else
  1808. c         %error "expected `if' before `else'"
  1809. c     %endif
  1810. c %endmacro
  1811. c %macro endif 0
  1812. c     %ifctx if
  1813. c         %$ifnot:
  1814. c         %pop
  1815. c     %elifctx else
  1816. c         %$ifend:
  1817. c         %pop
  1818. c     %else
  1819. c         %error "expected `if' or `else' before `endif'"
  1820. c     %endif
  1821. c %endmacro
  1822. This code is more robust than the c{REPEAT} and c{UNTIL} macros
  1823. given in k{ctxlocal}, because it uses conditional assembly to check
  1824. that the macros are issued in the right order (for example, not
  1825. calling c{endif} before c{if}) and issues a c{%error} if they're
  1826. not.
  1827. In addition, the c{endif} macro has to be able to cope with the two
  1828. distinct cases of either directly following an c{if}, or following
  1829. an c{else}. It achieves this, again, by using conditional assembly
  1830. to do different things depending on whether the context on top of
  1831. the stack is c{if} or c{else}.
  1832. The c{else} macro has to preserve the context on the stack, in
  1833. order to have the c{%$ifnot} referred to by the c{if} macro be the
  1834. same as the one defined by the c{endif} macro, but has to change
  1835. the context's name so that c{endif} will know there was an
  1836. intervening c{else}. It does this by the use of c{%repl}.
  1837. A sample usage of these macros might look like:
  1838. c           cmp ax,bx
  1839. c           if ae
  1840. c             cmp bx,cx
  1841. c             if ae
  1842. c               mov ax,cx
  1843. c             else
  1844. c               mov ax,bx
  1845. c             endif
  1846. c           else
  1847. c             cmp ax,cx
  1848. c             if ae
  1849. c               mov ax,cx
  1850. c             endif
  1851. c           endif
  1852. The block-c{IF} macros handle nesting quite happily, by means of
  1853. pushing another context, describing the inner c{if}, on top of the
  1854. one describing the outer c{if}; thus c{else} and c{endif} always
  1855. refer to the last unmatched c{if} or c{else}.
  1856. H{stdmac} i{Standard Macros}
  1857. NASM defines a set of standard macros, which are already defined
  1858. when it starts to process any source file. If you really need a
  1859. program to be assembled with no pre-defined macros, you can use the
  1860. ic{%clear} directive to empty the preprocessor of everything.
  1861. Most i{user-level assembler directives} (see k{directive}) are
  1862. implemented as macros which invoke primitive directives; these are
  1863. described in k{directive}. The rest of the standard macro set is
  1864. described here.
  1865. S{stdmacver} ic{__NASM_MAJOR__} and ic{__NASM_MINOR__}: i{NASM
  1866. Version}
  1867. The single-line macros c{__NASM_MAJOR__} and c{__NASM_MINOR__}
  1868. expand to the major and minor parts of the i{version number of
  1869. NASM} being used. So, under NASM 0.96 for example,
  1870. c{__NASM_MAJOR__} would be defined to be 0 and c{__NASM_MINOR__}
  1871. would be defined as 96.
  1872. S{fileline} ic{__FILE__} and ic{__LINE__}: File Name and Line Number
  1873. Like the C preprocessor, NASM allows the user to find out the file
  1874. name and line number containing the current instruction. The macro
  1875. c{__FILE__} expands to a string constant giving the name of the
  1876. current input file (which may change through the course of assembly
  1877. if c{%include} directives are used), and c{__LINE__} expands to a
  1878. numeric constant giving the current line number in the input file.
  1879. These macros could be used, for example, to communicate debugging
  1880. information to a macro, since invoking c{__LINE__} inside a macro
  1881. definition (either single-line or multi-line) will return the line
  1882. number of the macro e{call}, rather than e{definition}. So to
  1883. determine where in a piece of code a crash is occurring, for
  1884. example, one could write a routine c{stillhere}, which is passed a
  1885. line number in c{EAX} and outputs something like `line 155: still
  1886. here'. You could then write a macro
  1887. c %macro notdeadyet 0
  1888. c           push eax
  1889. c           mov eax,__LINE__
  1890. c           call stillhere
  1891. c           pop eax
  1892. c %endmacro
  1893. and then pepper your code with calls to c{notdeadyet} until you
  1894. find the crash point.
  1895. S{struc} ic{STRUC} and ic{ENDSTRUC}: i{Declaring Structure} Data Types
  1896. The core of NASM contains no intrinsic means of defining data
  1897. structures; instead, the preprocessor is sufficiently powerful that
  1898. data structures can be implemented as a set of macros. The macros
  1899. c{STRUC} and c{ENDSTRUC} are used to define a structure data type.
  1900. c{STRUC} takes one parameter, which is the name of the data type.
  1901. This name is defined as a symbol with the value zero, and also has
  1902. the suffix c{_size} appended to it and is then defined as an
  1903. c{EQU} giving the size of the structure. Once c{STRUC} has been
  1904. issued, you are defining the structure, and should define fields
  1905. using the c{RESB} family of pseudo-instructions, and then invoke
  1906. c{ENDSTRUC} to finish the definition.
  1907. For example, to define a structure called c{mytype} containing a
  1908. longword, a word, a byte and a string of bytes, you might code
  1909. c           struc mytype
  1910. c mt_long:  resd 1
  1911. c mt_word:  resw 1
  1912. c mt_byte:  resb 1
  1913. c mt_str:   resb 32
  1914. c           endstruc
  1915. The above code defines six symbols: c{mt_long} as 0 (the offset
  1916. from the beginning of a c{mytype} structure to the longword field),
  1917. c{mt_word} as 4, c{mt_byte} as 6, c{mt_str} as 7, c{mytype_size}
  1918. as 39, and c{mytype} itself as zero.
  1919. The reason why the structure type name is defined at zero is a side
  1920. effect of allowing structures to work with the local label
  1921. mechanism: if your structure members tend to have the same names in
  1922. more than one structure, you can define the above structure like this:
  1923. c           struc mytype
  1924. c .long:    resd 1
  1925. c .word:    resw 1
  1926. c .byte:    resb 1
  1927. c .str:     resb 32
  1928. c           endstruc
  1929. This defines the offsets to the structure fields as c{mytype.long},
  1930. c{mytype.word}, c{mytype.byte} and c{mytype.str}.
  1931. NASM, since it has no e{intrinsic} structure support, does not
  1932. support any form of period notation to refer to the elements of a
  1933. structure once you have one (except the above local-label notation),
  1934. so code such as c{mov ax,[mystruc.mt_word]} is not valid.
  1935. c{mt_word} is a constant just like any other constant, so the
  1936. correct syntax is c{mov ax,[mystruc+mt_word]} or c{mov
  1937. ax,[mystruc+mytype.word]}.
  1938. S{istruc} ic{ISTRUC}, ic{AT} and ic{IEND}: Declaring
  1939. i{Instances of Structures}
  1940. Having defined a structure type, the next thing you typically want
  1941. to do is to declare instances of that structure in your data
  1942. segment. NASM provides an easy way to do this in the c{ISTRUC}
  1943. mechanism. To declare a structure of type c{mytype} in a program,
  1944. you code something like this:
  1945. c mystruc:  istruc mytype
  1946. c           at mt_long, dd 123456
  1947. c           at mt_word, dw 1024
  1948. c           at mt_byte, db 'x'
  1949. c           at mt_str, db 'hello, world', 13, 10, 0
  1950. c           iend
  1951. The function of the c{AT} macro is to make use of the c{TIMES}
  1952. prefix to advance the assembly position to the correct point for the
  1953. specified structure field, and then to declare the specified data.
  1954. Therefore the structure fields must be declared in the same order as
  1955. they were specified in the structure definition.
  1956. If the data to go in a structure field requires more than one source
  1957. line to specify, the remaining source lines can easily come after
  1958. the c{AT} line. For example:
  1959. c           at mt_str, db 123,134,145,156,167,178,189
  1960. c           db 190,100,0
  1961. Depending on personal taste, you can also omit the code part of the
  1962. c{AT} line completely, and start the structure field on the next
  1963. line:
  1964. c           at mt_str
  1965. c           db 'hello, world'
  1966. c           db 13,10,0
  1967. S{align} ic{ALIGN} and ic{ALIGNB}: Data Alignment
  1968. The c{ALIGN} and c{ALIGNB} macros provides a convenient way to
  1969. align code or data on a word, longword, paragraph or other boundary.
  1970. (Some assemblers call this directive ic{EVEN}.) The syntax of the
  1971. c{ALIGN} and c{ALIGNB} macros is
  1972. c           align 4                ; align on 4-byte boundary
  1973. c           align 16               ; align on 16-byte boundary
  1974. c           align 8,db 0           ; pad with 0s rather than NOPs
  1975. c           align 4,resb 1         ; align to 4 in the BSS
  1976. c           alignb 4               ; equivalent to previous line
  1977. Both macros require their first argument to be a power of two; they
  1978. both compute the number of additional bytes required to bring the
  1979. length of the current section up to a multiple of that power of two,
  1980. and then apply the c{TIMES} prefix to their second argument to
  1981. perform the alignment.
  1982. If the second argument is not specified, the default for c{ALIGN}
  1983. is c{NOP}, and the default for c{ALIGNB} is c{RESB 1}. So if the
  1984. second argument is specified, the two macros are equivalent.
  1985. Normally, you can just use c{ALIGN} in code and data sections and
  1986. c{ALIGNB} in BSS sections, and never need the second argument
  1987. except for special purposes.
  1988. c{ALIGN} and c{ALIGNB}, being simple macros, perform no error
  1989. checking: they cannot warn you if their first argument fails to be a
  1990. power of two, or if their second argument generates more than one
  1991. byte of code. In each of these cases they will silently do the wrong
  1992. thing.
  1993. c{ALIGNB} (or c{ALIGN} with a second argument of c{RESB 1}) can
  1994. be used within structure definitions:
  1995. c           struc mytype2
  1996. c mt_byte:  resb 1
  1997. c           alignb 2
  1998. c mt_word:  resw 1
  1999. c           alignb 4
  2000. c mt_long:  resd 1
  2001. c mt_str:   resb 32
  2002. c           endstruc
  2003. This will ensure that the structure members are sensibly aligned
  2004. relative to the base of the structure.
  2005. A final caveat: c{ALIGN} and c{ALIGNB} work relative to the
  2006. beginning of the e{section}, not the beginning of the address space
  2007. in the final executable. Aligning to a 16-byte boundary when the
  2008. section you're in is only guaranteed to be aligned to a 4-byte
  2009. boundary, for example, is a waste of effort. Again, NASM does not
  2010. check that the section's alignment characteristics are sensible for
  2011. the use of c{ALIGN} or c{ALIGNB}.
  2012. C{directive} i{Assembler Directives}
  2013. NASM, though it attempts to avoid the bureaucracy of assemblers like
  2014. MASM and TASM, is nevertheless forced to support a e{few}
  2015. directives. These are described in this chapter.
  2016. NASM's directives come in two types: i{user-level
  2017. directives}e{user-level} directives and i{primitive
  2018. directives}e{primitive} directives. Typically, each directive has a
  2019. user-level form and a primitive form. In almost all cases, we
  2020. recommend that users use the user-level forms of the directives,
  2021. which are implemented as macros which call the primitive forms.
  2022. Primitive directives are enclosed in square brackets; user-level
  2023. directives are not.
  2024. In addition to the universal directives described in this chapter,
  2025. each object file format can optionally supply extra directives in
  2026. order to control particular features of that file format. These
  2027. i{format-specific directives}e{format-specific} directives are
  2028. documented along with the formats that implement them, in k{outfmt}.
  2029. H{bits} ic{BITS}: Specifying Target i{Processor Mode}
  2030. The c{BITS} directive specifies whether NASM should generate code
  2031. I{16-bit mode, versus 32-bit mode}designed to run on a processor
  2032. operating in 16-bit mode, or code designed to run on a processor
  2033. operating in 32-bit mode. The syntax is c{BITS 16} or c{BITS 32}.
  2034. In most cases, you should not need to use c{BITS} explicitly. The
  2035. c{aout}, c{coff}, c{elf} and c{win32} object formats, which are
  2036. designed for use in 32-bit operating systems, all cause NASM to
  2037. select 32-bit mode by default. The c{obj} object format allows you
  2038. to specify each segment you define as either c{USE16} or c{USE32},
  2039. and NASM will set its operating mode accordingly, so the use of the
  2040. c{BITS} directive is once again unnecessary.
  2041. The most likely reason for using the c{BITS} directive is to write
  2042. 32-bit code in a flat binary file; this is because the c{bin}
  2043. output format defaults to 16-bit mode in anticipation of it being
  2044. used most frequently to write DOS c{.COM} programs, DOS c{.SYS}
  2045. device drivers and boot loader software.
  2046. You do e{not} need to specify c{BITS 32} merely in order to use
  2047. 32-bit instructions in a 16-bit DOS program; if you do, the
  2048. assembler will generate incorrect code because it will be writing
  2049. code targeted at a 32-bit platform, to be run on a 16-bit one.
  2050. When NASM is in c{BITS 16} state, instructions which use 32-bit
  2051. data are prefixed with an 0x66 byte, and those referring to 32-bit
  2052. addresses have an 0x67 prefix. In c{BITS 32} state, the reverse is
  2053. true: 32-bit instructions require no prefixes, whereas instructions
  2054. using 16-bit data need an 0x66 and those working in 16-bit addresses
  2055. need an 0x67.
  2056. The c{BITS} directive has an exactly equivalent primitive form,
  2057. c{[BITS 16]} and c{[BITS 32]}. The user-level form is a macro
  2058. which has no function other than to call the primitive form.
  2059. H{section} ic{SECTION} or ic{SEGMENT}: Changing and i{Defining
  2060. Sections}
  2061. I{changing sections}I{switching between sections}The c{SECTION}
  2062. directive (c{SEGMENT} is an exactly equivalent synonym) changes
  2063. which section of the output file the code you write will be
  2064. assembled into. In some object file formats, the number and names of
  2065. sections are fixed; in others, the user may make up as many as they
  2066. wish. Hence c{SECTION} may sometimes give an error message, or may
  2067. define a new section, if you try to switch to a section that does
  2068. not (yet) exist.
  2069. The Unix object formats, and the c{bin} object format, all support
  2070. the i{standardised section names} c{.text}, c{.data} and c{.bss}
  2071. for the code, data and uninitialised-data sections. The c{obj}
  2072. format, by contrast, does not recognise these section names as being
  2073. special, and indeed will strip off the leading period of any section
  2074. name that has one.
  2075. S{sectmac} The ic{__SECT__} Macro
  2076. The c{SECTION} directive is unusual in that its user-level form
  2077. functions differently from its primitive form. The primitive form,
  2078. c{[SECTION xyz]}, simply switches the current target section to the
  2079. one given. The user-level form, c{SECTION xyz}, however, first
  2080. defines the single-line macro c{__SECT__} to be the primitive
  2081. c{[SECTION]} directive which it is about to issue, and then issues
  2082. it. So the user-level directive
  2083. c           SECTION .text
  2084. expands to the two lines
  2085. c %define __SECT__ [SECTION .text]
  2086. c           [SECTION .text]
  2087. Users may find it useful to make use of this in their own macros.
  2088. For example, the c{writefile} macro defined in k{mlmacgre} can be
  2089. usefully rewritten in the following more sophisticated form:
  2090. c %macro writefile 2+
  2091. c           [section .data]
  2092. c %%str:    db %2
  2093. c %%endstr:
  2094. c           __SECT__
  2095. c           mov dx,%%str
  2096. c           mov cx,%%endstr-%%str
  2097. c           mov bx,%1
  2098. c           mov ah,0x40
  2099. c           int 0x21
  2100. c %endmacro
  2101. This form of the macro, once passed a string to output, first
  2102. switches temporarily to the data section of the file, using the
  2103. primitive form of the c{SECTION} directive so as not to modify
  2104. c{__SECT__}. It then declares its string in the data section, and
  2105. then invokes c{__SECT__} to switch back to e{whichever} section
  2106. the user was previously working in. It thus avoids the need, in the
  2107. previous version of the macro, to include a c{JMP} instruction to
  2108. jump over the data, and also does not fail if, in a complicated
  2109. c{OBJ} format module, the user could potentially be assembling the
  2110. code in any of several separate code sections.
  2111. H{absolute} ic{ABSOLUTE}: Defining Absolute Labels
  2112. The c{ABSOLUTE} directive can be thought of as an alternative form
  2113. of c{SECTION}: it causes the subsequent code to be directed at no
  2114. physical section, but at the hypothetical section starting at the
  2115. given absolute address. The only instructions you can use in this
  2116. mode are the c{RESB} family.
  2117. c{ABSOLUTE} is used as follows:
  2118. c           absolute 0x1A
  2119. c kbuf_chr  resw 1
  2120. c kbuf_free resw 1
  2121. c kbuf      resw 16
  2122. This example describes a section of the PC BIOS data area, at
  2123. segment address 0x40: the above code defines c{kbuf_chr} to be
  2124. 0x1A, c{kbuf_free} to be 0x1C, and c{kbuf} to be 0x1E.
  2125. The user-level form of c{ABSOLUTE}, like that of c{SECTION},
  2126. redefines the ic{__SECT__} macro when it is invoked.
  2127. ic{STRUC} and ic{ENDSTRUC} are defined as macros which use
  2128. c{ABSOLUTE} (and also c{__SECT__}).
  2129. c{ABSOLUTE} doesn't have to take an absolute constant as an
  2130. argument: it can take an expression (actually, a i{critical
  2131. expression}: see k{crit}) and it can be a value in a segment. For
  2132. example, a TSR can re-use its setup code as run-time BSS like this:
  2133. c           org 100h               ; it's a .COM program
  2134. c           jmp setup              ; setup code comes last
  2135. c           ; the resident part of the TSR goes here
  2136. c setup:    ; now write the code that installs the TSR here
  2137. c           absolute setup
  2138. c runtimevar1 resw 1
  2139. c runtimevar2 resd 20
  2140. c tsr_end:
  2141. This defines some variables `on top of' the setup code, so that
  2142. after the setup has finished running, the space it took up can be
  2143. re-used as data storage for the running TSR. The symbol `tsr_end'
  2144. can be used to calculate the total size of the part of the TSR that
  2145. needs to be made resident.
  2146. H{extern} ic{EXTERN}: i{Importing Symbols} from Other Modules
  2147. c{EXTERN} is similar to the MASM directive c{EXTRN} and the C
  2148. keyword c{extern}: it is used to declare a symbol which is not
  2149. defined anywhere in the module being assembled, but is assumed to be
  2150. defined in some other module and needs to be referred to by this
  2151. one. Not every object-file format can support external variables:
  2152. the c{bin} format cannot.
  2153. The c{EXTERN} directive takes as many arguments as you like. Each
  2154. argument is the name of a symbol:
  2155. c           extern _printf
  2156. c           extern _sscanf,_fscanf
  2157. Some object-file formats provide extra features to the c{EXTERN}
  2158. directive. In all cases, the extra features are used by suffixing a
  2159. colon to the symbol name followed by object-format specific text.
  2160. For example, the c{obj} format allows you to declare that the
  2161. default segment base of an external should be the group c{dgroup}
  2162. by means of the directive
  2163. c           extern _variable:wrt dgroup
  2164. The primitive form of c{EXTERN} differs from the user-level form
  2165. only in that it can take only one argument at a time: the support
  2166. for multiple arguments is implemented at the preprocessor level.
  2167. You can declare the same variable as c{EXTERN} more than once: NASM
  2168. will quietly ignore the second and later redeclarations. You can't
  2169. declare a variable as c{EXTERN} as well as something else, though.
  2170. H{global} ic{GLOBAL}: i{Exporting Symbols} to Other Modules
  2171. c{GLOBAL} is the other end of c{EXTERN}: if one module declares a
  2172. symbol as c{EXTERN} and refers to it, then in order to prevent
  2173. linker errors, some other module must actually e{define} the
  2174. symbol and declare it as c{GLOBAL}. Some assemblers use the name
  2175. ic{PUBLIC} for this purpose.
  2176. The c{GLOBAL} directive applying to a symbol must appear e{before}
  2177. the definition of the symbol.
  2178. c{GLOBAL} uses the same syntax as c{EXTERN}, except that it must
  2179. refer to symbols which e{are} defined in the same module as the
  2180. c{GLOBAL} directive. For example:
  2181. c           global _main
  2182. c _main:    ; some code
  2183. c{GLOBAL}, like c{EXTERN}, allows object formats to define private
  2184. extensions by means of a colon. The c{elf} object format, for
  2185. example, lets you specify whether global data items are functions or
  2186. data:
  2187. c           global hashlookup:function, hashtable:data
  2188. Like c{EXTERN}, the primitive form of c{GLOBAL} differs from the
  2189. user-level form only in that it can take only one argument at a
  2190. time.
  2191. H{common} ic{COMMON}: Defining Common Data Areas
  2192. The c{COMMON} directive is used to declare ie{common variables}.
  2193. A common variable is much like a global variable declared in the
  2194. uninitialised data section, so that
  2195. c           common intvar 4
  2196. is similar in function to
  2197. c           global intvar
  2198. c           section .bss
  2199. c intvar    resd 1
  2200. The difference is that if more than one module defines the same
  2201. common variable, then at link time those variables will be
  2202. e{merged}, and references to c{intvar} in all modules will point
  2203. at the same piece of memory.
  2204. Like c{GLOBAL} and c{EXTERN}, c{COMMON} supports object-format
  2205. specific extensions. For example, the c{obj} format allows common
  2206. variables to be NEAR or FAR, and the c{elf} format allows you to
  2207. specify the alignment requirements of a common variable:
  2208. c           common commvar 4:near  ; works in OBJ
  2209. c           common intarray 100:4  ; works in ELF: 4 byte aligned
  2210. Once again, like c{EXTERN} and c{GLOBAL}, the primitive form of
  2211. c{COMMON} differs from the user-level form only in that it can take
  2212. only one argument at a time.
  2213. C{outfmt} i{Output Formats}
  2214. NASM is a portable assembler, designed to be able to compile on any
  2215. ANSI C-supporting platform and produce output to run on a variety of
  2216. Intel x86 operating systems. For this reason, it has a large number
  2217. of available output formats, selected using the ic{-f} option on
  2218. the NASM i{command line}. Each of these formats, along with its
  2219. extensions to the base NASM syntax, is detailed in this chapter.
  2220. As stated in k{opt-o}, NASM chooses a i{default name} for your
  2221. output file based on the input file name and the chosen output
  2222. format. This will be generated by removing the i{extension}
  2223. (c{.asm}, c{.s}, or whatever you like to use) from the input file
  2224. name, and substituting an extension defined by the output format.
  2225. The extensions are given with each format below.
  2226. H{binfmt} ic{bin}: i{Flat-Form Binary}I{pure binary} Output
  2227. The c{bin} format does not produce object files: it generates
  2228. nothing in the output file except the code you wrote. Such `pure
  2229. binary' files are used by i{MS-DOS}: ic{.COM} executables and
  2230. ic{.SYS} device drivers are pure binary files. Pure binary output
  2231. is also useful for i{operating-system} and i{boot loader}
  2232. development.
  2233. c{bin} supports the three i{standardised section names} ic{.text},
  2234. ic{.data} and ic{.bss} only. The file NASM outputs will contain the
  2235. contents of the c{.text} section first, followed by the contents of
  2236. the c{.data} section, aligned on a four-byte boundary. The c{.bss}
  2237. section is not stored in the output file at all, but is assumed to
  2238. appear directly after the end of the c{.data} section, again
  2239. aligned on a four-byte boundary.
  2240. If you specify no explicit c{SECTION} directive, the code you write
  2241. will be directed by default into the c{.text} section.
  2242. Using the c{bin} format puts NASM by default into 16-bit mode (see
  2243. k{bits}). In order to use c{bin} to write 32-bit code such as an
  2244. OS kernel, you need to explicitly issue the Ic{BITS}c{BITS 32}
  2245. directive.
  2246. c{bin} has no default output file name extension: instead, it
  2247. leaves your file name as it is once the original extension has been
  2248. removed. Thus, the default is for NASM to assemble c{binprog.asm}
  2249. into a binary file called c{binprog}.
  2250. S{org} ic{ORG}: Binary File i{Program Origin}
  2251. The c{bin} format provides an additional directive to the list
  2252. given in k{directive}: c{ORG}. The function of the c{ORG}
  2253. directive is to specify the origin address which NASM will assume
  2254. the program begins at when it is loaded into memory.
  2255. For example, the following code will generate the longword
  2256. c{0x00000104}:
  2257. c           org 0x100
  2258. c           dd label
  2259. c label:
  2260. Unlike the c{ORG} directive provided by MASM-compatible assemblers,
  2261. which allows you to jump around in the object file and overwrite
  2262. code you have already generated, NASM's c{ORG} does exactly what
  2263. the directive says: e{origin}. Its sole function is to specify one
  2264. offset which is added to all internal address references within the
  2265. file; it does not permit any of the trickery that MASM's version
  2266. does. See k{proborg} for further comments.
  2267. S{binseg} c{bin} Extensions to the c{SECTION}
  2268. DirectiveI{SECTION, bin extensions to}
  2269. The c{bin} output format extends the c{SECTION} (or c{SEGMENT})
  2270. directive to allow you to specify the alignment requirements of
  2271. segments. This is done by appending the ic{ALIGN} qualifier to the
  2272. end of the section-definition line. For example,