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

编译器/解释器

开发平台:

C/C++

  1. c           section .data align=16
  2. switches to the section c{.data} and also specifies that it must be
  3. aligned on a 16-byte boundary.
  4. The parameter to c{ALIGN} specifies how many low bits of the
  5. section start address must be forced to zero. The alignment value
  6. given may be any power of two.I{section alignment, in
  7. bin}I{segment alignment, in bin}I{alignment, in bin sections}
  8. H{objfmt} ic{obj}: i{Microsoft OMF}I{OMF} Object Files
  9. The c{obj} file format (NASM calls it c{obj} rather than c{omf}
  10. for historical reasons) is the one produced by i{MASM} and
  11. i{TASM}, which is typically fed to 16-bit DOS linkers to produce
  12. ic{.EXE} files. It is also the format used by i{OS/2}.
  13. c{obj} provides a default output file-name extension of c{.obj}.
  14. c{obj} is not exclusively a 16-bit format, though: NASM has full
  15. support for the 32-bit extensions to the format. In particular,
  16. 32-bit c{obj} format files are used by i{Borland's Win32
  17. compilers}, instead of using Microsoft's newer ic{win32} object
  18. file format.
  19. The c{obj} format does not define any special segment names: you
  20. can call your segments anything you like. Typical names for segments
  21. in c{obj} format files are c{CODE}, c{DATA} and c{BSS}.
  22. If your source file contains code before specifying an explicit
  23. c{SEGMENT} directive, then NASM will invent its own segment called
  24. ic{__NASMDEFSEG} for you.
  25. When you define a segment in an c{obj} file, NASM defines the
  26. segment name as a symbol as well, so that you can access the segment
  27. address of the segment. So, for example:
  28. c           segment data
  29. c dvar:     dw 1234
  30. c           segment code
  31. c function: mov ax,data            ; get segment address of data
  32. c           mov ds,ax              ; and move it into DS
  33. c           inc word [dvar]        ; now this reference will work
  34. c           ret
  35. The c{obj} format also enables the use of the ic{SEG} and
  36. ic{WRT} operators, so that you can write code which does things
  37. like
  38. c           extern foo
  39. c           mov ax,seg foo         ; get preferred segment of foo
  40. c           mov ds,ax
  41. c           mov ax,data            ; a different segment
  42. c           mov es,ax
  43. c           mov ax,[ds:foo]        ; this accesses `foo'
  44. c           mov [es:foo wrt data],bx  ; so does this
  45. S{objseg} c{obj} Extensions to the c{SEGMENT}
  46. DirectiveI{SEGMENT, obj extensions to}
  47. The c{obj} output format extends the c{SEGMENT} (or c{SECTION})
  48. directive to allow you to specify various properties of the segment
  49. you are defining. This is done by appending extra qualifiers to the
  50. end of the segment-definition line. For example,
  51. c           segment code private align=16
  52. defines the segment c{code}, but also declares it to be a private
  53. segment, and requires that the portion of it described in this code
  54. module must be aligned on a 16-byte boundary.
  55. The available qualifiers are:
  56. b ic{PRIVATE}, ic{PUBLIC}, ic{COMMON} and ic{STACK} specify
  57. the combination characteristics of the segment. c{PRIVATE} segments
  58. do not get combined with any others by the linker; c{PUBLIC} and
  59. c{STACK} segments get concatenated together at link time; and
  60. c{COMMON} segments all get overlaid on top of each other rather
  61. than stuck end-to-end.
  62. b ic{ALIGN} is used, as shown above, to specify how many low bits
  63. of the segment start address must be forced to zero. The alignment
  64. value given may be any power of two from 1 to 4096; in reality, the
  65. only values supported are 1, 2, 4, 16, 256 and 4096, so if 8 is
  66. specified it will be rounded up to 16, and 32, 64 and 128 will all
  67. be rounded up to 256, and so on. Note that alignment to 4096-byte
  68. boundaries is a i{PharLap} extension to the format and may not be
  69. supported by all linkers.I{section alignment, in OBJ}I{segment
  70. alignment, in OBJ}I{alignment, in OBJ sections}
  71. b ic{CLASS} can be used to specify the segment class; this feature
  72. indicates to the linker that segments of the same class should be
  73. placed near each other in the output file. The class name can be any
  74. word, e.g. c{CLASS=CODE}.
  75. b ic{OVERLAY}, like c{CLASS}, is specified with an arbitrary word
  76. as an argument, and provides overlay information to an
  77. overlay-capable linker.
  78. b Segments can be declared as ic{USE16} or ic{USE32}, which has
  79. the effect of recording the choice in the object file and also
  80. ensuring that NASM's default assembly mode when assembling in that
  81. segment is 16-bit or 32-bit respectively.
  82. b When writing i{OS/2} object files, you should declare 32-bit
  83. segments as ic{FLAT}, which causes the default segment base for
  84. anything in the segment to be the special group c{FLAT}, and also
  85. defines the group if it is not already defined.
  86. b The c{obj} file format also allows segments to be declared as
  87. having a pre-defined absolute segment address, although no linkers
  88. are currently known to make sensible use of this feature;
  89. nevertheless, NASM allows you to declare a segment such as
  90. c{SEGMENT SCREEN ABSOLUTE=0xB800} if you need to. The ic{ABSOLUTE}
  91. and c{ALIGN} keywords are mutually exclusive.
  92. NASM's default segment attributes are c{PUBLIC}, c{ALIGN=1}, no
  93. class, no overlay, and c{USE16}.
  94. S{group} ic{GROUP}: Defining Groups of SegmentsI{segments, groups of}
  95. The c{obj} format also allows segments to be grouped, so that a
  96. single segment register can be used to refer to all the segments in
  97. a group. NASM therefore supplies the c{GROUP} directive, whereby
  98. you can code
  99. c           segment data
  100. c           ; some data
  101. c           segment bss
  102. c           ; some uninitialised data
  103. c           group dgroup data bss
  104. which will define a group called c{dgroup} to contain the segments
  105. c{data} and c{bss}. Like c{SEGMENT}, c{GROUP} causes the group
  106. name to be defined as a symbol, so that you can refer to a variable
  107. c{var} in the c{data} segment as c{var wrt data} or as c{var wrt
  108. dgroup}, depending on which segment value is currently in your
  109. segment register.
  110. If you just refer to c{var}, however, and c{var} is declared in a
  111. segment which is part of a group, then NASM will default to giving
  112. you the offset of c{var} from the beginning of the e{group}, not
  113. the e{segment}. Therefore c{SEG var}, also, will return the group
  114. base rather than the segment base.
  115. NASM will allow a segment to be part of more than one group, but
  116. will generate a warning if you do this. Variables declared in a
  117. segment which is part of more than one group will default to being
  118. relative to the first group that was defined to contain the segment.
  119. A group does not have to contain any segments; you can still make
  120. c{WRT} references to a group which does not contain the variable
  121. you are referring to. OS/2, for example, defines the special group
  122. c{FLAT} with no segments in it.
  123. S{uppercase} ic{UPPERCASE}: Disabling Case Sensitivity in Output
  124. Although NASM itself is i{case sensitive}, some OMF linkers are
  125. not; therefore it can be useful for NASM to output single-case
  126. object files. The c{UPPERCASE} format-specific directive causes all
  127. segment, group and symbol names that are written to the object file
  128. to be forced to upper case just before being written. Within a
  129. source file, NASM is still case-sensitive; but the object file can
  130. be written entirely in upper case if desired.
  131. c{UPPERCASE} is used alone on a line; it requires no parameters.
  132. S{import} ic{IMPORT}: Importing DLL SymbolsI{DLL symbols,
  133. importing}I{symbols, importing from DLLs}
  134. The c{IMPORT} format-specific directive defines a symbol to be
  135. imported from a DLL, for use if you are writing a DLL's i{import
  136. library} in NASM. You still need to declare the symbol as c{EXTERN}
  137. as well as using the c{IMPORT} directive.
  138. The c{IMPORT} directive takes two required parameters, separated by
  139. white space, which are (respectively) the name of the symbol you
  140. wish to import and the name of the library you wish to import it
  141. from. For example:
  142. c           import WSAStartup wsock32.dll
  143. A third optional parameter gives the name by which the symbol is
  144. known in the library you are importing it from, in case this is not
  145. the same as the name you wish the symbol to be known by to your code
  146. once you have imported it. For example:
  147. c           import asyncsel wsock32.dll WSAAsyncSelect
  148. S{export} ic{EXPORT}: Exporting DLL SymbolsI{DLL symbols,
  149. exporting}I{symbols, exporting from DLLs}
  150. The c{EXPORT} format-specific directive defines a global symbol to
  151. be exported as a DLL symbol, for use if you are writing a DLL in
  152. NASM. You still need to declare the symbol as c{GLOBAL} as well as
  153. using the c{EXPORT} directive.
  154. c{EXPORT} takes one required parameter, which is the name of the
  155. symbol you wish to export, as it was defined in your source file. An
  156. optional second parameter (separated by white space from the first)
  157. gives the e{external} name of the symbol: the name by which you
  158. wish the symbol to be known to programs using the DLL. If this name
  159. is the same as the internal name, you may leave the second parameter
  160. off.
  161. Further parameters can be given to define attributes of the exported
  162. symbol. These parameters, like the second, are separated by white
  163. space. If further parameters are given, the external name must also
  164. be specified, even if it is the same as the internal name. The
  165. available attributes are:
  166. b c{resident} indicates that the exported name is to be kept
  167. resident by the system loader. This is an optimisation for
  168. frequently used symbols imported by name.
  169. b c{nodata} indicates that the exported symbol is a function which
  170. does not make use of any initialised data.
  171. b c{parm=NNN}, where c{NNN} is an integer, sets the number of
  172. parameter words for the case in which the symbol is a call gate
  173. between 32-bit and 16-bit segments.
  174. b An attribute which is just a number indicates that the symbol
  175. should be exported with an identifying number (ordinal), and gives
  176. the desired number.
  177. For example:
  178. c           export myfunc
  179. c           export myfunc TheRealMoreFormalLookingFunctionName
  180. c           export myfunc myfunc 1234  ; export by ordinal
  181. c           export myfunc myfunc resident parm=23 nodata
  182. S{dotdotstart} ic{..start}: Defining the i{Program Entry
  183. Point}
  184. OMF linkers require exactly one of the object files being linked to
  185. define the program entry point, where execution will begin when the
  186. program is run. If the object file that defines the entry point is
  187. assembled using NASM, you specify the entry point by declaring the
  188. special symbol c{..start} at the point where you wish execution to
  189. begin.
  190. S{objextern} c{obj} Extensions to the c{EXTERN}
  191. DirectiveI{EXTERN, obj extensions to}
  192. If you declare an external symbol with the directive
  193. c           extern foo
  194. then references such as c{mov ax,foo} will give you the offset of
  195. c{foo} from its preferred segment base (as specified in whichever
  196. module c{foo} is actually defined in). So to access the contents of
  197. c{foo} you will usually need to do something like
  198. c           mov ax,seg foo         ; get preferred segment base
  199. c           mov es,ax              ; move it into ES
  200. c           mov ax,[es:foo]        ; and use offset `foo' from it
  201. This is a little unwieldy, particularly if you know that an external
  202. is going to be accessible from a given segment or group, say
  203. c{dgroup}. So if c{DS} already contained c{dgroup}, you could
  204. simply code
  205. c           mov ax,[foo wrt dgroup]
  206. However, having to type this every time you want to access c{foo}
  207. can be a pain; so NASM allows you to declare c{foo} in the
  208. alternative form
  209. c           extern foo:wrt dgroup
  210. This form causes NASM to pretend that the preferred segment base of
  211. c{foo} is in fact c{dgroup}; so the expression c{seg foo} will
  212. now return c{dgroup}, and the expression c{foo} is equivalent to
  213. c{foo wrt dgroup}.
  214. This I{default-WRT mechanism}default-c{WRT} mechanism can be used
  215. to make externals appear to be relative to any group or segment in
  216. your program. It can also be applied to common variables: see
  217. k{objcommon}.
  218. S{objcommon} c{obj} Extensions to the c{COMMON}
  219. DirectiveI{COMMON, obj extensions to}
  220. The c{obj} format allows common variables to be either nearI{near
  221. common variables} or farI{far common variables}; NASM allows you to
  222. specify which your variables should be by the use of the syntax
  223. c           common nearvar 2:near  ; `nearvar' is a near common
  224. c           common farvar 10:far   ; and `farvar' is far
  225. Far common variables may be greater in size than 64Kb, and so the
  226. OMF specification says that they are declared as a number of
  227. e{elements} of a given size. So a 10-byte far common variable could
  228. be declared as ten one-byte elements, five two-byte elements, two
  229. five-byte elements or one ten-byte element.
  230. Some OMF linkers require the I{element size, in common
  231. variables}I{common variables, element size}element size, as well as
  232. the variable size, to match when resolving common variables declared
  233. in more than one module. Therefore NASM must allow you to specify
  234. the element size on your far common variables. This is done by the
  235. following syntax:
  236. c           common c_5by2 10:far 5 ; two five-byte elements
  237. c           common c_2by5 10:far 2 ; five two-byte elements
  238. If no element size is specified, the default is 1. Also, the c{FAR}
  239. keyword is not required when an element size is specified, since
  240. only far commons may have element sizes at all. So the above
  241. declarations could equivalently be
  242. c           common c_5by2 10:5     ; two five-byte elements
  243. c           common c_2by5 10:2     ; five two-byte elements
  244. In addition to these extensions, the c{COMMON} directive in c{obj}
  245. also supports default-c{WRT} specification like c{EXTERN} does
  246. (explained in k{objextern}). So you can also declare things like
  247. c           common foo 10:wrt dgroup
  248. c           common bar 16:far 2:wrt data
  249. c           common baz 24:wrt data:6
  250. H{win32fmt} ic{win32}: Microsoft Win32 Object Files
  251. The c{win32} output format generates Microsoft Win32 object files,
  252. suitable for passing to Microsoft linkers such as i{Visual C++}.
  253. Note that Borland Win32 compilers do not use this format, but use
  254. c{obj} instead (see k{objfmt}).
  255. c{win32} provides a default output file-name extension of c{.obj}.
  256. Note that although Microsoft say that Win32 object files follow the
  257. COFF (Common Object File Format) standard, the object files produced
  258. by Microsoft Win32 compilers are not compatible with COFF linkers
  259. such as DJGPP's, and vice versa. This is due to a difference of
  260. opinion over the precise semantics of PC-relative relocations. To
  261. produce COFF files suitable for DJGPP, use NASM's c{coff} output
  262. format; conversely, the c{coff} format does not produce object
  263. files that Win32 linkers can generate correct output from.
  264. S{win32sect} c{win32} Extensions to the c{SECTION}
  265. DirectiveI{SECTION, win32 extensions to}
  266. Like the c{obj} format, c{win32} allows you to specify additional
  267. information on the c{SECTION} directive line, to control the type
  268. and properties of sections you declare. Section types and properties
  269. are generated automatically by NASM for the i{standard section names}
  270. c{.text}, c{.data} and c{.bss}, but may still be overridden by
  271. these qualifiers.
  272. The available qualifiers are:
  273. b c{code}, or equivalently c{text}, defines the section to be a
  274. code section. This marks the section as readable and executable, but
  275. not writable, and also indicates to the linker that the type of the
  276. section is code.
  277. b c{data} and c{bss} define the section to be a data section,
  278. analogously to c{code}. Data sections are marked as readable and
  279. writable, but not executable. c{data} declares an initialised data
  280. section, whereas c{bss} declares an uninitialised data section.
  281. b c{info} defines the section to be an i{informational section},
  282. which is not included in the executable file by the linker, but may
  283. (for example) pass information e{to} the linker. For example,
  284. declaring an c{info}-type section called ic{.drectve} causes the
  285. linker to interpret the contents of the section as command-line
  286. options.
  287. b c{align=}, used with a trailing number as in c{obj}, gives the
  288. I{section alignment, in win32}I{alignment, in win32
  289. sections}alignment requirements of the section. The maximum you may
  290. specify is 64: the Win32 object file format contains no means to
  291. request a greater section alignment than this. If alignment is not
  292. explicitly specified, the defaults are 16-byte alignment for code
  293. sections, and 4-byte alignment for data (and BSS) sections.
  294. Informational sections get a default alignment of 1 byte (no
  295. alignment), though the value does not matter.
  296. The defaults assumed by NASM if you do not specify the above
  297. qualifiers are:
  298. c           section .text code align=16
  299. c           section .data data align=4
  300. c           section .bss bss align=4
  301. Any other section name is treated by default like c{.text}.
  302. H{cofffmt} ic{coff}: i{Common Object File Format}
  303. The c{coff} output type produces COFF object files suitable for
  304. linking with the i{DJGPP} linker.
  305. c{coff} provides a default output file-name extension of c{.o}.
  306. The c{coff} format supports the same extensions to the c{SECTION}
  307. directive as c{win32} does, except that the c{align} qualifier and
  308. the c{info} section type are not supported.
  309. H{elffmt} ic{elf}: i{Linux ELF}I{Executable and Linkable
  310. Format}Object Files
  311. The c{elf} output format generates ELF32 (Executable and Linkable
  312. Format) object files, as used by Linux. c{elf} provides a default
  313. output file-name extension of c{.o}.
  314. S{elfsect} c{elf} Extensions to the c{SECTION}
  315. DirectiveI{SECTION, elf extensions to}
  316. Like the c{obj} format, c{elf} allows you to specify additional
  317. information on the c{SECTION} directive line, to control the type
  318. and properties of sections you declare. Section types and properties
  319. are generated automatically by NASM for the i{standard section
  320. names} ic{.text}, ic{.data} and ic{.bss}, but may still be
  321. overridden by these qualifiers.
  322. The available qualifiers are:
  323. b ic{alloc} defines the section to be one which is loaded into
  324. memory when the program is run. ic{noalloc} defines it to be one
  325. which is not, such as an informational or comment section.
  326. b ic{exec} defines the section to be one which should have execute
  327. permission when the program is run. ic{noexec} defines it as one
  328. which should not.
  329. b ic{write} defines the section to be one which should be writable
  330. when the program is run. ic{nowrite} defines it as one which should
  331. not.
  332. b ic{progbits} defines the section to be one with explicit contents
  333. stored in the object file: an ordinary code or data section, for
  334. example, ic{nobits} defines the section to be one with no explicit
  335. contents given, such as a BSS section.
  336. b c{align=}, used with a trailing number as in c{obj}, gives the
  337. I{section alignment, in elf}I{alignment, in elf sections}alignment
  338. requirements of the section.
  339. The defaults assumed by NASM if you do not specify the above
  340. qualifiers are:
  341. c           section .text progbits alloc   exec nowrite align=16
  342. c           section .data progbits alloc noexec   write align=4
  343. c           section .bss    nobits alloc noexec   write align=4
  344. c           section other progbits alloc noexec nowrite align=1
  345. (Any section name other than c{.text}, c{.data} and c{.bss} is
  346. treated by default like c{other} in the above code.)
  347. S{elfwrt} i{Position-Independent Code}I{PIC}: c{elf} Special
  348. Symbols and ic{WRT}
  349. The ELF specification contains enough features to allow
  350. position-independent code (PIC) to be written, which makes i{ELF
  351. shared libraries} very flexible. However, it also means NASM has to
  352. be able to generate a variety of strange relocation types in ELF
  353. object files, if it is to be an assembler which can write PIC.
  354. Since ELF does not support segment-base references, the c{WRT}
  355. operator is not used for its normal purpose; therefore NASM's
  356. c{elf} output format makes use of c{WRT} for a different purpose,
  357. namely the PIC-specific I{relocations, PIC-specific}relocation
  358. types.
  359. c{elf} defines five special symbols which you can use as the
  360. right-hand side of the c{WRT} operator to obtain PIC relocation
  361. types. They are ic{..gotpc}, ic{..gotoff}, ic{..got},
  362. ic{..plt} and ic{..sym}. Their functions are summarised here:
  363. b Referring to the symbol marking the global offset table base
  364. using c{wrt ..gotpc} will end up giving the distance from the
  365. beginning of the current section to the global offset table.
  366. (ic{_GLOBAL_OFFSET_TABLE_} is the standard symbol name used to
  367. refer to the i{GOT}.) So you would then need to add ic{$$} to the
  368. result to get the real address of the GOT.
  369. b Referring to a location in one of your own sections using c{wrt
  370. ..gotoff} will give the distance from the beginning of the GOT to
  371. the specified location, so that adding on the address of the GOT
  372. would give the real address of the location you wanted.
  373. b Referring to an external or global symbol using c{wrt ..got}
  374. causes the linker to build an entry e{in} the GOT containing the
  375. address of the symbol, and the reference gives the distance from the
  376. beginning of the GOT to the entry; so you can add on the address of
  377. the GOT, load from the resulting address, and end up with the
  378. address of the symbol.
  379. b Referring to a procedure name using c{wrt ..plt} causes the
  380. linker to build a i{procedure linkage table} entry for the symbol,
  381. and the reference gives the address of the i{PLT} entry. You can
  382. only use this in contexts which would generate a PC-relative
  383. relocation normally (i.e. as the destination for c{CALL} or
  384. c{JMP}), since ELF contains no relocation type to refer to PLT
  385. entries absolutely.
  386. b Referring to a symbol name using c{wrt ..sym} causes NASM to
  387. write an ordinary relocation, but instead of making the relocation
  388. relative to the start of the section and then adding on the offset
  389. to the symbol, it will write a relocation record aimed directly at
  390. the symbol in question. The distinction is a necessary one due to a
  391. peculiarity of the dynamic linker.
  392. A fuller explanation of how to use these relocation types to write
  393. shared libraries entirely in NASM is given in k{picdll}.
  394. S{elfglob} c{elf} Extensions to the c{GLOBAL} DirectiveI{GLOBAL,
  395. elf extensions to}I{GLOBAL, aoutb extensions to}
  396. ELF object files can contain more information about a global symbol
  397. than just its address: they can contain the I{symbol sizes,
  398. specifying}I{size, of symbols}size of the symbol and its I{symbol
  399. types, specifying}I{type, of symbols}type as well. These are not
  400. merely debugger conveniences, but are actually necessary when the
  401. program being written is a i{shared library}. NASM therefore
  402. supports some extensions to the c{GLOBAL} directive, allowing you
  403. to specify these features.
  404. You can specify whether a global variable is a function or a data
  405. object by suffixing the name with a colon and the word
  406. ic{function} or ic{data}. (ic{object} is a synonym for
  407. c{data}.) For example:
  408. c           global hashlookup:function, hashtable:data
  409. exports the global symbol c{hashlookup} as a function and
  410. c{hashtable} as a data object.
  411. You can also specify the size of the data associated with the
  412. symbol, as a numeric expression (which may involve labels, and even
  413. forward references) after the type specifier. Like this:
  414. c           global hashtable:data (hashtable.end - hashtable)
  415. c hashtable:
  416. c           db this,that,theother  ; some data here
  417. c .end:
  418. This makes NASM automatically calculate the length of the table and
  419. place that information into the ELF symbol table.
  420. Declaring the type and size of global symbols is necessary when
  421. writing shared library code. For more information, see
  422. k{picglobal}.
  423. S{elfcomm} c{elf} Extensions to the c{COMMON} DirectiveI{COMMON,
  424. elf extensions to}
  425. ELF also allows you to specify alignment requirements I{common
  426. variables, alignment in elf}I{alignment, of elf common variables}on
  427. common variables. This is done by putting a number (which must be a
  428. power of two) after the name and size of the common variable,
  429. separated (as usual) by a colon. For example, an array of
  430. doublewords would benefit from 4-byte alignment:
  431. c           common dwordarray 128:4
  432. This declares the total size of the array to be 128 bytes, and
  433. requires that it be aligned on a 4-byte boundary.
  434. H{aoutfmt} ic{aout}: Linux I{a.out, Linux version}c{a.out} Object Files
  435. The c{aout} format generates c{a.out} object files, in the form
  436. used by early Linux systems. (These differ from other c{a.out}
  437. object files in that the magic number in the first four bytes of the
  438. file is different. Also, some implementations of c{a.out}, for
  439. example NetBSD's, support position-independent code, which Linux's
  440. implementation doesn't.)
  441. c{a.out} provides a default output file-name extension of c{.o}.
  442. c{a.out} is a very simple object format. It supports no special
  443. directives, no special symbols, no use of c{SEG} or c{WRT}, and no
  444. extensions to any standard directives. It supports only the three
  445. i{standard section names} ic{.text}, ic{.data} and ic{.bss}.
  446. H{aoutfmt} ic{aoutb}: i{NetBSD}/i{FreeBSD}/i{OpenBSD}
  447. I{a.out, BSD version}c{a.out} Object Files
  448. The c{aoutb} format generates c{a.out} object files, in the form
  449. used by the various free BSD Unix clones, NetBSD, FreeBSD and
  450. OpenBSD. For simple object files, this object format is exactly the
  451. same as c{aout} except for the magic number in the first four bytes
  452. of the file. However, the c{aoutb} format supports
  453. I{PIC}i{position-independent code} in the same way as the c{elf}
  454. format, so you can use it to write BSD i{shared libraries}.
  455. c{aoutb} provides a default output file-name extension of c{.o}.
  456. c{aoutb} supports no special directives, no special symbols, and
  457. only the three i{standard section names} ic{.text}, ic{.data}
  458. and ic{.bss}. However, it also supports the same use of ic{WRT} as
  459. c{elf} does, to provide position-independent code relocation types.
  460. See k{elfwrt} for full documentation of this feature.
  461. c{aoutb} also supports the same extensions to the c{GLOBAL}
  462. directive as c{elf} does: see k{elfglob} for documentation of
  463. this.
  464. H{as86fmt} c{as86}: Linux ic{as86} Object Files
  465. The Linux 16-bit assembler c{as86} has its own non-standard object
  466. file format. Although its companion linker ic{ld86} produces
  467. something close to ordinary c{a.out} binaries as output, the object
  468. file format used to communicate between c{as86} and c{ld86} is not
  469. itself c{a.out}.
  470. NASM supports this format, just in case it is useful, as c{as86}.
  471. c{as86} provides a default output file-name extension of c{.o}.
  472. c{as86} is a very simple object format (from the NASM user's point
  473. of view). It supports no special directives, no special symbols, no
  474. use of c{SEG} or c{WRT}, and no extensions to any standard
  475. directives. It supports only the three i{standard section names}
  476. ic{.text}, ic{.data} and ic{.bss}.
  477. H{rdffmt} I{RDOFF}ic{rdf}: i{Relocatable Dynamic Object File
  478. Format}
  479. The c{rdf} output format produces RDOFF object files. RDOFF
  480. (Relocatable Dynamic Object File Format) is a home-grown object-file
  481. format, designed alongside NASM itself and reflecting in its file
  482. format the internal structure of the assembler.
  483. RDOFF is not used by any well-known operating systems. Those writing
  484. their own systems, however, may well wish to use RDOFF as their
  485. object format, on the grounds that it is designed primarily for
  486. simplicity and contains very little file-header bureaucracy.
  487. The Unix NASM archive, and the DOS archive which includes sources,
  488. both contain an I{rdoff subdirectory}c{rdoff} subdirectory holding
  489. a set of RDOFF utilities: an RDF linker, an RDF static-library
  490. manager, an RDF file dump utility, and a program which will load and
  491. execute an RDF executable under Linux.
  492. c{rdf} supports only the i{standard section names} ic{.text},
  493. ic{.data} and ic{.bss}.
  494. S{rdflib} Requiring a Library: The ic{LIBRARY} Directive
  495. RDOFF contains a mechanism for an object file to demand a given
  496. library to be linked to the module, either at load time or run time.
  497. This is done by the c{LIBRARY} directive, which takes one argument
  498. which is the name of the module:
  499. c           library mylib.rdl
  500. H{dbgfmt} ic{dbg}: Debugging Format
  501. The c{dbg} output format is not built into NASM in the default
  502. configuration. If you are building your own NASM executable from the
  503. sources, you can define ic{OF_DBG} in c{outform.h} or on the
  504. compiler command line, and obtain the c{dbg} output format.
  505. The c{dbg} format does not output an object file as such; instead,
  506. it outputs a text file which contains a complete list of all the
  507. transactions between the main body of NASM and the output-format
  508. back end module. It is primarily intended to aid people who want to
  509. write their own output drivers, so that they can get a clearer idea
  510. of the various requests the main program makes of the output driver,
  511. and in what order they happen.
  512. For simple files, one can easily use the c{dbg} format like this:
  513. c nasm -f dbg filename.asm
  514. which will generate a diagnostic file called c{filename.dbg}.
  515. However, this will not work well on files which were designed for a
  516. different object format, because each object format defines its own
  517. macros (usually user-level forms of directives), and those macros
  518. will not be defined in the c{dbg} format. Therefore it can be
  519. useful to run NASM twice, in order to do the preprocessing with the
  520. native object format selected:
  521. c nasm -e -f rdf -o rdfprog.i rdfprog.asm
  522. c nasm -a -f dbg rdfprog.i
  523. This preprocesses c{rdfprog.asm} into c{rdfprog.i}, keeping the
  524. c{rdf} object format selected in order to make sure RDF special
  525. directives are converted into primitive form correctly. Then the
  526. preprocessed source is fed through the c{dbg} format to generate
  527. the final diagnostic output.
  528. This workaround will still typically not work for programs intended
  529. for c{obj} format, because the c{obj} c{SEGMENT} and c{GROUP}
  530. directives have side effects of defining the segment and group names
  531. as symbols; c{dbg} will not do this, so the program will not
  532. assemble. You will have to work around that by defining the symbols
  533. yourself (using c{EXTERN}, for example) if you really need to get a
  534. c{dbg} trace of an c{obj}-specific source file.
  535. c{dbg} accepts any section name and any directives at all, and logs
  536. them all to its output file.
  537. C{16bit} Writing 16-bit Code (DOS, Windows 3/3.1)
  538. This chapter attempts to cover some of the common issues encountered
  539. when writing 16-bit code to run under MS-DOS or Windows 3.x. It
  540. covers how to link programs to produce c{.EXE} or c{.COM} files,
  541. how to write c{.SYS} device drivers, and how to interface assembly
  542. language code with 16-bit C compilers and with Borland Pascal.
  543. H{exefiles} Producing ic{.EXE} Files
  544. Any large program written under DOS needs to be built as a c{.EXE}
  545. file: only c{.EXE} files have the necessary internal structure
  546. required to span more than one 64K segment. i{Windows} programs,
  547. also, have to be built as c{.EXE} files, since Windows does not
  548. support the c{.COM} format.
  549. In general, you generate c{.EXE} files by using the c{obj} output
  550. format to produce one or more ic{.OBJ} files, and then linking
  551. them together using a linker. However, NASM also supports the direct
  552. generation of simple DOS c{.EXE} files using the c{bin} output
  553. format (by using c{DB} and c{DW} to construct the c{.EXE} file
  554. header), and a macro package is supplied to do this. Thanks to
  555. Yann Guidon for contributing the code for this.
  556. NASM may also support c{.EXE} natively as another output format in
  557. future releases.
  558. S{objexe} Using the c{obj} Format To Generate c{.EXE} Files
  559. This section describes the usual method of generating c{.EXE} files
  560. by linking c{.OBJ} files together.
  561. Most 16-bit programming language packages come with a suitable
  562. linker; if you have none of these, there is a free linker called
  563. i{VAL}I{linker, free}, available in c{LZH} archive format from
  564. W{ftp://x2ftp.oulu.fi/pub/msdos/programming/lang/}ic{x2ftp.oulu.fi}.
  565. An LZH archiver can be found at
  566. W{ftp://ftp.simtel.net/pub/simtelnet/msdos/arcers}ic{ftp.simtel.net}.
  567. There is another `free' linker (though this one doesn't come with
  568. sources) called i{FREELINK}, available from
  569. W{http://www.pcorner.com/tpc/old/3-101.html}ic{www.pcorner.com}.
  570. A third, ic{djlink}, written by DJ Delorie, is available at
  571. W{http://www.delorie.com/djgpp/16bit/djlink/}ic{www.delorie.com}.
  572. When linking several c{.OBJ} files into a c{.EXE} file, you should
  573. ensure that exactly one of them has a start point defined (using the
  574. I{program entry point}ic{..start} special symbol defined by the
  575. c{obj} format: see k{dotdotstart}). If no module defines a start
  576. point, the linker will not know what value to give the entry-point
  577. field in the output file header; if more than one defines a start
  578. point, the linker will not know e{which} value to use.
  579. An example of a NASM source file which can be assembled to a
  580. c{.OBJ} file and linked on its own to a c{.EXE} is given here. It
  581. demonstrates the basic principles of defining a stack, initialising
  582. the segment registers, and declaring a start point. This file is
  583. also provided in the I{test subdirectory}c{test} subdirectory of
  584. the NASM archives, under the name c{objexe.asm}.
  585. c           segment code
  586. c ..start:  mov ax,data
  587. c           mov ds,ax
  588. c           mov ax,stack
  589. c           mov ss,ax
  590. c           mov sp,stacktop
  591. This initial piece of code sets up c{DS} to point to the data
  592. segment, and initialises c{SS} and c{SP} to point to the top of
  593. the provided stack. Notice that interrupts are implicitly disabled
  594. for one instruction after a move into c{SS}, precisely for this
  595. situation, so that there's no chance of an interrupt occurring
  596. between the loads of c{SS} and c{SP} and not having a stack to
  597. execute on.
  598. Note also that the special symbol c{..start} is defined at the
  599. beginning of this code, which means that will be the entry point
  600. into the resulting executable file.
  601. c           mov dx,hello
  602. c           mov ah,9
  603. c           int 0x21
  604. The above is the main program: load c{DS:DX} with a pointer to the
  605. greeting message (c{hello} is implicitly relative to the segment
  606. c{data}, which was loaded into c{DS} in the setup code, so the
  607. full pointer is valid), and call the DOS print-string function.
  608. c           mov ax,0x4c00
  609. c           int 0x21
  610. This terminates the program using another DOS system call.
  611. c           segment data
  612. c hello:    db 'hello, world', 13, 10, '$'
  613. The data segment contains the string we want to display.
  614. c           segment stack stack
  615. c           resb 64
  616. c stacktop:
  617. The above code declares a stack segment containing 64 bytes of
  618. uninitialised stack space, and points c{stacktop} at the top of it.
  619. The directive c{segment stack stack} defines a segment e{called}
  620. c{stack}, and also of e{type} c{STACK}. The latter is not
  621. necessary to the correct running of the program, but linkers are
  622. likely to issue warnings or errors if your program has no segment of
  623. type c{STACK}.
  624. The above file, when assembled into a c{.OBJ} file, will link on
  625. its own to a valid c{.EXE} file, which when run will print `hello,
  626. world' and then exit.
  627. S{binexe} Using the c{bin} Format To Generate c{.EXE} Files
  628. The c{.EXE} file format is simple enough that it's possible to
  629. build a c{.EXE} file by writing a pure-binary program and sticking
  630. a 32-byte header on the front. This header is simple enough that it
  631. can be generated using c{DB} and c{DW} commands by NASM itself, so
  632. that you can use the c{bin} output format to directly generate
  633. c{.EXE} files.
  634. Included in the NASM archives, in the I{misc subdirectory}c{misc}
  635. subdirectory, is a file ic{exebin.mac} of macros. It defines three
  636. macros: ic{EXE_begin}, ic{EXE_stack} and ic{EXE_end}.
  637. To produce a c{.EXE} file using this method, you should start by
  638. using c{%include} to load the c{exebin.mac} macro package into
  639. your source file. You should then issue the c{EXE_begin} macro call
  640. (which takes no arguments) to generate the file header data. Then
  641. write code as normal for the c{bin} format - you can use all three
  642. standard sections c{.text}, c{.data} and c{.bss}. At the end of
  643. the file you should call the c{EXE_end} macro (again, no arguments),
  644. which defines some symbols to mark section sizes, and these symbols
  645. are referred to in the header code generated by c{EXE_begin}.
  646. In this model, the code you end up writing starts at c{0x100}, just
  647. like a c{.COM} file - in fact, if you strip off the 32-byte header
  648. from the resulting c{.EXE} file, you will have a valid c{.COM}
  649. program. All the segment bases are the same, so you are limited to a
  650. 64K program, again just like a c{.COM} file. Note that an c{ORG}
  651. directive is issued by the c{EXE_begin} macro, so you should not
  652. explicitly issue one of your own.
  653. You can't directly refer to your segment base value, unfortunately,
  654. since this would require a relocation in the header, and things
  655. would get a lot more complicated. So you should get your segment
  656. base by copying it out of c{CS} instead.
  657. On entry to your c{.EXE} file, c{SS:SP} are already set up to
  658. point to the top of a 2Kb stack. You can adjust the default stack
  659. size of 2Kb by calling the c{EXE_stack} macro. For example, to
  660. change the stack size of your program to 64 bytes, you would call
  661. c{EXE_stack 64}.
  662. A sample program which generates a c{.EXE} file in this way is
  663. given in the c{test} subdirectory of the NASM archive, as
  664. c{binexe.asm}.
  665. H{comfiles} Producing ic{.COM} Files
  666. While large DOS programs must be written as c{.EXE} files, small
  667. ones are often better written as c{.COM} files. c{.COM} files are
  668. pure binary, and therefore most easily produced using the c{bin}
  669. output format.
  670. S{combinfmt} Using the c{bin} Format To Generate c{.COM} Files
  671. c{.COM} files expect to be loaded at offset c{100h} into their
  672. segment (though the segment may change). Execution then begins at
  673. Ic{ORG}c{100h}, i.e. right at the start of the program. So to
  674. write a c{.COM} program, you would create a source file looking
  675. like
  676. c           org 100h
  677. c           section .text
  678. c start:    ; put your code here
  679. c           section .data
  680. c           ; put data items here
  681. c           section .bss
  682. c           ; put uninitialised data here
  683. The c{bin} format puts the c{.text} section first in the file, so
  684. you can declare data or BSS items before beginning to write code if
  685. you want to and the code will still end up at the front of the file
  686. where it belongs.
  687. The BSS (uninitialised data) section does not take up space in the
  688. c{.COM} file itself: instead, addresses of BSS items are resolved
  689. to point at space beyond the end of the file, on the grounds that
  690. this will be free memory when the program is run. Therefore you
  691. should not rely on your BSS being initialised to all zeros when you
  692. run.
  693. To assemble the above program, you should use a command line like
  694. c nasm myprog.asm -fbin -o myprog.com
  695. The c{bin} format would produce a file called c{myprog} if no
  696. explicit output file name were specified, so you have to override it
  697. and give the desired file name.
  698. S{comobjfmt} Using the c{obj} Format To Generate c{.COM} Files
  699. If you are writing a c{.COM} program as more than one module, you
  700. may wish to assemble several c{.OBJ} files and link them together
  701. into a c{.COM} program. You can do this, provided you have a linker
  702. capable of outputting c{.COM} files directly (i{TLINK} does this),
  703. or alternatively a converter program such as ic{EXE2BIN} to
  704. transform the c{.EXE} file output from the linker into a c{.COM}
  705. file.
  706. If you do this, you need to take care of several things:
  707. b The first object file containing code should start its code
  708. segment with a line like c{RESB 100h}. This is to ensure that the
  709. code begins at offset c{100h} relative to the beginning of the code
  710. segment, so that the linker or converter program does not have to
  711. adjust address references within the file when generating the
  712. c{.COM} file. Other assemblers use an ic{ORG} directive for this
  713. purpose, but c{ORG} in NASM is a format-specific directive to the
  714. c{bin} output format, and does not mean the same thing as it does
  715. in MASM-compatible assemblers.
  716. b You don't need to define a stack segment.
  717. b All your segments should be in the same group, so that every time
  718. your code or data references a symbol offset, all offsets are
  719. relative to the same segment base. This is because, when a c{.COM}
  720. file is loaded, all the segment registers contain the same value.
  721. H{sysfiles} Producing ic{.SYS} Files
  722. i{MS-DOS device drivers} - c{.SYS} files - are pure binary files,
  723. similar to c{.COM} files, except that they start at origin zero
  724. rather than c{100h}. Therefore, if you are writing a device driver
  725. using the c{bin} format, you do not need the c{ORG} directive,
  726. since the default origin for c{bin} is zero. Similarly, if you are
  727. using c{obj}, you do not need the c{RESB 100h} at the start of
  728. your code segment.
  729. c{.SYS} files start with a header structure, containing pointers to
  730. the various routines inside the driver which do the work. This
  731. structure should be defined at the start of the code segment, even
  732. though it is not actually code.
  733. For more information on the format of c{.SYS} files, and the data
  734. which has to go in the header structure, a list of books is given in
  735. the Frequently Asked Questions list for the newsgroup
  736. W{news:comp.os.msdos.programmer}ic{comp.os.msdos.programmer}.
  737. H{16c} Interfacing to 16-bit C Programs
  738. This section covers the basics of writing assembly routines that
  739. call, or are called from, C programs. To do this, you would
  740. typically write an assembly module as a c{.OBJ} file, and link it
  741. with your C modules to produce a i{mixed-language program}.
  742. S{16cunder} External Symbol Names
  743. I{C symbol names}I{underscore, in C symbols}C compilers have the
  744. convention that the names of all global symbols (functions or data)
  745. they define are formed by prefixing an underscore to the name as it
  746. appears in the C program. So, for example, the function a C
  747. programmer thinks of as c{printf} appears to an assembly language
  748. programmer as c{_printf}. This means that in your assembly
  749. programs, you can define symbols without a leading underscore, and
  750. not have to worry about name clashes with C symbols.
  751. If you find the underscores inconvenient, you can define macros to
  752. replace the c{GLOBAL} and c{EXTERN} directives as follows:
  753. c %macro cglobal 1
  754. c           global _%1
  755. c %define %1 _%1
  756. c %endmacro
  757. c %macro cextern 1
  758. c           extern _%1
  759. c %define %1 _%1
  760. c %endmacro
  761. (These forms of the macros only take one argument at a time; a
  762. c{%rep} construct could solve this.)
  763. If you then declare an external like this:
  764. c           cextern printf
  765. then the macro will expand it as
  766. c           extern _printf
  767. c %define printf _printf
  768. Thereafter, you can reference c{printf} as if it was a symbol, and
  769. the preprocessor will put the leading underscore on where necessary.
  770. The c{cglobal} macro works similarly. You must use c{cglobal}
  771. before defining the symbol in question, but you would have had to do
  772. that anyway if you used c{GLOBAL}.
  773. S{16cmodels} i{Memory Models}
  774. NASM contains no mechanism to support the various C memory models
  775. directly; you have to keep track yourself of which one you are
  776. writing for. This means you have to keep track of the following
  777. things:
  778. b In models using a single code segment (tiny, small and compact),
  779. functions are near. This means that function pointers, when stored
  780. in data segments or pushed on the stack as function arguments, are
  781. 16 bits long and contain only an offset field (the c{CS} register
  782. never changes its value, and always gives the segment part of the
  783. full function address), and that functions are called using ordinary
  784. near c{CALL} instructions and return using c{RETN} (which, in
  785. NASM, is synonymous with c{RET} anyway). This means both that you
  786. should write your own routines to return with c{RETN}, and that you
  787. should call external C routines with near c{CALL} instructions.
  788. b In models using more than one code segment (medium, large and
  789. huge), functions are far. This means that function pointers are 32
  790. bits long (consisting of a 16-bit offset followed by a 16-bit
  791. segment), and that functions are called using c{CALL FAR} (or
  792. c{CALL seg:offset}) and return using c{RETF}. Again, you should
  793. therefore write your own routines to return with c{RETF} and use
  794. c{CALL FAR} to call external routines.
  795. b In models using a single data segment (tiny, small and medium),
  796. data pointers are 16 bits long, containing only an offset field (the
  797. c{DS} register doesn't change its value, and always gives the
  798. segment part of the full data item address).
  799. b In models using more than one data segment (compact, large and
  800. huge), data pointers are 32 bits long, consisting of a 16-bit offset
  801. followed by a 16-bit segment. You should still be careful not to
  802. modify c{DS} in your routines without restoring it afterwards, but
  803. c{ES} is free for you to use to access the contents of 32-bit data
  804. pointers you are passed.
  805. b The huge memory model allows single data items to exceed 64K in
  806. size. In all other memory models, you can access the whole of a data
  807. item just by doing arithmetic on the offset field of the pointer you
  808. are given, whether a segment field is present or not; in huge model,
  809. you have to be more careful of your pointer arithmetic.
  810. b In most memory models, there is a e{default} data segment, whose
  811. segment address is kept in c{DS} throughout the program. This data
  812. segment is typically the same segment as the stack, kept in c{SS},
  813. so that functions' local variables (which are stored on the stack)
  814. and global data items can both be accessed easily without changing
  815. c{DS}. Particularly large data items are typically stored in other
  816. segments. However, some memory models (though not the standard
  817. ones, usually) allow the assumption that c{SS} and c{DS} hold the
  818. same value to be removed. Be careful about functions' local
  819. variables in this latter case.
  820. In models with a single code segment, the segment is called
  821. ic{_TEXT}, so your code segment must also go by this name in order
  822. to be linked into the same place as the main code segment. In models
  823. with a single data segment, or with a default data segment, it is
  824. called ic{_DATA}.
  825. S{16cfunc} Function Definitions and Function Calls
  826. I{functions, C calling convention}The i{C calling convention} in
  827. 16-bit programs is as follows. In the following description, the
  828. words e{caller} and e{callee} are used to denote the function
  829. doing the calling and the function which gets called.
  830. b The caller pushes the function's parameters on the stack, one
  831. after another, in reverse order (right to left, so that the first
  832. argument specified to the function is pushed last).
  833. b The caller then executes a c{CALL} instruction to pass control
  834. to the callee. This c{CALL} is either near or far depending on the
  835. memory model.
  836. b The callee receives control, and typically (although this is not
  837. actually necessary, in functions which do not need to access their
  838. parameters) starts by saving the value of c{SP} in c{BP} so as to
  839. be able to use c{BP} as a base pointer to find its parameters on
  840. the stack. However, the caller was probably doing this too, so part
  841. of the calling convention states that c{BP} must be preserved by
  842. any C function. Hence the callee, if it is going to set up c{BP} as
  843. a ie{frame pointer}, must push the previous value first.
  844. b The callee may then access its parameters relative to c{BP}.
  845. The word at c{[BP]} holds the previous value of c{BP} as it was
  846. pushed; the next word, at c{[BP+2]}, holds the offset part of the
  847. return address, pushed implicitly by c{CALL}. In a small-model
  848. (near) function, the parameters start after that, at c{[BP+4]}; in
  849. a large-model (far) function, the segment part of the return address
  850. lives at c{[BP+4]}, and the parameters begin at c{[BP+6]}. The
  851. leftmost parameter of the function, since it was pushed last, is
  852. accessible at this offset from c{BP}; the others follow, at
  853. successively greater offsets. Thus, in a function such as c{printf}
  854. which takes a variable number of parameters, the pushing of the
  855. parameters in reverse order means that the function knows where to
  856. find its first parameter, which tells it the number and type of the
  857. remaining ones.
  858. b The callee may also wish to decrease c{SP} further, so as to
  859. allocate space on the stack for local variables, which will then be
  860. accessible at negative offsets from c{BP}.
  861. b The callee, if it wishes to return a value to the caller, should
  862. leave the value in c{AL}, c{AX} or c{DX:AX} depending on the size
  863. of the value. Floating-point results are sometimes (depending on the
  864. compiler) returned in c{ST0}.
  865. b Once the callee has finished processing, it restores c{SP} from
  866. c{BP} if it had allocated local stack space, then pops the previous
  867. value of c{BP}, and returns via c{RETN} or c{RETF} depending on
  868. memory model.
  869. b When the caller regains control from the callee, the function
  870. parameters are still on the stack, so it typically adds an immediate
  871. constant to c{SP} to remove them (instead of executing a number of
  872. slow c{POP} instructions). Thus, if a function is accidentally
  873. called with the wrong number of parameters due to a prototype
  874. mismatch, the stack will still be returned to a sensible state since
  875. the caller, which e{knows} how many parameters it pushed, does the
  876. removing.
  877. It is instructive to compare this calling convention with that for
  878. Pascal programs (described in k{16bpfunc}). Pascal has a simpler
  879. convention, since no functions have variable numbers of parameters.
  880. Therefore the callee knows how many parameters it should have been
  881. passed, and is able to deallocate them from the stack itself by
  882. passing an immediate argument to the c{RET} or c{RETF}
  883. instruction, so the caller does not have to do it. Also, the
  884. parameters are pushed in left-to-right order, not right-to-left,
  885. which means that a compiler can give better guarantees about
  886. sequence points without performance suffering.
  887. Thus, you would define a function in C style in the following way.
  888. The following example is for small model:
  889. c           global _myfunc
  890. c _myfunc:  push bp
  891. c           mov bp,sp
  892. c           sub sp,0x40            ; 64 bytes of local stack space
  893. c           mov bx,[bp+4]          ; first parameter to function
  894. c           ; some more code
  895. c           mov sp,bp              ; undo "sub sp,0x40" above
  896. c           pop bp
  897. c           ret
  898. For a large-model function, you would replace c{RET} by c{RETF},
  899. and look for the first parameter at c{[BP+6]} instead of
  900. c{[BP+4]}. Of course, if one of the parameters is a pointer, then
  901. the offsets of e{subsequent} parameters will change depending on
  902. the memory model as well: far pointers take up four bytes on the
  903. stack when passed as a parameter, whereas near pointers take up two.
  904. At the other end of the process, to call a C function from your
  905. assembly code, you would do something like this:
  906. c           extern _printf
  907. c           ; and then, further down...
  908. c           push word [myint]      ; one of my integer variables
  909. c           push word mystring     ; pointer into my data segment
  910. c           call _printf
  911. c           add sp,byte 4          ; `byte' saves space
  912. c           ; then those data items...
  913. c           segment _DATA
  914. c myint     dw 1234
  915. c mystring  db 'This number -> %d <- should be 1234',10,0
  916. This piece of code is the small-model assembly equivalent of the C
  917. code
  918. c     int myint = 1234;
  919. c     printf("This number -> %d <- should be 1234n", myint);
  920. In large model, the function-call code might look more like this. In
  921. this example, it is assumed that c{DS} already holds the segment
  922. base of the segment c{_DATA}. If not, you would have to initialise
  923. it first.
  924. c           push word [myint]
  925. c           push word seg mystring ; Now push the segment, and...
  926. c           push word mystring     ; ... offset of "mystring"
  927. c           call far _printf
  928. c           add sp,byte 6
  929. The integer value still takes up one word on the stack, since large
  930. model does not affect the size of the c{int} data type. The first
  931. argument (pushed last) to c{printf}, however, is a data pointer,
  932. and therefore has to contain a segment and offset part. The segment
  933. should be stored second in memory, and therefore must be pushed
  934. first. (Of course, c{PUSH DS} would have been a shorter instruction
  935. than c{PUSH WORD SEG mystring}, if c{DS} was set up as the above
  936. example assumed.) Then the actual call becomes a far call, since
  937. functions expect far calls in large model; and c{SP} has to be
  938. increased by 6 rather than 4 afterwards to make up for the extra
  939. word of parameters.
  940. S{16cdata} Accessing Data Items
  941. To get at the contents of C variables, or to declare variables which
  942. C can access, you need only declare the names as c{GLOBAL} or
  943. c{EXTERN}. (Again, the names require leading underscores, as stated
  944. in k{16cunder}.) Thus, a C variable declared as c{int i} can be
  945. accessed from assembler as
  946. c           extern _i
  947. c           mov ax,[_i]
  948. And to declare your own integer variable which C programs can access
  949. as c{extern int j}, you do this (making sure you are assembling in
  950. the c{_DATA} segment, if necessary):
  951. c           global _j
  952. c _j        dw 0
  953. To access a C array, you need to know the size of the components of
  954. the array. For example, c{int} variables are two bytes long, so if
  955. a C program declares an array as c{int a[10]}, you can access
  956. c{a[3]} by coding c{mov ax,[_a+6]}. (The byte offset 6 is obtained
  957. by multiplying the desired array index, 3, by the size of the array
  958. element, 2.) The sizes of the C base types in 16-bit compilers are:
  959. 1 for c{char}, 2 for c{short} and c{int}, 4 for c{long} and
  960. c{float}, and 8 for c{double}.
  961. To access a C i{data structure}, you need to know the offset from
  962. the base of the structure to the field you are interested in. You
  963. can either do this by converting the C structure definition into a
  964. NASM structure definition (using ic{STRUC}), or by calculating the
  965. one offset and using just that.
  966. To do either of these, you should read your C compiler's manual to
  967. find out how it organises data structures. NASM gives no special
  968. alignment to structure members in its own c{STRUC} macro, so you
  969. have to specify alignment yourself if the C compiler generates it.
  970. Typically, you might find that a structure like
  971. c struct {
  972. c     char c;
  973. c     int i;
  974. c } foo;
  975. might be four bytes long rather than three, since the c{int} field
  976. would be aligned to a two-byte boundary. However, this sort of
  977. feature tends to be a configurable option in the C compiler, either
  978. using command-line options or c{#pragma} lines, so you have to find
  979. out how your own compiler does it.
  980. S{16cmacro} ic{c16.mac}: Helper Macros for the 16-bit C Interface
  981. Included in the NASM archives, in the I{misc subdirectory}c{misc}
  982. directory, is a file c{c16.mac} of macros. It defines three macros:
  983. ic{proc}, ic{arg} and ic{endproc}. These are intended to be
  984. used for C-style procedure definitions, and they automate a lot of
  985. the work involved in keeping track of the calling convention.
  986. An example of an assembly function using the macro set is given
  987. here:
  988. c           proc _nearproc
  989. c %$i       arg
  990. c %$j       arg
  991. c           mov ax,[bp + %$i]
  992. c           mov bx,[bp + %$j]
  993. c           add ax,[bx]
  994. c           endproc
  995. This defines c{_nearproc} to be a procedure taking two arguments,
  996. the first (c{i}) an integer and the second (c{j}) a pointer to an
  997. integer. It returns c{i + *j}.
  998. Note that the c{arg} macro has an c{EQU} as the first line of its
  999. expansion, and since the label before the macro call gets prepended
  1000. to the first line of the expanded macro, the c{EQU} works, defining
  1001. c{%$i} to be an offset from c{BP}. A context-local variable is
  1002. used, local to the context pushed by the c{proc} macro and popped
  1003. by the c{endproc} macro, so that the same argument name can be used
  1004. in later procedures. Of course, you don't e{have} to do that.
  1005. The macro set produces code for near functions (tiny, small and
  1006. compact-model code) by default. You can have it generate far
  1007. functions (medium, large and huge-model code) by means of coding
  1008. Ic{FARCODE}c{%define FARCODE}. This changes the kind of return
  1009. instruction generated by c{endproc}, and also changes the starting
  1010. point for the argument offsets. The macro set contains no intrinsic
  1011. dependency on whether data pointers are far or not.
  1012. c{arg} can take an optional parameter, giving the size of the
  1013. argument. If no size is given, 2 is assumed, since it is likely that
  1014. many function parameters will be of type c{int}.
  1015. The large-model equivalent of the above function would look like this:
  1016. c %define FARCODE
  1017. c           proc _farproc
  1018. c %$i       arg
  1019. c %$j       arg 4
  1020. c           mov ax,[bp + %$i]
  1021. c           mov bx,[bp + %$j]
  1022. c           mov es,[bp + %$j + 2]
  1023. c           add ax,[bx]
  1024. c           endproc
  1025. This makes use of the argument to the c{arg} macro to define a
  1026. parameter of size 4, because c{j} is now a far pointer. When we
  1027. load from c{j}, we must load a segment and an offset.
  1028. H{16bp} Interfacing to i{Borland Pascal} Programs
  1029. Interfacing to Borland Pascal programs is similar in concept to
  1030. interfacing to 16-bit C programs. The differences are:
  1031. b The leading underscore required for interfacing to C programs is
  1032. not required for Pascal.
  1033. b The memory model is always large: functions are far, data
  1034. pointers are far, and no data item can be more than 64K long.
  1035. (Actually, some functions are near, but only those functions that
  1036. are local to a Pascal unit and never called from outside it. All
  1037. assembly functions that Pascal calls, and all Pascal functions that
  1038. assembly routines are able to call, are far.) However, all static
  1039. data declared in a Pascal program goes into the default data
  1040. segment, which is the one whose segment address will be in c{DS}
  1041. when control is passed to your assembly code. The only things that
  1042. do not live in the default data segment are local variables (they
  1043. live in the stack segment) and dynamically allocated variables. All
  1044. data e{pointers}, however, are far.
  1045. b The function calling convention is different - described below.
  1046. b Some data types, such as strings, are stored differently.
  1047. b There are restrictions on the segment names you are allowed to
  1048. use - Borland Pascal will ignore code or data declared in a segment
  1049. it doesn't like the name of. The restrictions are described below.
  1050. S{16bpfunc} The Pascal Calling Convention
  1051. I{functions, Pascal calling convention}I{Pascal calling
  1052. convention}The 16-bit Pascal calling convention is as follows. In
  1053. the following description, the words e{caller} and e{callee} are
  1054. used to denote the function doing the calling and the function which
  1055. gets called.
  1056. b The caller pushes the function's parameters on the stack, one
  1057. after another, in normal order (left to right, so that the first
  1058. argument specified to the function is pushed first).
  1059. b The caller then executes a far c{CALL} instruction to pass
  1060. control to the callee.
  1061. b The callee receives control, and typically (although this is not
  1062. actually necessary, in functions which do not need to access their
  1063. parameters) starts by saving the value of c{SP} in c{BP} so as to
  1064. be able to use c{BP} as a base pointer to find its parameters on
  1065. the stack. However, the caller was probably doing this too, so part
  1066. of the calling convention states that c{BP} must be preserved by
  1067. any function. Hence the callee, if it is going to set up c{BP} as a
  1068. i{frame pointer}, must push the previous value first.
  1069. b The callee may then access its parameters relative to c{BP}.
  1070. The word at c{[BP]} holds the previous value of c{BP} as it was
  1071. pushed. The next word, at c{[BP+2]}, holds the offset part of the
  1072. return address, and the next one at c{[BP+4]} the segment part. The
  1073. parameters begin at c{[BP+6]}. The rightmost parameter of the
  1074. function, since it was pushed last, is accessible at this offset
  1075. from c{BP}; the others follow, at successively greater offsets.
  1076. b The callee may also wish to decrease c{SP} further, so as to
  1077. allocate space on the stack for local variables, which will then be
  1078. accessible at negative offsets from c{BP}.
  1079. b The callee, if it wishes to return a value to the caller, should
  1080. leave the value in c{AL}, c{AX} or c{DX:AX} depending on the size
  1081. of the value. Floating-point results are returned in c{ST0}.
  1082. Results of type c{Real} (Borland's own custom floating-point data
  1083. type, not handled directly by the FPU) are returned in c{DX:BX:AX}.
  1084. To return a result of type c{String}, the caller pushes a pointer
  1085. to a temporary string before pushing the parameters, and the callee
  1086. places the returned string value at that location. The pointer is
  1087. not a parameter, and should not be removed from the stack by the
  1088. c{RETF} instruction.
  1089. b Once the callee has finished processing, it restores c{SP} from
  1090. c{BP} if it had allocated local stack space, then pops the previous
  1091. value of c{BP}, and returns via c{RETF}. It uses the form of
  1092. c{RETF} with an immediate parameter, giving the number of bytes
  1093. taken up by the parameters on the stack. This causes the parameters
  1094. to be removed from the stack as a side effect of the return
  1095. instruction.
  1096. b When the caller regains control from the callee, the function
  1097. parameters have already been removed from the stack, so it needs to
  1098. do nothing further.
  1099. Thus, you would define a function in Pascal style, taking two
  1100. c{Integer}-type parameters, in the following way:
  1101. c           global myfunc
  1102. c myfunc:   push bp
  1103. c           mov bp,sp
  1104. c           sub sp,0x40            ; 64 bytes of local stack space
  1105. c           mov bx,[bp+8]          ; first parameter to function
  1106. c           mov bx,[bp+6]          ; second parameter to function
  1107. c           ; some more code
  1108. c           mov sp,bp              ; undo "sub sp,0x40" above
  1109. c           pop bp
  1110. c           retf 4                 ; total size of params is 4
  1111. At the other end of the process, to call a Pascal function from your
  1112. assembly code, you would do something like this:
  1113. c           extern SomeFunc
  1114. c           ; and then, further down...
  1115. c           push word seg mystring ; Now push the segment, and...
  1116. c           push word mystring     ; ... offset of "mystring"
  1117. c           push word [myint]      ; one of my variables
  1118. c           call far SomeFunc
  1119. This is equivalent to the Pascal code
  1120. c procedure SomeFunc(String: PChar; Int: Integer);
  1121. c     SomeFunc(@mystring, myint);
  1122. S{16bpseg} Borland Pascal I{segment names, Borland Pascal}Segment
  1123. Name Restrictions
  1124. Since Borland Pascal's internal unit file format is completely
  1125. different from c{OBJ}, it only makes a very sketchy job of actually
  1126. reading and understanding the various information contained in a
  1127. real c{OBJ} file when it links that in. Therefore an object file
  1128. intended to be linked to a Pascal program must obey a number of
  1129. restrictions:
  1130. b Procedures and functions must be in a segment whose name is
  1131. either c{CODE}, c{CSEG}, or something ending in c{_TEXT}.
  1132. b Initialised data must be in a segment whose name is either
  1133. c{CONST} or something ending in c{_DATA}.
  1134. b Uninitialised data must be in a segment whose name is either
  1135. c{DATA}, c{DSEG}, or something ending in c{_BSS}.
  1136. b Any other segments in the object file are completely ignored.
  1137. c{GROUP} directives and segment attributes are also ignored.
  1138. S{16bpmacro} Using ic{c16.mac} With Pascal Programs
  1139. The c{c16.mac} macro package, described in k{16cmacro}, can also
  1140. be used to simplify writing functions to be called from Pascal
  1141. programs, if you code Ic{PASCAL}c{%define PASCAL}. This
  1142. definition ensures that functions are far (it implies
  1143. ic{FARCODE}), and also causes procedure return instructions to be
  1144. generated with an operand.
  1145. Defining c{PASCAL} does not change the code which calculates the
  1146. argument offsets; you must declare your function's arguments in
  1147. reverse order. For example:
  1148. c %define PASCAL
  1149. c           proc _pascalproc
  1150. c %$j       arg 4
  1151. c %$i       arg
  1152. c           mov ax,[bp + %$i]
  1153. c           mov bx,[bp + %$j]
  1154. c           mov es,[bp + %$j + 2]
  1155. c           add ax,[bx]
  1156. c           endproc
  1157. This defines the same routine, conceptually, as the example in
  1158. k{16cmacro}: it defines a function taking two arguments, an integer
  1159. and a pointer to an integer, which returns the sum of the integer
  1160. and the contents of the pointer. The only difference between this
  1161. code and the large-model C version is that c{PASCAL} is defined
  1162. instead of c{FARCODE}, and that the arguments are declared in
  1163. reverse order.
  1164. C{32bit} Writing 32-bit Code (Unix, Win32, DJGPP)
  1165. This chapter attempts to cover some of the common issues involved
  1166. when writing 32-bit code, to run under i{Win32} or Unix, or to be
  1167. linked with C code generated by a Unix-style C compiler such as
  1168. i{DJGPP}. It covers how to write assembly code to interface with
  1169. 32-bit C routines, and how to write position-independent code for
  1170. shared libraries.
  1171. Almost all 32-bit code, and in particular all code running under
  1172. Win32, DJGPP or any of the PC Unix variants, runs in I{flat memory
  1173. model}e{flat} memory model. This means that the segment registers
  1174. and paging have already been set up to give you the same 32-bit 4Gb
  1175. address space no matter what segment you work relative to, and that
  1176. you should ignore all segment registers completely. When writing
  1177. flat-model application code, you never need to use a segment
  1178. override or modify any segment register, and the code-section
  1179. addresses you pass to c{CALL} and c{JMP} live in the same address
  1180. space as the data-section addresses you access your variables by and
  1181. the stack-section addresses you access local variables and procedure
  1182. parameters by. Every address is 32 bits long and contains only an
  1183. offset part.
  1184. H{32c} Interfacing to 32-bit C Programs
  1185. A lot of the discussion in k{16c}, about interfacing to 16-bit C
  1186. programs, still applies when working in 32 bits. The absence of
  1187. memory models or segmentation worries simplifies things a lot.
  1188. S{32cunder} External Symbol Names
  1189. Most 32-bit C compilers share the convention used by 16-bit
  1190. compilers, that the names of all global symbols (functions or data)
  1191. they define are formed by prefixing an underscore to the name as it
  1192. appears in the C program. However, not all of them do: the ELF
  1193. specification states that C symbols do e{not} have a leading
  1194. underscore on their assembly-language names.
  1195. The older Linux c{a.out} C compiler, all Win32 compilers, DJGPP,
  1196. and NetBSD and FreeBSD, all use the leading underscore; for these
  1197. compilers, the macros c{cextern} and c{cglobal}, as given in
  1198. k{16cunder}, will still work. For ELF, though, the leading
  1199. underscore should not be used.
  1200. S{32cfunc} Function Definitions and Function Calls
  1201. I{functions, C calling convention}The i{C calling convention}The C
  1202. calling convention in 32-bit programs is as follows. In the
  1203. following description, the words e{caller} and e{callee} are used
  1204. to denote the function doing the calling and the function which gets
  1205. called.
  1206. b The caller pushes the function's parameters on the stack, one
  1207. after another, in reverse order (right to left, so that the first
  1208. argument specified to the function is pushed last).
  1209. b The caller then executes a near c{CALL} instruction to pass
  1210. control to the callee.
  1211. b The callee receives control, and typically (although this is not
  1212. actually necessary, in functions which do not need to access their
  1213. parameters) starts by saving the value of c{ESP} in c{EBP} so as
  1214. to be able to use c{EBP} as a base pointer to find its parameters
  1215. on the stack. However, the caller was probably doing this too, so
  1216. part of the calling convention states that c{EBP} must be preserved
  1217. by any C function. Hence the callee, if it is going to set up
  1218. c{EBP} as a i{frame pointer}, must push the previous value first.
  1219. b The callee may then access its parameters relative to c{EBP}.
  1220. The doubleword at c{[EBP]} holds the previous value of c{EBP} as
  1221. it was pushed; the next doubleword, at c{[EBP+4]}, holds the return
  1222. address, pushed implicitly by c{CALL}. The parameters start after
  1223. that, at c{[EBP+8]}. The leftmost parameter of the function, since
  1224. it was pushed last, is accessible at this offset from c{EBP}; the
  1225. others follow, at successively greater offsets. Thus, in a function
  1226. such as c{printf} which takes a variable number of parameters, the
  1227. pushing of the parameters in reverse order means that the function
  1228. knows where to find its first parameter, which tells it the number
  1229. and type of the remaining ones.
  1230. b The callee may also wish to decrease c{ESP} further, so as to
  1231. allocate space on the stack for local variables, which will then be
  1232. accessible at negative offsets from c{EBP}.
  1233. b The callee, if it wishes to return a value to the caller, should
  1234. leave the value in c{AL}, c{AX} or c{EAX} depending on the size
  1235. of the value. Floating-point results are typically returned in
  1236. c{ST0}.
  1237. b Once the callee has finished processing, it restores c{ESP} from
  1238. c{EBP} if it had allocated local stack space, then pops the previous
  1239. value of c{EBP}, and returns via c{RET} (equivalently, c{RETN}).
  1240. b When the caller regains control from the callee, the function
  1241. parameters are still on the stack, so it typically adds an immediate
  1242. constant to c{ESP} to remove them (instead of executing a number of
  1243. slow c{POP} instructions). Thus, if a function is accidentally
  1244. called with the wrong number of parameters due to a prototype
  1245. mismatch, the stack will still be returned to a sensible state since
  1246. the caller, which e{knows} how many parameters it pushed, does the
  1247. removing.
  1248. There is an alternative calling convention used by Win32 programs
  1249. for Windows API calls, and also for functions called e{by} the
  1250. Windows API such as window procedures: they follow what Microsoft
  1251. calls the c{__stdcall} convention. This is slightly closer to the
  1252. Pascal convention, in that the callee clears the stack by passing a
  1253. parameter to the c{RET} instruction. However, the parameters are
  1254. still pushed in right-to-left order.
  1255. Thus, you would define a function in C style in the following way:
  1256. c           global _myfunc
  1257. c _myfunc:  push ebp
  1258. c           mov ebp,esp
  1259. c           sub esp,0x40           ; 64 bytes of local stack space
  1260. c           mov ebx,[ebp+8]        ; first parameter to function
  1261. c           ; some more code
  1262. c           leave                  ; mov esp,ebp / pop ebp
  1263. c           ret
  1264. At the other end of the process, to call a C function from your
  1265. assembly code, you would do something like this:
  1266. c           extern _printf
  1267. c           ; and then, further down...
  1268. c           push dword [myint]     ; one of my integer variables
  1269. c           push dword mystring    ; pointer into my data segment
  1270. c           call _printf
  1271. c           add esp,byte 8         ; `byte' saves space
  1272. c           ; then those data items...
  1273. c           segment _DATA
  1274. c myint     dd 1234
  1275. c mystring  db 'This number -> %d <- should be 1234',10,0
  1276. This piece of code is the assembly equivalent of the C code
  1277. c     int myint = 1234;
  1278. c     printf("This number -> %d <- should be 1234n", myint);
  1279. S{32cdata} Accessing Data Items
  1280. To get at the contents of C variables, or to declare variables which
  1281. C can access, you need only declare the names as c{GLOBAL} or
  1282. c{EXTERN}. (Again, the names require leading underscores, as stated
  1283. in k{32cunder}.) Thus, a C variable declared as c{int i} can be
  1284. accessed from assembler as
  1285. c           extern _i
  1286. c           mov eax,[_i]
  1287. And to declare your own integer variable which C programs can access
  1288. as c{extern int j}, you do this (making sure you are assembling in
  1289. the c{_DATA} segment, if necessary):
  1290. c           global _j
  1291. c _j        dd 0
  1292. To access a C array, you need to know the size of the components of
  1293. the array. For example, c{int} variables are four bytes long, so if
  1294. a C program declares an array as c{int a[10]}, you can access
  1295. c{a[3]} by coding c{mov ax,[_a+12]}. (The byte offset 12 is obtained
  1296. by multiplying the desired array index, 3, by the size of the array
  1297. element, 4.) The sizes of the C base types in 32-bit compilers are:
  1298. 1 for c{char}, 2 for c{short}, 4 for c{int}, c{long} and
  1299. c{float}, and 8 for c{double}. Pointers, being 32-bit addresses,
  1300. are also 4 bytes long.
  1301. To access a C i{data structure}, you need to know the offset from
  1302. the base of the structure to the field you are interested in. You
  1303. can either do this by converting the C structure definition into a
  1304. NASM structure definition (using c{STRUC}), or by calculating the
  1305. one offset and using just that.
  1306. To do either of these, you should read your C compiler's manual to
  1307. find out how it organises data structures. NASM gives no special
  1308. alignment to structure members in its own ic{STRUC} macro, so you
  1309. have to specify alignment yourself if the C compiler generates it.
  1310. Typically, you might find that a structure like
  1311. c struct {
  1312. c     char c;
  1313. c     int i;
  1314. c } foo;
  1315. might be eight bytes long rather than five, since the c{int} field
  1316. would be aligned to a four-byte boundary. However, this sort of
  1317. feature is sometimes a configurable option in the C compiler, either
  1318. using command-line options or c{#pragma} lines, so you have to find
  1319. out how your own compiler does it.
  1320. S{32cmacro} ic{c32.mac}: Helper Macros for the 32-bit C Interface
  1321. Included in the NASM archives, in the I{misc directory}c{misc}
  1322. directory, is a file c{c32.mac} of macros. It defines three macros:
  1323. ic{proc}, ic{arg} and ic{endproc}. These are intended to be
  1324. used for C-style procedure definitions, and they automate a lot of
  1325. the work involved in keeping track of the calling convention.
  1326. An example of an assembly function using the macro set is given
  1327. here:
  1328. c           proc _proc32
  1329. c %$i       arg
  1330. c %$j       arg
  1331. c           mov eax,[ebp + %$i]
  1332. c           mov ebx,[ebp + %$j]
  1333. c           add eax,[ebx]
  1334. c           endproc
  1335. This defines c{_proc32} to be a procedure taking two arguments, the
  1336. first (c{i}) an integer and the second (c{j}) a pointer to an
  1337. integer. It returns c{i + *j}.
  1338. Note that the c{arg} macro has an c{EQU} as the first line of its
  1339. expansion, and since the label before the macro call gets prepended
  1340. to the first line of the expanded macro, the c{EQU} works, defining
  1341. c{%$i} to be an offset from c{BP}. A context-local variable is
  1342. used, local to the context pushed by the c{proc} macro and popped
  1343. by the c{endproc} macro, so that the same argument name can be used
  1344. in later procedures. Of course, you don't e{have} to do that.
  1345. c{arg} can take an optional parameter, giving the size of the
  1346. argument. If no size is given, 4 is assumed, since it is likely that
  1347. many function parameters will be of type c{int} or pointers.
  1348. H{picdll} Writing NetBSD/FreeBSD/OpenBSD and Linux/ELF i{Shared
  1349. Libraries}
  1350. ELF replaced the older c{a.out} object file format under Linux
  1351. because it contains support for i{position-independent code}
  1352. (i{PIC}), which makes writing shared libraries much easier. NASM
  1353. supports the ELF position-independent code features, so you can
  1354. write Linux ELF shared libraries in NASM.
  1355. i{NetBSD}, and its close cousins i{FreeBSD} and i{OpenBSD}, take
  1356. a different approach by hacking PIC support into the c{a.out}
  1357. format. NASM supports this as the ic{aoutb} output format, so you
  1358. can write i{BSD} shared libraries in NASM too.
  1359. The operating system loads a PIC shared library by memory-mapping
  1360. the library file at an arbitrarily chosen point in the address space
  1361. of the running process. The contents of the library's code section
  1362. must therefore not depend on where it is loaded in memory.
  1363. Therefore, you cannot get at your variables by writing code like
  1364. this:
  1365. c           mov eax,[myvar]        ; WRONG
  1366. Instead, the linker provides an area of memory called the
  1367. ie{global offset table}, or i{GOT}; the GOT is situated at a
  1368. constant distance from your library's code, so if you can find out
  1369. where your library is loaded (which is typically done using a
  1370. c{CALL} and c{POP} combination), you can obtain the address of the
  1371. GOT, and you can then load the addresses of your variables out of
  1372. linker-generated entries in the GOT.
  1373. The e{data} section of a PIC shared library does not have these
  1374. restrictions: since the data section is writable, it has to be
  1375. copied into memory anyway rather than just paged in from the library
  1376. file, so as long as it's being copied it can be relocated too. So
  1377. you can put ordinary types of relocation in the data section without
  1378. too much worry (but see k{picglobal} for a caveat).
  1379. S{picgot} Obtaining the Address of the GOT
  1380. Each code module in your shared library should define the GOT as an
  1381. external symbol:
  1382. c           extern _GLOBAL_OFFSET_TABLE_   ; in ELF
  1383. c           extern __GLOBAL_OFFSET_TABLE_  ; in BSD a.out
  1384. At the beginning of any function in your shared library which plans
  1385. to access your data or BSS sections, you must first calculate the
  1386. address of the GOT. This is typically done by writing the function
  1387. in this form:
  1388. c func:     push ebp
  1389. c           mov ebp,esp
  1390. c           push ebx
  1391. c           call .get_GOT
  1392. c .get_GOT: pop ebx
  1393. c           add ebx,_GLOBAL_OFFSET_TABLE_+$$-.get_GOT wrt ..gotpc
  1394. c           ; the function body comes here
  1395. c           mov ebx,[ebp-4]
  1396. c           mov esp,ebp
  1397. c           pop ebp
  1398. c           ret
  1399. (For BSD, again, the symbol c{_GLOBAL_OFFSET_TABLE} requires a
  1400. second leading underscore.)
  1401. The first two lines of this function are simply the standard C
  1402. prologue to set up a stack frame, and the last three lines are
  1403. standard C function epilogue. The third line, and the fourth to last
  1404. line, save and restore the c{EBX} register, because PIC shared
  1405. libraries use this register to store the address of the GOT.
  1406. The interesting bit is the c{CALL} instruction and the following
  1407. two lines. The c{CALL} and c{POP} combination obtains the address
  1408. of the label c{.get_GOT}, without having to know in advance where
  1409. the program was loaded (since the c{CALL} instruction is encoded
  1410. relative to the current position). The c{ADD} instruction makes use
  1411. of one of the special PIC relocation types: i{GOTPC relocation}.
  1412. With the ic{WRT ..gotpc} qualifier specified, the symbol
  1413. referenced (here c{_GLOBAL_OFFSET_TABLE_}, the special symbol
  1414. assigned to the GOT) is given as an offset from the beginning of the
  1415. section. (Actually, ELF encodes it as the offset from the operand
  1416. field of the c{ADD} instruction, but NASM simplifies this
  1417. deliberately, so you do things the same way for both ELF and BSD.)
  1418. So the instruction then e{adds} the beginning of the section, to
  1419. get the real address of the GOT, and subtracts the value of
  1420. c{.get_GOT} which it knows is in c{EBX}. Therefore, by the time
  1421. that instruction has finished,
  1422. c{EBX} contains the address of the GOT.
  1423. If you didn't follow that, don't worry: it's never necessary to
  1424. obtain the address of the GOT by any other means, so you can put
  1425. those three instructions into a macro and safely ignore them:
  1426. c %macro get_GOT 0
  1427. c           call %%getgot
  1428. c %%getgot: pop ebx
  1429. c           add ebx,_GLOBAL_OFFSET_TABLE_+$$-%%getgot wrt ..gotpc
  1430. c %endmacro
  1431. S{piclocal} Finding Your Local Data Items
  1432. Having got the GOT, you can then use it to obtain the addresses of
  1433. your data items. Most variables will reside in the sections you have
  1434. declared; they can be accessed using the I{GOTOFF
  1435. relocation}c{..gotoff} special Ic{WRT ..gotoff}c{WRT} type. The
  1436. way this works is like this:
  1437. c           lea eax,[ebx+myvar wrt ..gotoff]
  1438. The expression c{myvar wrt ..gotoff} is calculated, when the shared
  1439. library is linked, to be the offset to the local variable c{myvar}
  1440. from the beginning of the GOT. Therefore, adding it to c{EBX} as
  1441. above will place the real address of c{myvar} in c{EAX}.
  1442. If you declare variables as c{GLOBAL} without specifying a size for
  1443. them, they are shared between code modules in the library, but do
  1444. not get exported from the library to the program that loaded it.
  1445. They will still be in your ordinary data and BSS sections, so you
  1446. can access them in the same way as local variables, using the above
  1447. c{..gotoff} mechanism.
  1448. Note that due to a peculiarity of the way BSD c{a.out} format
  1449. handles this relocation type, there must be at least one non-local
  1450. symbol in the same section as the address you're trying to access.
  1451. S{picextern} Finding External and Common Data Items
  1452. If your library needs to get at an external variable (external to
  1453. the e{library}, not just to one of the modules within it), you must
  1454. use the I{GOT relocations}Ic{WRT ..got}c{..got} type to get at
  1455. it. The c{..got} type, instead of giving you the offset from the
  1456. GOT base to the variable, gives you the offset from the GOT base to
  1457. a GOT e{entry} containing the address of the variable. The linker
  1458. will set up this GOT entry when it builds the library, and the
  1459. dynamic linker will place the correct address in it at load time. So
  1460. to obtain the address of an external variable c{extvar} in c{EAX},
  1461. you would code
  1462. c           mov eax,[ebx+extvar wrt ..got]
  1463. This loads the address of c{extvar} out of an entry in the GOT. The
  1464. linker, when it builds the shared library, collects together every
  1465. relocation of type c{..got}, and builds the GOT so as to ensure it
  1466. has every necessary entry present.
  1467. Common variables must also be accessed in this way.
  1468. S{picglobal} Exporting Symbols to the Library User
  1469. If you want to export symbols to the user of the library, you have
  1470. to declare whether they are functions or data, and if they are data,
  1471. you have to give the size of the data item. This is because the
  1472. dynamic linker has to build I{PLT}i{procedure linkage table}
  1473. entries for any exported functions, and also moves exported data
  1474. items away from the library's data section in which they were
  1475. declared.
  1476. So to export a function to users of the library, you must use
  1477. c           global func:function   ; declare it as a function
  1478. c func:     push ebp
  1479. c           ; etc.
  1480. And to export a data item such as an array, you would have to code
  1481. c           global array:data array.end-array ; give the size too
  1482. c array:    resd 128
  1483. c .end:
  1484. Be careful: If you export a variable to the library user, by
  1485. declaring it as c{GLOBAL} and supplying a size, the variable will
  1486. end up living in the data section of the main program, rather than
  1487. in your library's data section, where you declared it. So you will
  1488. have to access your own global variable with the c{..got} mechanism
  1489. rather than c{..gotoff}, as if it were external (which,
  1490. effectively, it has become).
  1491. Equally, if you need to store the address of an exported global in
  1492. one of your data sections, you can't do it by means of the standard
  1493. sort of code:
  1494. c dataptr:  dd global_data_item    ; WRONG
  1495. NASM will interpret this code as an ordinary relocation, in which
  1496. c{global_data_item} is merely an offset from the beginning of the
  1497. c{.data} section (or whatever); so this reference will end up
  1498. pointing at your data section instead of at the exported global
  1499. which resides elsewhere.
  1500. Instead of the above code, then, you must write
  1501. c dataptr:  dd global_data_item wrt ..sym
  1502. which makes use of the special c{WRT} type Ic{WRT ..sym}c{..sym}
  1503. to instruct NASM to search the symbol table for a particular symbol
  1504. at that address, rather than just relocating by section base.
  1505. Either method will work for functions: referring to one of your
  1506. functions by means of
  1507. c funcptr:  dd my_function
  1508. will give the user the address of the code you wrote, whereas
  1509. c funcptr:  dd my_function wrt ..sym
  1510. will give the address of the procedure linkage table for the
  1511. function, which is where the calling program will e{believe} the
  1512. function lives. Either address is a valid way to call the function.
  1513. S{picproc} Calling Procedures Outside the Library
  1514. Calling procedures outside your shared library has to be done by
  1515. means of a ie{procedure linkage table}, or i{PLT}. The PLT is
  1516. placed at a known offset from where the library is loaded, so the
  1517. library code can make calls to the PLT in a position-independent
  1518. way. Within the PLT there is code to jump to offsets contained in
  1519. the GOT, so function calls to other shared libraries or to routines
  1520. in the main program can be transparently passed off to their real
  1521. destinations.
  1522. To call an external routine, you must use another special PIC
  1523. relocation type, I{PLT relocations}ic{WRT ..plt}. This is much
  1524. easier than the GOT-based ones: you simply replace calls such as
  1525. c{CALL printf} with the PLT-relative version c{CALL printf WRT
  1526. ..plt}.
  1527. S{link} Generating the Library File
  1528. Having written some code modules and assembled them to c{.o} files,
  1529. you then generate your shared library with a command such as
  1530. c ld -shared -o library.so module1.o module2.o       # for ELF
  1531. c ld -Bshareable -o library.so module1.o module2.o   # for BSD
  1532. For ELF, if your shared library is going to reside in system
  1533. directories such as c{/usr/lib} or c{/lib}, it is usually worth
  1534. using the ic{-soname} flag to the linker, to store the final
  1535. library file name, with a version number, into the library:
  1536. c ld -shared -soname library.so.1 -o library.so.1.2 *.o
  1537. You would then copy c{library.so.1.2} into the library directory,
  1538. and create c{library.so.1} as a symbolic link to it.
  1539. C{mixsize} Mixing 16 and 32 Bit Code
  1540. This chapter tries to cover some of the issues, largely related to
  1541. unusual forms of addressing and jump instructions, encountered when
  1542. writing operating system code such as protected-mode initialisation
  1543. routines, which require code that operates in mixed segment sizes,
  1544. such as code in a 16-bit segment trying to modify data in a 32-bit
  1545. one, or jumps between different-size segments.
  1546. H{mixjump} Mixed-Size JumpsI{jumps, mixed-size}
  1547. I{operating system, writing}I{writing operating systems}The most
  1548. common form of i{mixed-size instruction} is the one used when
  1549. writing a 32-bit OS: having done your setup in 16-bit mode, such as
  1550. loading the kernel, you then have to boot it by switching into
  1551. protected mode and jumping to the 32-bit kernel start address. In a
  1552. fully 32-bit OS, this tends to be the e{only} mixed-size
  1553. instruction you need, since everything before it can be done in pure
  1554. 16-bit code, and everything after it can be pure 32-bit.
  1555. This jump must specify a 48-bit far address, since the target
  1556. segment is a 32-bit one. However, it must be assembled in a 16-bit
  1557. segment, so just coding, for example,
  1558. c           jmp 0x1234:0x56789ABC  ; wrong!
  1559. will not work, since the offset part of the address will be
  1560. truncated to c{0x9ABC} and the jump will be an ordinary 16-bit far
  1561. one.
  1562. The Linux kernel setup code gets round the inability of c{as86} to
  1563. generate the required instruction by coding it manually, using
  1564. c{DB} instructions. NASM can go one better than that, by actually
  1565. generating the right instruction itself. Here's how to do it right:
  1566. c           jmp dword 0x1234:0x56789ABC  ; right
  1567. Ic{JMP DWORD}The c{DWORD} prefix (strictly speaking, it should
  1568. come e{after} the colon, since it is declaring the e{offset} field
  1569. to be a doubleword; but NASM will accept either form, since both are
  1570. unambiguous) forces the offset part to be treated as far, in the
  1571. assumption that you are deliberately writing a jump from a 16-bit
  1572. segment to a 32-bit one.
  1573. You can do the reverse operation, jumping from a 32-bit segment to a
  1574. 16-bit one, by means of the c{WORD} prefix:
  1575. c           jmp word 0x8765:0x4321 ; 32 to 16 bit
  1576. If the c{WORD} prefix is specified in 16-bit mode, or the c{DWORD}
  1577. prefix in 32-bit mode, they will be ignored, since each is
  1578. explicitly forcing NASM into a mode it was in anyway.
  1579. H{mixaddr} Addressing Between Different-Size SegmentsI{addressing,
  1580. mixed-size}I{mixed-size addressing}
  1581. If your OS is mixed 16 and 32-bit, or if you are writing a DOS
  1582. extender, you are likely to have to deal with some 16-bit segments
  1583. and some 32-bit ones. At some point, you will probably end up
  1584. writing code in a 16-bit segment which has to access data in a
  1585. 32-bit segment, or vice versa.
  1586. If the data you are trying to access in a 32-bit segment lies within
  1587. the first 64K of the segment, you may be able to get away with using
  1588. an ordinary 16-bit addressing operation for the purpose; but sooner
  1589. or later, you will want to do 32-bit addressing from 16-bit mode.
  1590. The easiest way to do this is to make sure you use a register for
  1591. the address, since any effective address containing a 32-bit
  1592. register is forced to be a 32-bit address. So you can do
  1593. c           mov eax,offset_into_32_bit_segment_specified_by_fs
  1594. c           mov dword [fs:eax],0x11223344
  1595. This is fine, but slightly cumbersome (since it wastes an
  1596. instruction and a register) if you already know the precise offset
  1597. you are aiming at. The x86 architecture does allow 32-bit effective
  1598. addresses to specify nothing but a 4-byte offset, so why shouldn't
  1599. NASM be able to generate the best instruction for the purpose?
  1600. It can. As in k{mixjump}, you need only prefix the address with the
  1601. c{DWORD} keyword, and it will be forced to be a 32-bit address:
  1602. c           mov dword [fs:dword my_offset],0x11223344
  1603. Also as in k{mixjump}, NASM is not fussy about whether the
  1604. c{DWORD} prefix comes before or after the segment override, so
  1605. arguably a nicer-looking way to code the above instruction is
  1606. c           mov dword [dword fs:my_offset],0x11223344
  1607. Don't confuse the c{DWORD} prefix e{outside} the square brackets,
  1608. which controls the size of the data stored at the address, with the
  1609. one c{inside} the square brackets which controls the length of the
  1610. address itself. The two can quite easily be different:
  1611. c           mov word [dword 0x12345678],0x9ABC
  1612. This moves 16 bits of data to an address specified by a 32-bit
  1613. offset.
  1614. You can also specify c{WORD} or c{DWORD} prefixes along with the
  1615. c{FAR} prefix to indirect far jumps or calls. For example:
  1616. c           call dword far [fs:word 0x4321]
  1617. This instruction contains an address specified by a 16-bit offset;
  1618. it loads a 48-bit far pointer from that (16-bit segment and 32-bit
  1619. offset), and calls that address.
  1620. H{mixother} Other Mixed-Size Instructions
  1621. The other way you might want to access data might be using the
  1622. string instructions (c{LODSx}, c{STOSx} and so on) or the
  1623. c{XLATB} instruction. These instructions, since they take no
  1624. parameters, might seem to have no easy way to make them perform
  1625. 32-bit addressing when assembled in a 16-bit segment.
  1626. This is the purpose of NASM's ic{a16} and ic{a32} prefixes. If
  1627. you are coding c{LODSB} in a 16-bit segment but it is supposed to
  1628. be accessing a string in a 32-bit segment, you should load the
  1629. desired address into c{ESI} and then code
  1630. c           a32 lodsb
  1631. The prefix forces the addressing size to 32 bits, meaning that
  1632. c{LODSB} loads from c{[DS:ESI]} instead of c{[DS:SI]}. To access
  1633. a string in a 16-bit segment when coding in a 32-bit one, the
  1634. corresponding c{a16} prefix can be used.
  1635. The c{a16} and c{a32} prefixes can be applied to any instruction
  1636. in NASM's instruction table, but most of them can generate all the
  1637. useful forms without them. The prefixes are necessary only for
  1638. instructions with implicit addressing: c{CMPSx} (k{insCMPSB}),
  1639. c{SCASx} (k{insSCASB}), c{LODSx} (k{insLODSB}), c{STOSx}
  1640. (k{insSTOSB}), c{MOVSx} (k{insMOVSB}), c{INSx} (k{insINSB}),
  1641. c{OUTSx} (k{insOUTSB}), and c{XLATB} (k{insXLATB}). Also, the
  1642. various push and pop instructions (c{PUSHA} and c{POPF} as well as
  1643. the more usual c{PUSH} and c{POP}) can accept c{a16} or c{a32}
  1644. prefixes to force a particular one of c{SP} or c{ESP} to be used
  1645. as a stack pointer, in case the stack segment in use is a different
  1646. size from the code segment.
  1647. c{PUSH} and c{POP}, when applied to segment registers in 32-bit
  1648. mode, also have the slightly odd behaviour that they push and pop 4
  1649. bytes at a time, of which the top two are ignored and the bottom two
  1650. give the value of the segment register being manipulated. To force
  1651. the 16-bit behaviour of segment-register push and pop instructions,
  1652. you can use the operand-size prefix ic{o16}:
  1653. c           o16 push ss
  1654. c           o16 push ds
  1655. This code saves a doubleword of stack space by fitting two segment
  1656. registers into the space which would normally be consumed by pushing
  1657. one.
  1658. (You can also use the ic{o32} prefix to force the 32-bit behaviour
  1659. when in 16-bit mode, but this seems less useful.)
  1660. C{trouble} Troubleshooting
  1661. This chapter describes some of the common problems that users have
  1662. been known to encounter with NASM, and answers them. It also gives
  1663. instructions for reporting bugs in NASM if you find a difficulty
  1664. that isn't listed here.
  1665. H{problems} Common Problems
  1666. S{inefficient} NASM Generates i{Inefficient Code}
  1667. I get a lot of `bug' reports about NASM generating inefficient, or
  1668. even `wrong', code on instructions such as c{ADD ESP,8}. This is a
  1669. deliberate design feature, connected to predictability of output:
  1670. NASM, on seeing c{ADD ESP,8}, will generate the form of the
  1671. instruction which leaves room for a 32-bit offset. You need to code
  1672. Ic{BYTE}c{ADD ESP,BYTE 8} if you want the space-efficient
  1673. form of the instruction. This isn't a bug: at worst it's a
  1674. misfeature, and that's a matter of opinion only.
  1675. S{jmprange} My Jumps are Out of RangeI{out of range, jumps}
  1676. Similarly, people complain that when they issue i{conditional
  1677. jumps} (which are c{SHORT} by default) that try to jump too far,
  1678. NASM reports `short jump out of range' instead of making the jumps
  1679. longer.
  1680. This, again, is partly a predictability issue, but in fact has a
  1681. more practical reason as well. NASM has no means of being told what
  1682. type of processor the code it is generating will be run on; so it
  1683. cannot decide for itself that it should generate ic{Jcc NEAR} type
  1684. instructions, because it doesn't know that it's working for a 386 or
  1685. above. Alternatively, it could replace the out-of-range short
  1686. c{JNE} instruction with a very short c{JE} instruction that jumps
  1687. over a c{JMP NEAR}; this is a sensible solution for processors
  1688. below a 386, but hardly efficient on processors which have good
  1689. branch prediction e{and} could have used c{JNE NEAR} instead. So,
  1690. once again, it's up to the user, not the assembler, to decide what
  1691. instructions should be generated.
  1692. S{proborg} ic{ORG} Doesn't Work
  1693. People writing i{boot sector} programs in the c{bin} format often
  1694. complain that c{ORG} doesn't work the way they'd like: in order to
  1695. place the c{0xAA55} signature word at the end of a 512-byte boot
  1696. sector, people who are used to MASM tend to code
  1697. c           ORG 0
  1698. c           ; some boot sector code
  1699. c           ORG 510
  1700. c           DW 0xAA55
  1701. This is not the intended use of the c{ORG} directive in NASM, and
  1702. will not work. The correct way to solve this problem in NASM is to
  1703. use the ic{TIMES} directive, like this:
  1704. c           ORG 0
  1705. c           ; some boot sector code
  1706. c           TIMES 510-($-$$) DB 0
  1707. c           DW 0xAA55
  1708. The c{TIMES} directive will insert exactly enough zero bytes into
  1709. the output to move the assembly point up to 510. This method also
  1710. has the advantage that if you accidentally fill your boot sector too
  1711. full, NASM will catch the problem at assembly time and report it, so
  1712. you won't end up with a boot sector that you have to disassemble to
  1713. find out what's wrong with it.
  1714. S{probtimes} ic{TIMES} Doesn't Work
  1715. The other common problem with the above code is people who write the
  1716. c{TIMES} line as
  1717. c           TIMES 510-$ DB 0
  1718. by reasoning that c{$} should be a pure number, just like 510, so
  1719. the difference between them is also a pure number and can happily be
  1720. fed to c{TIMES}.
  1721. NASM is a e{modular} assembler: the various component parts are
  1722. designed to be easily separable for re-use, so they don't exchange
  1723. information unnecessarily. In consequence, the c{bin} output
  1724. format, even though it has been told by the c{ORG} directive that
  1725. the c{.text} section should start at 0, does not pass that
  1726. information back to the expression evaluator. So from the
  1727. evaluator's point of view, c{$} isn't a pure number: it's an offset
  1728. from a section base. Therefore the difference between c{$} and 510
  1729. is also not a pure number, but involves a section base. Values
  1730. involving section bases cannot be passed as arguments to c{TIMES}.
  1731. The solution, as in the previous section, is to code the c{TIMES}
  1732. line in the form
  1733. c           TIMES 510-($-$$) DB 0
  1734. in which c{$} and c{$$} are offsets from the same section base,
  1735. and so their difference is a pure number. This will solve the
  1736. problem and generate sensible code.
  1737. H{bugs} i{Bugs}I{reporting bugs}
  1738. We have never yet released a version of NASM with any e{known}
  1739. bugs. That doesn't usually stop there being plenty we didn't know
  1740. about, though. Any that you find should be reported to
  1741. W{mailto:hpa@zytor.com}c{hpa@zytor.com}.
  1742. Please read k{qstart} first, and don't report the bug if it's
  1743. listed in there as a deliberate feature. (If you think the feature
  1744. is badly thought out, feel free to send us reasons why you think it
  1745. should be changed, but don't just send us mail saying `This is a
  1746. bug' if the documentation says we did it on purpose.) Then read
  1747. k{problems}, and don't bother reporting the bug if it's listed
  1748. there.
  1749. If you do report a bug, e{please} give us all of the following
  1750. information:
  1751. b What operating system you're running NASM under. DOS, Linux,
  1752. NetBSD, Win16, Win32, VMS (I'd be impressed), whatever.
  1753. b If you're running NASM under DOS or Win32, tell us whether you've
  1754. compiled your own executable from the DOS source archive, or whether
  1755. you were using the standard distribution binaries out of the
  1756. archive. If you were using a locally built executable, try to
  1757. reproduce the problem using one of the standard binaries, as this
  1758. will make it easier for us to reproduce your problem prior to fixing
  1759. it.
  1760. b Which version of NASM you're using, and exactly how you invoked
  1761. it. Give us the precise command line, and the contents of the
  1762. c{NASM} environment variable if any.
  1763. b Which versions of any supplementary programs you're using, and
  1764. how you invoked them. If the problem only becomes visible at link
  1765. time, tell us what linker you're using, what version of it you've
  1766. got, and the exact linker command line. If the problem involves
  1767. linking against object files generated by a compiler, tell us what
  1768. compiler, what version, and what command line or options you used.
  1769. (If you're compiling in an IDE, please try to reproduce the problem
  1770. with the command-line version of the compiler.)
  1771. b If at all possible, send us a NASM source file which exhibits the
  1772. problem. If this causes copyright problems (e.g. you can only
  1773. reproduce the bug in restricted-distribution code) then bear in mind
  1774. the following two points: firstly, we guarantee that any source code
  1775. sent to us for the purposes of debugging NASM will be used e{only}
  1776. for the purposes of debugging NASM, and that we will delete all our
  1777. copies of it as soon as we have found and fixed the bug or bugs in
  1778. question; and secondly, we would prefer e{not} to be mailed large
  1779. chunks of code anyway. The smaller the file, the better. A
  1780. three-line sample file that does nothing useful e{except}
  1781. demonstrate the problem is much easier to work with than a
  1782. fully fledged ten-thousand-line program. (Of course, some errors
  1783. e{do} only crop up in large files, so this may not be possible.)
  1784. b A description of what the problem actually e{is}. `It doesn't
  1785. work' is e{not} a helpful description! Please describe exactly what
  1786. is happening that shouldn't be, or what isn't happening that should.
  1787. Examples might be: `NASM generates an error message saying Line 3
  1788. for an error that's actually on Line 5'; `NASM generates an error
  1789. message that I believe it shouldn't be generating at all'; `NASM
  1790. fails to generate an error message that I believe it e{should} be
  1791. generating'; `the object file produced from this source code crashes
  1792. my linker'; `the ninth byte of the output file is 66 and I think it
  1793. should be 77 instead'.
  1794. b If you believe the output file from NASM to be faulty, send it to
  1795. us. That allows us to determine whether our own copy of NASM
  1796. generates the same file, or whether the problem is related to
  1797. portability issues between our development platforms and yours. We
  1798. can handle binary files mailed to us as MIME attachments, uuencoded,
  1799. and even BinHex. Alternatively, we may be able to provide an FTP
  1800. site you can upload the suspect files to; but mailing them is easier
  1801. for us.
  1802. b Any other information or data files that might be helpful. If,
  1803. for example, the problem involves NASM failing to generate an object
  1804. file while TASM can generate an equivalent file without trouble,
  1805. then send us e{both} object files, so we can see what TASM is doing
  1806. differently from us.
  1807. A{iref} Intel x86 Instruction Reference
  1808. This appendix provides a complete list of the machine instructions
  1809. which NASM will assemble, and a short description of the function of
  1810. each one.
  1811. It is not intended to be exhaustive documentation on the fine
  1812. details of the instructions' function, such as which exceptions they
  1813. can trigger: for such documentation, you should go to Intel's Web
  1814. site, W{http://www.intel.com/}c{http://www.intel.com/}.
  1815. Instead, this appendix is intended primarily to provide
  1816. documentation on the way the instructions may be used within NASM.
  1817. For example, looking up c{LOOP} will tell you that NASM allows
  1818. c{CX} or c{ECX} to be specified as an optional second argument to
  1819. the c{LOOP} instruction, to enforce which of the two possible
  1820. counter registers should be used if the default is not the one
  1821. desired.
  1822. The instructions are not quite listed in alphabetical order, since
  1823. groups of instructions with similar functions are lumped together in
  1824. the same entry. Most of them don't move very far from their
  1825. alphabetic position because of this.
  1826. H{iref-opr} Key to Operand Specifications
  1827. The instruction descriptions in this appendix specify their operands
  1828. using the following notation:
  1829. b Registers: c{reg8} denotes an 8-bit i{general purpose
  1830. register}, c{reg16} denotes a 16-bit general purpose register, and
  1831. c{reg32} a 32-bit one. c{fpureg} denotes one of the eight FPU
  1832. stack registers, c{mmxreg} denotes one of the eight 64-bit MMX
  1833. registers, and c{segreg} denotes a segment register. In addition,
  1834. some registers (such as c{AL}, c{DX} or
  1835. c{ECX}) may be specified explicitly.
  1836. b Immediate operands: c{imm} denotes a generic i{immediate operand}.
  1837. c{imm8}, c{imm16} and c{imm32} are used when the operand is
  1838. intended to be a specific size. For some of these instructions, NASM
  1839. needs an explicit specifier: for example, c{ADD ESP,16} could be
  1840. interpreted as either c{ADD r/m32,imm32} or c{ADD r/m32,imm8}.
  1841. NASM chooses the former by default, and so you must specify c{ADD
  1842. ESP,BYTE 16} for the latter.
  1843. b Memory references: c{mem} denotes a generic i{memory reference};
  1844. c{mem8}, c{mem16}, c{mem32}, c{mem64} and c{mem80} are used
  1845. when the operand needs to be a specific size. Again, a specifier is
  1846. needed in some cases: c{DEC [address]} is ambiguous and will be
  1847. rejected by NASM. You must specify c{DEC BYTE [address]}, c{DEC
  1848. WORD [address]} or c{DEC DWORD [address]} instead.
  1849. b i{Restricted memory references}: one form of the c{MOV}
  1850. instruction allows a memory address to be specified e{without}
  1851. allowing the normal range of register combinations and effective
  1852. address processing. This is denoted by c{memoffs8}, c{memoffs16}
  1853. and c{memoffs32}.
  1854. b Register or memory choices: many instructions can accept either a
  1855. register e{or} a memory reference as an operand. c{r/m8} is a
  1856. shorthand for c{reg8/mem8}; similarly c{r/m16} and c{r/m32}.
  1857. c{r/m64} is MMX-related, and is a shorthand for c{mmxreg/mem64}.
  1858. H{iref-opc} Key to Opcode Descriptions
  1859. This appendix also provides the opcodes which NASM will generate for
  1860. each form of each instruction. The opcodes are listed in the
  1861. following way:
  1862. b A hex number, such as c{3F}, indicates a fixed byte containing
  1863. that number.
  1864. b A hex number followed by c{+r}, such as c{C8+r}, indicates that
  1865. one of the operands to the instruction is a register, and the
  1866. `register value' of that register should be added to the hex number
  1867. to produce the generated byte. For example, EDX has register value
  1868. 2, so the code c{C8+r}, when the register operand is EDX, generates
  1869. the hex byte c{CA}. Register values for specific registers are
  1870. given in k{iref-rv}.
  1871. b A hex number followed by c{+cc}, such as c{40+cc}, indicates
  1872. that the instruction name has a condition code suffix, and the
  1873. numeric representation of the condition code should be added to the
  1874. hex number to produce the generated byte. For example, the code
  1875. c{40+cc}, when the instruction contains the c{NE} condition,
  1876. generates the hex byte c{45}. Condition codes and their numeric
  1877. representations are given in k{iref-cc}.
  1878. b A slash followed by a digit, such as c{/2}, indicates that one
  1879. of the operands to the instruction is a memory address or register
  1880. (denoted c{mem} or c{r/m}, with an optional size). This is to be
  1881. encoded as an effective address, with a i{ModR/M byte}, an optional
  1882. i{SIB byte}, and an optional displacement, and the spare (register)
  1883. field of the ModR/M byte should be the digit given (which will be
  1884. from 0 to 7, so it fits in three bits). The encoding of effective
  1885. addresses is given in k{iref-ea}.
  1886. b The code c{/r} combines the above two: it indicates that one of
  1887. the operands is a memory address or c{r/m}, and another is a
  1888. register, and that an effective address should be generated with the
  1889. spare (register) field in the ModR/M byte being equal to the
  1890. `register value' of the register operand. The encoding of effective
  1891. addresses is given in k{iref-ea}; register values are given in
  1892. k{iref-rv}.
  1893. b The codes c{ib}, c{iw} and c{id} indicate that one of the
  1894. operands to the instruction is an immediate value, and that this is
  1895. to be encoded as a byte, little-endian word or little-endian
  1896. doubleword respectively.
  1897. b The codes c{rb}, c{rw} and c{rd} indicate that one of the
  1898. operands to the instruction is an immediate value, and that the
  1899. e{difference} between this value and the address of the end of the
  1900. instruction is to be encoded as a byte, word or doubleword
  1901. respectively. Where the form c{rw/rd} appears, it indicates that
  1902. either c{rw} or c{rd} should be used according to whether assembly
  1903. is being performed in c{BITS 16} or c{BITS 32} state respectively.
  1904. b The codes c{ow} and c{od} indicate that one of the operands to
  1905. the instruction is a reference to the contents of a memory address
  1906. specified as an immediate value: this encoding is used in some forms
  1907. of the c{MOV} instruction in place of the standard
  1908. effective-address mechanism. The displacement is encoded as a word
  1909. or doubleword. Again, c{ow/od} denotes that c{ow} or c{od} should
  1910. be chosen according to the c{BITS} setting.
  1911. b The codes c{o16} and c{o32} indicate that the given form of the
  1912. instruction should be assembled with operand size 16 or 32 bits. In
  1913. other words, c{o16} indicates a c{66} prefix in c{BITS 32} state,
  1914. but generates no code in c{BITS 16} state; and c{o32} indicates a
  1915. c{66} prefix in c{BITS 16} state but generates nothing in c{BITS
  1916. 32}.
  1917. b The codes c{a16} and c{a32}, similarly to c{o16} and c{o32},
  1918. indicate the address size of the given form of the instruction.
  1919. Where this does not match the c{BITS} setting, a c{67} prefix is
  1920. required.
  1921. S{iref-rv} Register Values
  1922. Where an instruction requires a register value, it is already
  1923. implicit in the encoding of the rest of the instruction what type of
  1924. register is intended: an 8-bit general-purpose register, a segment
  1925. register, a debug register, an MMX register, or whatever. Therefore
  1926. there is no problem with registers of different types sharing an
  1927. encoding value.
  1928. The encodings for the various classes of register are:
  1929. b 8-bit general registers: c{AL} is 0, c{CL} is 1, c{DL} is 2,
  1930. c{BL} is 3, c{AH} is 4, c{CH} is 5, c{DH} is 6, and c{BH} is
  1931. 7.
  1932. b 16-bit general registers: c{AX} is 0, c{CX} is 1, c{DX} is 2,
  1933. c{BX} is 3, c{SP} is 4, c{BP} is 5, c{SI} is 6, and c{DI} is 7.
  1934. b 32-bit general registers: c{EAX} is 0, c{ECX} is 1, c{EDX} is
  1935. 2, c{EBX} is 3, c{ESP} is 4, c{EBP} is 5, c{ESI} is 6, and
  1936. c{EDI} is 7.
  1937. b i{Segment registers}: c{ES} is 0, c{CS} is 1, c{SS} is 2, c{DS}
  1938. is 3, c{FS} is 4, and c{GS} is 5.
  1939. b I{floating-point, registers}{Floating-point registers}: c{ST0}
  1940. is 0, c{ST1} is 1, c{ST2} is 2, c{ST3} is 3, c{ST4} is 4,
  1941. c{ST5} is 5, c{ST6} is 6, and c{ST7} is 7.
  1942. b 64-bit i{MMX registers}: c{MM0} is 0, c{MM1} is 1, c{MM2} is 2,
  1943. c{MM3} is 3, c{MM4} is 4, c{MM5} is 5, c{MM6} is 6, and c{MM7}
  1944. is 7.
  1945. b i{Control registers}: c{CR0} is 0, c{CR2} is 2, c{CR3} is 3,
  1946. and c{CR4} is 4.
  1947. b i{Debug registers}: c{DR0} is 0, c{DR1} is 1, c{DR2} is 2,
  1948. c{DR3} is 3, c{DR6} is 6, and c{DR7} is 7.
  1949. b i{Test registers}: c{TR3} is 3, c{TR4} is 4, c{TR5} is 5,
  1950. c{TR6} is 6, and c{TR7} is 7.
  1951. (Note that wherever a register name contains a number, that number
  1952. is also the register value for that register.)
  1953. S{iref-cc} i{Condition Codes}
  1954. The available condition codes are given here, along with their
  1955. numeric representations as part of opcodes. Many of these condition
  1956. codes have synonyms, so several will be listed at a time.
  1957. In the following descriptions, the word `either', when applied to two
  1958. possible trigger conditions, is used to mean `either or both'. If
  1959. `either but not both' is meant, the phrase `exactly one of' is used.
  1960. b c{O} is 0 (trigger if the overflow flag is set); c{NO} is 1.
  1961. b c{B}, c{C} and c{NAE} are 2 (trigger if the carry flag is
  1962. set); c{AE}, c{NB} and c{NC} are 3.
  1963. b c{E} and c{Z} are 4 (trigger if the zero flag is set); c{NE}
  1964. and c{NZ} are 5.
  1965. b c{BE} and c{NA} are 6 (trigger if either of the carry or zero
  1966. flags is set); c{A} and c{NBE} are 7.
  1967. b c{S} is 8 (trigger if the sign flag is set); c{NS} is 9.
  1968. b c{P} and c{PE} are 10 (trigger if the parity flag is set);
  1969. c{NP} and c{PO} are 11.
  1970. b c{L} and c{NGE} are 12 (trigger if exactly one of the sign and
  1971. overflow flags is set); c{GE} and c{NL} are 13.
  1972. b c{LE} and c{NG} are 14 (trigger if either the zero flag is set,
  1973. or exactly one of the sign and overflow flags is set); c{G} and
  1974. c{NLE} are 15.
  1975. Note that in all cases, the sense of a condition code may be
  1976. reversed by changing the low bit of the numeric representation.
  1977. S{iref-ea} Effective Address Encoding: i{ModR/M} and i{SIB}
  1978. An i{effective address} is encoded in up to three parts: a ModR/M
  1979. byte, an optional SIB byte, and an optional byte, word or doubleword
  1980. displacement field.
  1981. The ModR/M byte consists of three fields: the c{mod} field, ranging
  1982. from 0 to 3, in the upper two bits of the byte, the c{r/m} field,
  1983. ranging from 0 to 7, in the lower three bits, and the spare
  1984. (register) field in the middle (bit 3 to bit 5). The spare field is
  1985. not relevant to the effective address being encoded, and either
  1986. contains an extension to the instruction opcode or the register
  1987. value of another operand.
  1988. The ModR/M system can be used to encode a direct register reference
  1989. rather than a memory access. This is always done by setting the
  1990. c{mod} field to 3 and the c{r/m} field to the register value of
  1991. the register in question (it must be a general-purpose register, and
  1992. the size of the register must already be implicit in the encoding of
  1993. the rest of the instruction). In this case, the SIB byte and
  1994. displacement field are both absent.
  1995. In 16-bit addressing mode (either c{BITS 16} with no c{67} prefix,
  1996. or c{BITS 32} with a c{67} prefix), the SIB byte is never used.
  1997. The general rules for c{mod} and c{r/m} (there is an exception,
  1998. given below) are:
  1999. b The c{mod} field gives the length of the displacement field: 0
  2000. means no displacement, 1 means one byte, and 2 means two bytes.
  2001. b The c{r/m} field encodes the combination of registers to be
  2002. added to the displacement to give the accessed address: 0 means
  2003. c{BX+SI}, 1 means c{BX+DI}, 2 means c{BP+SI}, 3 means c{BP+DI},
  2004. 4 means c{SI} only, 5 means c{DI} only, 6 means c{BP} only, and 7
  2005. means c{BX} only.
  2006. However, there is a special case:
  2007. b If c{mod} is 0 and c{r/m} is 6, the effective address encoded
  2008. is not c{[BP]} as the above rules would suggest, but instead
  2009. c{[disp16]}: the displacement field is present and is two bytes
  2010. long, and no registers are added to the displacement.
  2011. Therefore the effective address c{[BP]} cannot be encoded as
  2012. efficiently as c{[BX]}; so if you code c{[BP]} in a program, NASM
  2013. adds a notional 8-bit zero displacement, and sets c{mod} to 1,
  2014. c{r/m} to 6, and the one-byte displacement field to 0.
  2015. In 32-bit addressing mode (either c{BITS 16} with a c{67} prefix,
  2016. or c{BITS 32} with no c{67} prefix) the general rules (again,
  2017. there are exceptions) for c{mod} and c{r/m} are:
  2018. b The c{mod} field gives the length of the displacement field: 0
  2019. means no displacement, 1 means one byte, and 2 means four bytes.
  2020. b If only one register is to be added to the displacement, and it
  2021. is not c{ESP}, the c{r/m} field gives its register value, and the
  2022. SIB byte is absent. If the c{r/m} field is 4 (which would encode
  2023. c{ESP}), the SIB byte is present and gives the combination and
  2024. scaling of registers to be added to the displacement.
  2025. If the SIB byte is present, it describes the combination of
  2026. registers (an optional base register, and an optional index register
  2027. scaled by multiplication by 1, 2, 4 or 8) to be added to the
  2028. displacement. The SIB byte is divided into the c{scale} field, in
  2029. the top two bits, the c{index} field in the next three, and the
  2030. c{base} field in the bottom three. The general rules are:
  2031. b The c{base} field encodes the register value of the base
  2032. register.
  2033. b The c{index} field encodes the register value of the index
  2034. register, unless it is 4, in which case no index register is used
  2035. (so c{ESP} cannot be used as an index register).
  2036. b The c{scale} field encodes the multiplier by which the index
  2037. register is scaled before adding it to the base and displacement: 0
  2038. encodes a multiplier of 1, 1 encodes 2, 2 encodes 4 and 3 encodes 8.
  2039. The exceptions to the 32-bit encoding rules are:
  2040. b If c{mod} is 0 and c{r/m} is 5, the effective address encoded
  2041. is not c{[EBP]} as the above rules would suggest, but instead
  2042. c{[disp32]}: the displacement field is present and is four bytes
  2043. long, and no registers are added to the displacement.
  2044. b If c{mod} is 0, c{r/m} is 4 (meaning the SIB byte is present)
  2045. and c{base} is 4, the effective address encoded is not
  2046. c{[EBP+index]} as the above rules would suggest, but instead
  2047. c{[disp32+index]}: the displacement field is present and is four
  2048. bytes long, and there is no base register (but the index register is
  2049. still processed in the normal way).
  2050. H{iref-flg} Key to Instruction Flags
  2051. Given along with each instruction in this appendix is a set of
  2052. flags, denoting the type of the instruction. The types are as follows:
  2053. b c{8086}, c{186}, c{286}, c{386}, c{486}, c{PENT} and c{P6}
  2054. denote the lowest processor type that supports the instruction. Most
  2055. instructions run on all processors above the given type; those that
  2056. do not are documented. The Pentium II contains no additional
  2057. instructions beyond the P6 (Pentium Pro); from the point of view of
  2058. its instruction set, it can be thought of as a P6 with MMX
  2059. capability.
  2060. b c{CYRIX} indicates that the instruction is specific to Cyrix
  2061. processors, for example the extra MMX instructions in the Cyrix
  2062. extended MMX instruction set.
  2063. b c{FPU} indicates that the instruction is a floating-point one,
  2064. and will only run on machines with a coprocessor (automatically
  2065. including 486DX, Pentium and above).
  2066. b c{MMX} indicates that the instruction is an MMX one, and will
  2067. run on MMX-capable Pentium processors and the Pentium II.
  2068. b c{PRIV} indicates that the instruction is a protected-mode
  2069. management instruction. Many of these may only be used in protected
  2070. mode, or only at privilege level zero.
  2071. b c{UNDOC} indicates that the instruction is an undocumented one,
  2072. and not part of the official Intel Architecture; it may or may not
  2073. be supported on any given machine.
  2074. H{insAAA} ic{AAA}, ic{AAS}, ic{AAM}, ic{AAD}: ASCII
  2075. Adjustments
  2076. c AAA                           ; 37                   [8086]
  2077. c AAS                           ; 3F                   [8086]
  2078. c AAD                           ; D5 0A                [8086]
  2079. c AAD imm                       ; D5 ib                [8086]
  2080. c AAM                           ; D4 0A                [8086]
  2081. c AAM imm                       ; D4 ib                [8086]
  2082. These instructions are used in conjunction with the add, subtract,
  2083. multiply and divide instructions to perform binary-coded decimal
  2084. arithmetic in e{unpacked} (one BCD digit per byte - easy to
  2085. translate to and from ASCII, hence the instruction names) form.
  2086. There are also packed BCD instructions c{DAA} and c{DAS}: see
  2087. k{insDAA}.
  2088. c{AAA} should be used after a one-byte c{ADD} instruction whose
  2089. destination was the c{AL} register: by means of examining the value
  2090. in the low nibble of c{AL} and also the auxiliary carry flag
  2091. c{AF}, it determines whether the addition has overflowed, and
  2092. adjusts it (and sets the carry flag) if so. You can add long BCD
  2093. strings together by doing c{ADD}/c{AAA} on the low digits, then
  2094. doing c{ADC}/c{AAA} on each subsequent digit.
  2095. c{AAS} works similarly to c{AAA}, but is for use after c{SUB}
  2096. instructions rather than c{ADD}.
  2097. c{AAM} is for use after you have multiplied two decimal digits
  2098. together and left the result in c{AL}: it divides c{AL} by ten and
  2099. stores the quotient in c{AH}, leaving the remainder in c{AL}. The
  2100. divisor 10 can be changed by specifying an operand to the
  2101. instruction: a particularly handy use of this is c{AAM 16}, causing
  2102. the two nibbles in c{AL} to be separated into c{AH} and c{AL}.
  2103. c{AAD} performs the inverse operation to c{AAM}: it multiplies
  2104. c{AH} by ten, adds it to c{AL}, and sets c{AH} to zero. Again,
  2105. the multiplier 10 can be changed.
  2106. H{insADC} ic{ADC}: Add with Carry
  2107. c ADC r/m8,reg8                 ; 10 /r                [8086]
  2108. c ADC r/m16,reg16               ; o16 11 /r            [8086]
  2109. c ADC r/m32,reg32               ; o32 11 /r            [386]
  2110. c ADC reg8,r/m8                 ; 12 /r                [8086]
  2111. c ADC reg16,r/m16               ; o16 13 /r            [8086]
  2112. c ADC reg32,r/m32               ; o32 13 /r            [386]
  2113. c ADC r/m8,imm8                 ; 80 /2 ib             [8086]
  2114. c ADC r/m16,imm16               ; o16 81 /2 iw         [8086]
  2115. c ADC r/m32,imm32               ; o32 81 /2 id         [386]
  2116. c ADC r/m16,imm8                ; o16 83 /2 ib         [8086]
  2117. c ADC r/m32,imm8                ; o32 83 /2 ib         [386]
  2118. c ADC AL,imm8                   ; 14 ib                [8086]
  2119. c ADC AX,imm16                  ; o16 15 iw            [8086]
  2120. c ADC EAX,imm32                 ; o32 15 id            [386]
  2121. c{ADC} performs integer addition: it adds its two operands
  2122. together, plus the value of the carry flag, and leaves the result in
  2123. its destination (first) operand. The flags are set according to the
  2124. result of the operation: in particular, the carry flag is affected
  2125. and can be used by a subsequent c{ADC} instruction.
  2126. In the forms with an 8-bit immediate second operand and a longer
  2127. first operand, the second operand is considered to be signed, and is
  2128. sign-extended to the length of the first operand. In these cases,
  2129. the c{BYTE} qualifier is necessary to force NASM to generate this
  2130. form of the instruction.
  2131. To add two numbers without also adding the contents of the carry
  2132. flag, use c{ADD} (k{insADD}).
  2133. H{insADD} ic{ADD}: Add Integers
  2134. c ADD r/m8,reg8                 ; 00 /r                [8086]
  2135. c ADD r/m16,reg16               ; o16 01 /r            [8086]
  2136. c ADD r/m32,reg32               ; o32 01 /r            [386]
  2137. c ADD reg8,r/m8                 ; 02 /r                [8086]
  2138. c ADD reg16,r/m16               ; o16 03 /r            [8086]
  2139. c ADD reg32,r/m32               ; o32 03 /r            [386]
  2140. c ADD r/m8,imm8                 ; 80 /0 ib             [8086]
  2141. c ADD r/m16,imm16               ; o16 81 /0 iw         [8086]
  2142. c ADD r/m32,imm32               ; o32 81 /0 id         [386]
  2143. c ADD r/m16,imm8                ; o16 83 /0 ib         [8086]
  2144. c ADD r/m32,imm8                ; o32 83 /0 ib         [386]
  2145. c ADD AL,imm8                   ; 04 ib                [8086]
  2146. c ADD AX,imm16                  ; o16 05 iw            [8086]
  2147. c ADD EAX,imm32                 ; o32 05 id            [386]
  2148. c{ADD} performs integer addition: it adds its two operands
  2149. together, and leaves the result in its destination (first) operand.
  2150. The flags are set according to the result of the operation: in
  2151. particular, the carry flag is affected and can be used by a
  2152. subsequent c{ADC} instruction (k{insADC}).
  2153. In the forms with an 8-bit immediate second operand and a longer
  2154. first operand, the second operand is considered to be signed, and is
  2155. sign-extended to the length of the first operand. In these cases,
  2156. the c{BYTE} qualifier is necessary to force NASM to generate this
  2157. form of the instruction.
  2158. H{insAND} ic{AND}: Bitwise AND
  2159. c AND r/m8,reg8                 ; 20 /r                [8086]
  2160. c AND r/m16,reg16               ; o16 21 /r            [8086]
  2161. c AND r/m32,reg32               ; o32 21 /r            [386]
  2162. c AND reg8,r/m8                 ; 22 /r                [8086]
  2163. c AND reg16,r/m16               ; o16 23 /r            [8086]
  2164. c AND reg32,r/m32               ; o32 23 /r            [386]
  2165. c AND r/m8,imm8                 ; 80 /4 ib             [8086]
  2166. c AND r/m16,imm16               ; o16 81 /4 iw         [8086]
  2167. c AND r/m32,imm32               ; o32 81 /4 id         [386]
  2168. c AND r/m16,imm8                ; o16 83 /4 ib         [8086]
  2169. c AND r/m32,imm8                ; o32 83 /4 ib         [386]
  2170. c AND AL,imm8                   ; 24 ib                [8086]
  2171. c AND AX,imm16                  ; o16 25 iw            [8086]
  2172. c AND EAX,imm32                 ; o32 25 id            [386]
  2173. c{AND} performs a bitwise AND operation between its two operands
  2174. (i.e. each bit of the result is 1 if and only if the corresponding
  2175. bits of the two inputs were both 1), and stores the result in the
  2176. destination (first) operand.
  2177. In the forms with an 8-bit immediate second operand and a longer
  2178. first operand, the second operand is considered to be signed, and is
  2179. sign-extended to the length of the first operand. In these cases,
  2180. the c{BYTE} qualifier is necessary to force NASM to generate this
  2181. form of the instruction.
  2182. The MMX instruction c{PAND} (see k{insPAND}) performs the same
  2183. operation on the 64-bit MMX registers.
  2184. H{insARPL} ic{ARPL}: Adjust RPL Field of Selector
  2185. c ARPL r/m16,reg16              ; 63 /r                [286,PRIV]
  2186. c{ARPL} expects its two word operands to be segment selectors. It
  2187. adjusts the RPL (requested privilege level - stored in the bottom
  2188. two bits of the selector) field of the destination (first) operand
  2189. to ensure that it is no less (i.e. no more privileged than) the RPL
  2190. field of the source operand. The zero flag is set if and only if a
  2191. change had to be made.
  2192. H{insBOUND} ic{BOUND}: Check Array Index against Bounds
  2193. c BOUND reg16,mem               ; o16 62 /r            [186]
  2194. c BOUND reg32,mem               ; o32 62 /r            [386]
  2195. c{BOUND} expects its second operand to point to an area of memory
  2196. containing two signed values of the same size as its first operand
  2197. (i.e. two words for the 16-bit form; two doublewords for the 32-bit
  2198. form). It performs two signed comparisons: if the value in the
  2199. register passed as its first operand is less than the first of the
  2200. in-memory values, or is greater than or equal to the second, it
  2201. throws a BR exception. Otherwise, it does nothing.
  2202. H{insBSF} ic{BSF}, ic{BSR}: Bit Scan
  2203. c BSF reg16,r/m16               ; o16 0F BC /r         [386]
  2204. c BSF reg32,r/m32               ; o32 0F BC /r         [386]
  2205. c BSR reg16,r/m16               ; o16 0F BD /r         [386]
  2206. c BSR reg32,r/m32               ; o32 0F BD /r         [386]
  2207. c{BSF} searches for a set bit in its source (second) operand,
  2208. starting from the bottom, and if it finds one, stores the index in
  2209. its destination (first) operand. If no set bit is found, the
  2210. contents of the destination operand are undefined.
  2211. c{BSR} performs the same function, but searches from the top
  2212. instead, so it finds the most significant set bit.
  2213. Bit indices are from 0 (least significant) to 15 or 31 (most
  2214. significant).
  2215. H{insBSWAP} ic{BSWAP}: Byte Swap
  2216. c BSWAP reg32                   ; o32 0F C8+r          [486]
  2217. c{BSWAP} swaps the order of the four bytes of a 32-bit register:
  2218. bits 0-7 exchange places with bits 24-31, and bits 8-15 swap with
  2219. bits 16-23. There is no explicit 16-bit equivalent: to byte-swap
  2220. c{AX}, c{BX}, c{CX} or c{DX}, c{XCHG} can be used.
  2221. H{insBT} ic{BT}, ic{BTC}, ic{BTR}, ic{BTS}: Bit Test
  2222. c BT r/m16,reg16                ; o16 0F A3 /r         [386]
  2223. c BT r/m32,reg32                ; o32 0F A3 /r         [386]
  2224. c BT r/m16,imm8                 ; o16 0F BA /4 ib      [386]
  2225. c BT r/m32,imm8                 ; o32 0F BA /4 ib      [386]
  2226. c BTC r/m16,reg16               ; o16 0F BB /r         [386]
  2227. c BTC r/m32,reg32               ; o32 0F BB /r         [386]
  2228. c BTC r/m16,imm8                ; o16 0F BA /7 ib      [386]
  2229. c BTC r/m32,imm8                ; o32 0F BA /7 ib      [386]
  2230. c BTR r/m16,reg16               ; o16 0F B3 /r         [386]
  2231. c BTR r/m32,reg32               ; o32 0F B3 /r         [386]
  2232. c BTR r/m16,imm8                ; o16 0F BA /6 ib      [386]
  2233. c BTR r/m32,imm8                ; o32 0F BA /6 ib      [386]
  2234. c BTS r/m16,reg16               ; o16 0F AB /r         [386]
  2235. c BTS r/m32,reg32               ; o32 0F AB /r         [386]
  2236. c BTS r/m16,imm                 ; o16 0F BA /5 ib      [386]
  2237. c BTS r/m32,imm                 ; o32 0F BA /5 ib      [386]
  2238. These instructions all test one bit of their first operand, whose
  2239. index is given by the second operand, and store the value of that
  2240. bit into the carry flag. Bit indices are from 0 (least significant)
  2241. to 15 or 31 (most significant).
  2242. In addition to storing the original value of the bit into the carry
  2243. flag, c{BTR} also resets (clears) the bit in the operand itself.
  2244. c{BTS} sets the bit, and c{BTC} complements the bit. c{BT} does
  2245. not modify its operands.
  2246. The bit offset should be no greater than the size of the operand.
  2247. H{insCALL} ic{CALL}: Call Subroutine
  2248. c CALL imm                      ; E8 rw/rd             [8086]
  2249. c CALL imm:imm16                ; o16 9A iw iw         [8086]
  2250. c CALL imm:imm32                ; o32 9A id iw         [386]
  2251. c CALL FAR mem16                ; o16 FF /3            [8086]
  2252. c CALL FAR mem32                ; o32 FF /3            [386]
  2253. c CALL r/m16                    ; o16 FF /2            [8086]
  2254. c CALL r/m32                    ; o32 FF /2            [386]
  2255. c{CALL} calls a subroutine, by means of pushing the current
  2256. instruction pointer (c{IP}) and optionally c{CS} as well on the
  2257. stack, and then jumping to a given address.