Copyright (C) 2000-2012 |
GNU Info (nasm.info)Section 7.1.17.1.1. Using the `obj' Format To Generate `.EXE' Files ------------------------------------------------------ This section describes the usual method of generating `.EXE' files by linking `.OBJ' files together. Most 16-bit programming language packages come with a suitable linker; if you have none of these, there is a free linker called VAL, available in `LZH' archive format from `x2ftp.oulu.fi'. An LZH archiver can be found at `ftp.simtel.net'. There is another `free' linker (though this one doesn't come with sources) called FREELINK, available from `www.pcorner.com'. A third, `djlink', written by DJ Delorie, is available at `www.delorie.com'. A fourth linker, `ALINK', written by Anthony A.J. Williams, is available at `alink.sourceforge.net'. When linking several `.OBJ' files into a `.EXE' file, you should ensure that exactly one of them has a start point defined (using the `..start' special symbol defined by the `obj' format: see *Note Section 6.2.6::). If no module defines a start point, the linker will not know what value to give the entry-point field in the output file header; if more than one defines a start point, the linker will not know _which_ value to use. An example of a NASM source file which can be assembled to a `.OBJ' file and linked on its own to a `.EXE' is given here. It demonstrates the basic principles of defining a stack, initialising the segment registers, and declaring a start point. This file is also provided in the `test' subdirectory of the NASM archives, under the name `objexe.asm'. segment code ..start: mov ax,data mov ds,ax mov ax,stack mov ss,ax mov sp,stacktop This initial piece of code sets up `DS' to point to the data segment, and initialises `SS' and `SP' to point to the top of the provided stack. Notice that interrupts are implicitly disabled for one instruction after a move into `SS', precisely for this situation, so that there's no chance of an interrupt occurring between the loads of `SS' and `SP' and not having a stack to execute on. Note also that the special symbol `..start' is defined at the beginning of this code, which means that will be the entry point into the resulting executable file. mov dx,hello mov ah,9 int 0x21 The above is the main program: load `DS:DX' with a pointer to the greeting message (`hello' is implicitly relative to the segment `data', which was loaded into `DS' in the setup code, so the full pointer is valid), and call the DOS print-string function. mov ax,0x4c00 int 0x21 This terminates the program using another DOS system call. segment data hello: db 'hello, world', 13, 10, '$' The data segment contains the string we want to display. segment stack stack resb 64 stacktop: The above code declares a stack segment containing 64 bytes of uninitialised stack space, and points `stacktop' at the top of it. The directive `segment stack stack' defines a segment _called_ `stack', and also of _type_ `STACK'. The latter is not necessary to the correct running of the program, but linkers are likely to issue warnings or errors if your program has no segment of type `STACK'. The above file, when assembled into a `.OBJ' file, will link on its own to a valid `.EXE' file, which when run will print `hello, world' and then exit. automatically generated by info2www version 1.2.2.9 |