Differences between version 3 and previous revision of HowToAssemblyHOWTO.
Other diffs: Previous Major Revision, Previous Author, or view the Annotated Edit History
Newer page: | version 3 | Last edited on Thursday, October 21, 2004 5:13:31 pm | by AristotlePagaltzis | Revert |
Older page: | version 2 | Last edited on Friday, June 7, 2002 1:06:14 am | by perry | Revert |
@@ -1,3484 +1 @@
-Linux Assembly HOWTO
-!!!Linux Assembly HOWTO
-!Konstantin Boldyshev Linux Assembly
-
-
- konst@linuxassembly.org
-
-
-
-!Francois-Rene Rideau Tunes project
-
-
- fare@tunes.org
-
-
-
-
-Copyright (c) 1999-2002 by Konstantin Boldyshev
-
-
-
-Copyright (c) 1996-1999 by Francois-Rene Rideau
-
-
-
-$Date: 2002/01/12 10:11:15 $
-
-
-
-
-
-
-
-This is the Linux Assembly HOWTO, version .6e.
-This document describes how to program in assembly language
-using ''free'' programming tools,
-focusing on development for or from the Linux Operating System,
-mostly on IA-32 (i386) platform.
-Included material may or may not be applicable
-to other hardware and/or software platforms.
-
-
-
-
-
-
-
-
-
-
-
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version 1.1;
-with no Invariant Sections, with no Front-Cover Texts, and no Back-Cover texts.
-
-
-
-
-
-----; __Table of Contents__; 1. Introduction: ; 1.1. Legal Blurb; 1.2. Foreword; 1.3. Contributions; 2. Do you need assembly?: ; 2.1. Pros and Cons; 2.2. How to NOT use Assembly; 2.3. Linux and assembly; 3. Assemblers: ; 3.1. GCC Inline Assembly; 3.2. GAS; 3.3. NASM; 3.4. AS86; 3.5. Other Assemblers; 4. Metaprogramming: ; 4.1. External filters; 4.2. Metaprogramming; 5. Calling conventions: ; 5.1. Linux; 5.2. DOS and Windows; 5.3. Your own OS; 6. Quick start: ; 6.1. Introduction; 6.2. Hello, world!; 6.3. Building an executable; 7. Resources: ; 7.1. Pointers; 7.2. Mailing list; 8. Frequently Asked Questions; A. History; B. Acknowledgements; C. Endorsements; D. GNU Free Documentation License----
-!!!Chapter 1. Introduction
-
-
-
-
-
-
-You can skip this chapter if you are familiar with HOWTOs,
-or just hate to read all this assembly-unrelated crap.
-
-----__1.1. Legal Blurb__
-
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU
-Free Documentation License Version 1.1;
-with no Invariant Sections, with no Front-Cover Texts, and no Back-Cover texts.
-A copy of the license is included in the GNU Free Documentation License appendix.
-
-
-
-The most recent official version of this document is available from the
-Linux Assembly and
-LDP sites.
-If you are reading a few-months-old copy,
-consider checking the above URLs for a new version.
-
-----__1.2. Foreword__
-
-This document aims answering questions of those
-who program or want to program 32-bit x86 assembly using
-''free software'',
-particularly under the Linux operating system.
-At many places Universal Resource Locators (URL) are given
-for some software or documentation repository.
-This document also points to other documents about
-non-free, non-x86, or non-32-bit assemblers,
-although this is not its primary goal.
-Also note that there are FAQs and docs about programming
-on your favorite platform (whatever it is), which you should consult
-for platform-specific issues, not related directly to assembly programming.
-
-
-
-Because the main interest of assembly programming is to build
-the guts of operating systems, interpreters, compilers, and games,
-where C compiler fails to provide the needed expressiveness
-(performance is more and more seldom as issue),
-we are focusing on development of such kind of software.
-
-
-
-If you don't know what
-''free software'' is,
-please do read ''carefully''
-the GNU General Public License
-(GPL or copyleft),
-which is used in a lot of free software,
-and is the model for most of their licenses.
-It generally comes in a file named COPYING
-(or COPYING.LIB).
-Literature from the
-Free Software Foundation
-(FSF) might help you too.
-Particularly, the interesting feature of free software
-is that it comes with source code which you can consult and correct,
-or sometimes even borrow from.
-Read your particular license carefully and do comply to it.
-
-----__1.3. Contributions__
-
-This is an interactively evolving document: you are especially invited
-to ask questions,
-to answer questions,
-to correct given answers,
-to give pointers to new software,
-to point the current maintainer to bugs or deficiencies in the pages.
-In one word, contribute!
-
-
-
-To contribute, please contact the maintainer.
-
-
-
-
-
-
-
-
-At the time of writing, it is
-Konstantin Boldyshev
-and no more
-Francois-Rene Rideau (since version .5).
-I (Fare) had been looking for some time
-for a serious hacker to replace me as maintainer of this document,
-and am pleased to announce
-Konstantin as my worthy successor.
-
-----
-!!!Chapter 2. Do you need assembly?
-
-Well, I wouldn't want to interfere with what you're doing,
-but here is some advice from the hard-earned experience.
-
-----
-!!!2.1. Pros and Cons
-!!2.1.1. The advantages of Assembly
-
-Assembly can express very low-level things:
-
-
-
-
-
-*
-
-you can access machine-dependent registers and I/O
-
-
-*
-*
-
-you can control the exact code behavior
-in critical sections that might otherwise involve deadlock
-between multiple software threads or hardware devices
-
-
-*
-*
-
-you can break the conventions of your usual compiler,
-which might allow some optimizations
-(like temporarily breaking rules about memory allocation,
-threading, calling conventions, etc)
-
-
-*
-*
-
-you can build interfaces between code fragments
-using incompatible conventions
-(e.g. produced by different compilers,
-or separated by a low-level interface)
-
-
-*
-*
-
-you can get access to unusual programming modes of your processor
-(e.g. 16 bit mode to interface startup, firmware, or legacy code
-on Intel PCs)
-
-
-*
-*
-
-you can produce reasonably fast code for tight loops
-to cope with a bad non-optimizing compiler
-(but then, there are free optimizing compilers available!)
-
-
-*
-*
-
-you can produce hand-optimized code
-perfectly tuned for your particular hardware setup,
-though not to someone else's
-
-
-*
-*
-
-you can write some code for your new language's optimizing compiler
-(that is something what very few ones will ever do, and even they not often)
-
-
-*
-*
-
-i.e. you can be in complete control of your code
-
-
-*
-
-----
-!!2.1.2. The disadvantages of Assembly
-
-Assembly is a very low-level language
-(the lowest above hand-coding the binary instruction patterns).
-This means
-
-
-
-
-
-*
-
-it is long and tedious to write initially
-
-
-*
-*
-
-it is quite bug-prone
-
-
-*
-*
-
-your bugs can be very difficult to chase
-
-
-*
-*
-
-your code can be fairly difficult to understand and modify,
-i.e. to maintain
-
-
-*
-*
-
-the result is non-portable to other architectures,
-existing or upcoming
-
-
-*
-*
-
-your code will be optimized only for a certain implementation
-of a same architecture:
-for instance, among Intel-compatible platforms
-each CPU design and its variations
-(relative latency, through-output, and capacity,
-of processing units, caches, RAM, bus, disks,
-presence of FPU, MMX, 3DNOW, SIMD extensions, etc)
-implies potentially completely different optimization techniques.
-CPU designs already include:
-Intel 386, 486, Pentium, PPro, PII, PIII, PIV;
-Cyrix 5x86, 6x86, M2; AMD K5, K6 (K6-2, K6-III), K7 (Athlon, Duron).
-New designs keep popping up, so don't expect either this listing
-and your code to be up-to-date.
-
-
-*
-*
-
-you spend more time on a few details
-and can't focus on small and large algorithmic design,
-that are known to bring the largest part of the speed up
-(e.g. you might spend some time building very fast
-list/array manipulation primitives in assembly;
-only a hash table would have sped up your program much more;
-or, in another context, a binary tree;
-or some high-level structure distributed over a cluster of CPUs)
-
-
-*
-*
-
-a small change in algorithmic design might completely
-invalidate all your existing assembly code.
-So that either you're ready (and able) to rewrite it all,
-or you're tied to a particular algorithmic design
-
-
-*
-*
-
-On code that ain't too far from what's in standard benchmarks,
-commercial optimizing compilers outperform hand-coded assembly
-(well, that's less true on the x86 architecture than on RISC architectures,
-and perhaps less true for widely available/free compilers;
-anyway, for typical C code, GCC is fairly good);
-
-
-*
-*
-
-And in any case, as says moderator John Levine on
-comp.compilers,
-
-
-
-"compilers make it a lot easier to use complex data structures,
-and compilers don't get bored halfway through
-and generate reliably pretty good code."
-
-
-
-They will also ''correctly'' propagate code transformations
-throughout the whole (huge) program
-when optimizing code between procedures and module boundaries.
-
-
-*
-
-----
-!!2.1.3. Assessment
-
-All in all, you might find that though using assembly is sometimes needed,
-and might even be useful in a few cases where it is not, you'll want to:
-
-
-
-
-
-*
-
-minimize use of assembly code
-
-
-*
-*
-
-encapsulate this code in well-defined interfaces
-
-
-*
-*
-
-have your assembly code automatically generated
-from patterns expressed in a higher-level language
-than assembly (e.g. GCC inline assembly macros)
-
-
-*
-*
-
-have automatic tools translate these programs
-into assembly code
-
-
-*
-*
-
-have this code be optimized if possible
-
-
-*
-*
-
-All of the above,
-i.e. write (an extension to) an optimizing compiler back-end.
-
-
-*
-
-
-
-Even when assembly is needed (e.g. OS development),
-you'll find that not so much of it is required,
-and that the above principles retain.
-
-
-
-See the Linux kernel sources concerning this:
-as little assembly as needed,
-resulting in a fast, reliable, portable, maintainable OS.
-Even a successful game like DOOM was almost massively written in C,
-with a tiny part only being written in assembly for speed up.
-
-----
-!!!2.2. How to NOT use Assembly
-!!2.2.1. General procedure to achieve efficient code
-
-As says Charles Fiterman on
-comp.compilers
-about human vs computer-generated assembly code:
-
-
-
-The human should always win and here is why.
-
-First the human writes the whole thing in a high level language.
-Second he profiles it to find the hot spots where it spends its time.
-Third he has the compiler produce assembly for those small sections of code.
-Fourth he hand tunes them looking for tiny improvements over the machine generated code.
-
-The human wins because he can use the machine.
-
-----
-!!2.2.2. Languages with optimizing compilers
-
-Languages like ObjectiveCAML, SML, CommonLISP, Scheme, ADA, Pascal, C, C++,
-among others, all have free optimizing compilers
-that will optimize the bulk of your programs,
-and often do better than hand-coded assembly even for tight loops,
-while allowing you to focus on higher-level details,
-and without forbidding you to grab
-a few percent of extra performance in the above-mentioned way,
-once you've reached a stable design.
-Of course, there are also commercial optimizing compilers
-for most of these languages, too!
-
-
-
-Some languages have compilers that produce C code,
-which can be further optimized by a C compiler:
-LISP, Scheme, Perl, and many other.
-Speed is fairly good.
-
-----
-!!2.2.3. General procedure to speed your code up
-
-As for speeding code up,
-you should do it only for parts of a program
-that a profiling tool has consistently identified
-as being a performance bottleneck.
-
-
-
-Hence, if you identify some code portion as being too slow, you should
-
-
-
-
-
-*
-
-first try to use a better algorithm;
-
-
-*
-*
-
-then try to compile it rather than interpret it;
-
-
-*
-*
-
-then try to enable and tweak optimization from your compiler;
-
-
-*
-*
-
-then give the compiler hints about how to optimize
-(typing information in LISP; register usage with GCC;
-lots of options in most compilers, etc).
-
-
-*
-*
-
-then possibly fallback to assembly programming
-
-
-*
-
-
-
-Finally, before you end up writing assembly,
-you should inspect generated code,
-to check that the problem really is with bad code generation,
-as this might really not be the case:
-compiler-generated code might be better than what you'd have written,
-particularly on modern multi-pipelined architectures!
-Slow parts of a program might be intrinsically so.
-The biggest problems on modern architectures with fast processors
-are due to delays from memory access, cache-misses, TLB-misses,
-and page-faults;
-register optimization becomes useless,
-and you'll more profitably re-think data structures and threading
-to achieve better locality in memory access.
-Perhaps a completely different approach to the problem might help, then.
-
-----
-!!2.2.4. Inspecting compiler-generated code
-
-There are many reasons to inspect compiler-generated assembly code.
-Here is what you'll do with such code:
-
-
-
-
-
-*
-
-check whether generated code
-can be obviously enhanced with hand-coded assembly
-(or by tweaking compiler switches)
-
-
-*
-*
-
-when that's the case,
-start from generated code and modify it
-instead of starting from scratch
-
-
-*
-*
-
-more generally, use generated code as stubs to modify,
-which at least gets right the way
-your assembly routines interface to the external world
-
-
-*
-*
-
-track down bugs in your compiler (hopefully the rarer)
-
-
-*
-
-
-
-The standard way to have assembly code be generated
-is to invoke your compiler with the -S flag.
-This works with most Unix compilers,
-including the GNU C Compiler (GCC), but YMMV.
-As for GCC, it will produce more understandable assembly code with
-the -fverbose-asm command-line option.
-Of course, if you want to get good assembly code,
-don't forget your usual optimization options and hints!
-
-----
-!!!2.3. Linux and assembly
-
-As you probably noticed, in general case
-you don't need to use assembly language in Linux programming.
-Unlike DOS, you do not have to write Linux drivers in assembly
-(well, actually you can do it if you really want).
-And with modern optimizing compilers,
-if you care of speed optimization for different CPU's,
-it's much simpler to write in C.
-However, if you're reading this,
-you might have some reason to use assembly instead of C/C++.
-
-
-
-You may ''need'' to use assembly, or you may ''want'' to use assembly.
-In short, main practical (''need'') reasons
-of diving into the assembly realm are ''small code''
-and ''libc independence''.
-Impractical (''want''), and the most often reason is
-being just an old crazy hacker,
-who has twenty years old habit of doing everything in assembly language.
-
-
-
-However, if you're porting Linux to some embedded hardware
-you can be quite short at the size of whole system:
-you need to fit kernel, libc
-and all that stuff of (file|find|text|sh|etc.) utils
-into several hundreds of kilobytes,
-and every kilobyte costs much.
-So, one of the possible ways is to rewrite some
-(or all) parts of system in assembly,
-and this will really save you a lot of space.
-For instance, a simple __httpd__ written in assembly
-can take less than 600 bytes;
-you can fit a webserver, consisting of kernel and httpd,
-in 400 KB or less... Think about it.
-
-----
-!!!Chapter 3. Assemblers
-!!!3.1. GCC Inline Assembly
-
-The well-known GNU C/C++ Compiler (GCC),
-an optimizing 32-bit compiler at the heart of the GNU project,
-supports the x86 architecture quite well,
-and includes the ability to insert assembly code in C programs,
-in such a way that register allocation can be either specified or left to GCC.
-GCC works on most available platforms,
-notably Linux, *BSD, VSTa, OS/2, *DOS, Win*, etc.
-
-----
-!!3.1.1. Where to find GCC
-
-The original GCC site is the GNU FTP site
-ftp://prep.ai.mit.edu/pub/gnu/gcc/
-together with all released application software from the GNU project.
-Linux-configured and pre-compiled versions can be found in
-ftp://metalab.unc.edu/pub/Linux/GCC/
-There are a lot of FTP mirrors of both sites
-everywhere around the world, as well as CD-ROM copies.
-
-
-
-GCC development has split into two branches some time ago (GCC 2.8 and EGCS),
-but they merged back, and current GCC webpage is
-http://gcc.gnu.org.
-
-
-
-Sources adapted to your favorite OS and pre-compiled binaries
-should be found at your usual FTP sites.
-
-
-
-
-DOS port of GCC is called
-DJGPP.
-
-
-
-There are two Win32 GCC ports:
-cygwin and
-mingw
-
-
-
-There is also an OS/2 port of GCC called EMX;
-it works under DOS too,
-and includes lots of unix-emulation library routines.
-Look around the following site:
-ftp://ftp-os2.cdrom.com/pub/os2/emx09c.
-
-----
-!!3.1.2. Where to find docs for GCC Inline Asm
-
-The documentation of GCC includes documentation files in !TeXinfo format.
-You can compile them with TeX and print then result,
-or convert them to .info, and browse them with emacs,
-or convert them to .html, or nearly whatever you like;
-convert (with the right tools) to whatever you like,
-or just read as is. The .info files
-are generally found on any good installation for GCC.
-
-
-
-The right section to look for is C Extensions::Extended Asm::
-
-
-
-Section Invoking GCC::Submodel Options::i386 Options:: might help too.
-Particularly, it gives the i386 specific constraint names for registers:
-abcdSDB correspond to
-%eax,
-%ebx,
-%ecx,
-%edx,
-%esi,
-%edi
-and
-%ebp
-respectively (no letter for %esp).
-
-
-
-The DJGPP Games resource (not only for game hackers) had page
-specifically about assembly, but it's down.
-Its data have nonetheless been recovered on the
-DJGPP site,
-that contains a mine of other useful information:
-http://www.delorie.com/djgpp/doc/brennan/, and in the
-DJGPP Quick ASM Programming Guide.
-
-
-
-GCC depends on GAS for assembling and follows its syntax (see below);
-do mind that inline asm needs percent characters to be quoted,
-they will be passed to GAS.
-See the section about GAS below.
-
-
-
-Find ''lots'' of useful examples in the
-linux/include/asm-i386/
-subdirectory of the sources for the Linux kernel.
-
-----
-!!3.1.3. Invoking GCC to build proper inline assembly code
-
-Because assembly routines from the kernel headers
-(and most likely your own headers,
-if you try making your assembly programming as clean
-as it is in the linux kernel)
-are embedded in extern inline functions,
-GCC must be invoked with the -O flag
-(or -O2, -O3, etc),
-for these routines to be available.
-If not, your code may compile, but not link properly,
-since it will be looking for non-inlined extern functions
-in the libraries against which your program is being linked!
-Another way is to link against libraries that include fallback
-versions of the routines.
-
-
-
-Inline assembly can be disabled with -fno-asm,
-which will have the compiler die when using extended inline asm syntax,
-or else generate calls to an external function named asm()
-that the linker can't resolve.
-To counter such flag, -fasm restores treatment
-of the asm keyword.
-
-
-
-More generally, good compile flags for GCC on the x86 platform are
-
-
-
-__gcc -O2 -fomit-frame-pointer -W -Wall__
-
-
-
--O2 is the good optimization level in most cases.
-Optimizing besides it takes more time, and yields code that is much larger,
-but only a bit faster;
-such over-optimization might be useful for tight loops only (if any),
-which you may be doing in assembly anyway.
-In cases when you need really strong compiler optimization for a few files,
-do consider using up to -O6.
-
-
-
--fomit-frame-pointer allows generated code to skip
-the stupid frame pointer maintenance, which makes code smaller and faster,
-and frees a register for further optimizations.
-It precludes the easy use of debugging tools (__gdb__),
-but when you use these, you just don't care about size and speed anymore anyway.
-
-
-
--W -Wall enables all useful warnings
-and helps you to catch obvious stupid errors.
-
-
-
-You can add some CPU-specific -m486 or such flag so that
-GCC will produce code that is more adapted to your precise CPU.
-Note that modern GCC has -mpentium and such flags
-(and PGCC has even more),
-whereas GCC 2.7.x and older versions do not.
-A good choice of CPU-specific flags should be in the Linux kernel.
-Check the !TeXinfo documentation of your current GCC installation for more.
-
-
-
--m386 will help optimize for size,
-hence also for speed on computers whose memory is tight and/or loaded,
-since big programs cause swap, which more than counters
-any "optimization" intended by the larger code.
-In such settings, it might be useful to stop using C,
-and use instead a language that favors code factorization,
-such as a functional language and/or FORTH,
-and use a bytecode- or wordcode- based implementation.
-
-
-
-Note that you can vary code generation flags from file to file,
-so performance-critical files will use maximum optimization,
-whereas other files will be optimized for size.
-
-
-
-To optimize even more, option -mregparm=2
-and/or corresponding function attribute might help,
-but might pose lots of problems when linking to foreign code,
-''including libc''.
-There are ways to correctly declare foreign functions
-so the right call sequences be generated,
-or you might want to recompile the foreign libraries
-to use the same register-based calling convention...
-
-
-
-Note that you can add make these flags the default by editing file
-/usr/lib/gcc-lib/i486-linux/2.7.2.3/specs
-or wherever that is on your system
-(better not add -W -Wall there, though).
-The exact location of the GCC specs files on system can be found by
-__gcc -v__.
-
-----
-!!3.1.4. Macro support
-
-GCC allows (and requires) you to specify register constraints
-in your inline assembly code, so the optimizer always know about it;
-thus, inline assembly code is really made of patterns,
-not forcibly exact code.
-
-
-
-Thus, you can make put your assembly into CPP macros, and inline C functions,
-so anyone can use it in as any C function/macro.
-Inline functions resemble macros very much, but are sometimes cleaner to use.
-Beware that in all those cases, code will be duplicated,
-so only local labels (of 1: style)
-should be defined in that asm code.
-However, a macro would allow the name for a non local defined label
-to be passed as a parameter
-(or else, you should use additional meta-programming methods).
-Also, note that propagating inline asm code will spread potential bugs in them;
-so watch out doubly for register constraints in such inline asm code.
-
-
-
-Lastly, the C language itself may be considered as a good abstraction
-to assembly programming,
-which relieves you from most of the trouble of assembling.
-
-----
-!!!3.2. GAS
-
-GAS is the GNU Assembler, that GCC relies upon.
-
-----
-!!3.2.1. Where to find it
-
-Find it at the same place where you found GCC,
-in a package named binutils.
-
-
-
-The latest version is available from HJLu at
-ftp://ftp.varesearch.com/pub/support/hjl/binutils/.
-
-----
-!!3.2.2. What is this AT8T syntax
-
-Because GAS was invented to support a 32-bit unix compiler,
-it uses standard AT8T syntax,
-which resembles a lot the syntax for standard m68k assemblers,
-and is standard in the UNIX world.
-This syntax is neither worse, nor better than the Intel syntax.
-It's just different.
-When you get used to it,
-you find it much more regular than the Intel syntax,
-though a bit boring.
-
-
-
-Here are the major caveats about GAS syntax:
-
-
-
-
-
-*
-
-Register names are prefixed with %, so that registers
-are %eax, %dl and so on,
-instead of just eax, dl, etc.
-This makes it possible to include external C symbols directly
-in assembly source, without any risk of confusion, or any need
-for ugly underscore prefixes.
-
-
-*
-*
-
-The order of operands is source(s) first, and destination last,
-as opposed to the Intel convention of destination first and sources last.
-Hence, what in Intel syntax is
-mov eax,edx
-(move contents of register edx into register eax)
-will be in GAS syntax
-mov %edx,%eax.
-
-
-*
-*
-
-The operand size is specified as a suffix to the instruction name.
-The suffix is
-b for (8-bit) byte,
-w for (16-bit) word, and
-l for (32-bit) long.
-For instance, the correct syntax for the above instruction
-would have been movl %edx,%eax.
-However, gas does not require strict AT8T syntax,
-so the suffix is optional when size can be guessed from register operands,
-and else defaults to 32-bit (with a warning).
-
-
-*
-*
-
-Immediate operands are marked with a $ prefix,
-as in addl $5,%eax
-(add immediate long value 5 to register %eax).
-
-
-*
-*
-
-Missing operand prefix indicates it is a memory-address;
-hence movl $foo,%eax
-puts the ''address'' of variable foo
-into register %eax,
-but movl foo,%eax
-puts the ''contents'' of variable foo
-into register %eax.
-
-
-*
-*
-
-Indexing or indirection is done by enclosing the index register
-or indirection memory cell address in parentheses,
-as in testb $0x80,17(%ebp)
-(test the high bit of the byte value at offset 17
-from the cell pointed to by %ebp).
-
-
-*
-
-
-
-
-Note: There are few programs
-which may help you to convert source code between AT8T and Intel assembler syntaxes;
-some of the are capable of performing conversion in both directions.
-
-
-
-GAS has comprehensive documentation in !TeXinfo format,
-which comes at least with the source distribution.
-Browse extracted .info pages with Emacs or whatever.
-There used to be a file named gas.doc or as.doc
-around the GAS source package, but it was merged into the !TeXinfo docs.
-Of course, in case of doubt, the ultimate documentation
-is the sources themselves!
-A section that will particularly interest you is
-Machine Dependencies::i386-Dependent::
-
-
-
-Again, the sources for Linux (the OS kernel) come in as excellent examples;
-see under linux/arch/i386/ the following files:
-kernel/*.S,
-boot/compressed/*.S,
-mathemu/*.S.
-
-
-
-If you are writing kind of a language, a thread package, etc.,
-you might as well see how other languages (
-OCaml,
-Gforth,
-etc.),
-or thread packages (!QuickThreads, MIT pthreads, !LinuxThreads, etc),
-or whatever else do it.
-
-
-
-Finally, just compiling a C program to assembly
-might show you the syntax for the kind of instructions you want.
-See section Do you need assembly? above.
-
-----
-!!3.2.3. Intel syntax
-
-Good news are that starting from binutils 2.10 release,
-GAS supports Intel syntax too.
-It can be triggered with .intel_syntax directive.
-Unfortunately this mode is not documented (yet?) in the official
-binutils manual, so if you want to use it, try to examine
-http://home.snafu.de/phpr/lhpas86.html.gz,
-which is an extract from AMD 64bit port of binutils 2.11.
-
-----
-!!3.2.4. 16-bit mode
-
-Binutils (2.9.1..25+) now fully support 16-bit mode
-(registers ''and'' addressing) on i386 PCs.
-Use .code16 and .code32
-to switch between assembly modes.
-
-
-
-Also, a neat trick used by several people (including the oskit authors)
-is to force GCC to produce code for 16-bit real mode,
-using an inline assembly statement
-asm(".code16\n").
-GCC will still emit only 32-bit addressing modes,
-but GAS will insert proper 32-bit prefixes for them.
-
-----
-!!3.2.5. Macro support
-
-GAS has some macro capability included, as detailed in the texinfo docs.
-Moreover, while GCC recognizes .s files as raw assembly
-to send to GAS, it also recognizes .S files as files
-to pipe through CPP before feeding them to GAS.
-Again and again, see Linux sources for examples.
-
-
-
-GAS also has GASP (GAS Preprocessor),
-which adds all the usual macroassembly tricks to GAS.
-GASP comes together with GAS in the GNU binutils archive.
-It works as a filter, like CPP and M4.
-I have no idea on details, but it comes with its own texinfo documentation,
-which you would like to browse (__info gasp__), print, grok.
-GAS with GASP looks like a regular macro-assembler to me.
-
-----
-!!!3.3. NASM
-
-The Netwide Assembler project provides cool i386 assembler,
-written in C, that should be modular enough
-to eventually support all known syntaxes and object formats.
-
-----
-!!3.3.1. Where to find NASM
-
-http://nasm.2y.net,
-http://www.cryogen.com/nasm/
-
-
-
-Binary release on your usual metalab mirror
-in devel/lang/asm/ directory.
-Should also be available as .rpm or
-.deb in your usual !RedHat/Debian distributions' contrib.
-
-----
-!!3.3.2. What it does
-
-The syntax is Intel-style.
-Comprehensive macroprocessing support is integrated.
-
-
-
-Supported object file formats are
-bin,
-aout,
-coff,
-elf,
-as86,
-obj (DOS),
-win32,
-rdf (their own format).
-
-
-
-NASM can be used as a backend for the free LCC compiler
-(support files included).
-
-
-
-Unless you're using BCC as a 16-bit compiler
-(which is out of scope of this 32-bit HOWTO),
-you should definitely use NASM instead of say AS86 or MASM,
-because it runs on all platforms.
-
-
-
-
-
-
-
-
-NASM comes with a disassembler, NDISASM.
-
-
-
-Its hand-written parser makes it much faster than GAS,
-though of course, it doesn't support three bazillion different architectures.
-If you like Intel-style syntax, as opposed to GAS syntax,
-then it should be the assembler of choice..
-
-
-
-Note: There are few programs
-which may help you to convert source code between AT8T and Intel assembler syntaxes;
-some of the are capable of performing conversion in both directions.
-
-----
-!!!3.4. AS86
-
-AS86 is a 80x86 assembler, both 16-bit and 32-bit,
-with integrated macro support.
-It has mostly Intel-syntax, though it differs slightly as for addressing modes.
-
-----
-!!3.4.1. Where to get AS86
-
-Current version is .16, it can be found at
-http://www.cix.co.uk/~mayday/, in bin86 package with linker (ld86),
-or as separate archive.
-
-
-
-
-
-
-
-
-A completely outdated version .4 of AS86 is distributed by HJLu
-just to compile the Linux kernel versions prior to 2.4,
-in a package named bin86, available in any Linux GCC repository.
-But I advise no one to use it for anything else but compiling Linux.
-This version supports only a hacked minix object file format,
-which is not supported by the GNU binutils or anything,
-and it has a few bugs in 32-bit mode,
-so you really should better keep it only for compiling Linux.
-
-----
-!!3.4.2. Where to find docs
-
-See the man page and as.doc from the source package.
-When in doubt, the sources themselves are often a good docs:
-they aren't very well commented, but the programming style is straightforward.
-You might try to see how as86 is used in ELKS, LILO, or Tunes ...25...
-
-----
-!!3.4.3. Using AS86 with BCC
-
-Here's the GNU Makefile entry for using BCC
-to transform .s asm
-into both a.out .o object
-and .l listing:
-
-
-
-
-%.o %.l: %.s
-bcc -3 -G -c -A-d -A-l -A$*.l -o $*.o $`
-
-
-
-Remove the %.l,
--A-l, and -A$*.l,
-if you don't want any listing.
-If you want something else than a.out,
-you can examine BCC docs about the other supported formats,
-and/or use the objcopy utility from the GNU binutils package.
-
-----
-!!!3.5. Other Assemblers
-
-There are other assemblers with various interesting and outstanding features
-which may be of your interest as well.
-
-
-
-
-
-
-
-
-They can be in various stages of development,
-and can be non-classic/high-level/whatever else.
-
-----
-!!3.5.1. YASM
-
-YASM is a complete rewrite of the NASM assembler under the GNU GPL
-(some portions are under the "new" BSD License). It is designed
-from the ground up to allow for multiple syntaxes to be supported
-(eg, NASM, TASM, GAS, etc.) in addition to multiple output object formats.
-Another primary module of the overall design is an optimizer module.
-
-
-
-It looks promising; it is under heavy development,
-and you may want to take part.
-See http://www.tortall.net/projects/yasm/.
-
-----
-!!3.5.2. OSIMPA (SHASM)
-
-osimpa is an assembler for Intel 80386 processors and subsequent, written
-entirely in the GNU Bash command interpreter shell. The predecessor of osimpa
-was shasm. osimpa is much cleaned up, can create useful Linux ELF executables,
-and has various HLL-like extensions and programmer convenience commands.
-
-
-
-It is (of course) slower than other assemblers.
-It has its own syntax (and uses its own names for x86 opcodes)
-Fairly good documentation is included.
-Check it out:
-ftp://linux01.gwdg.de/pub/cLIeNUX/interim/.
-Probably you'll not use it on regular basis,
-but at least it deserves your interest as an interesting idea.
-
-----
-!!3.5.3. TDASM
-
-The Table Driven Assembler (TDASM) is a ''free'' portable
-cross assembler for any kind of assembly language.
-It should be possible to use it as a compiler to any target microprocessor
-using a table that defines the compilation process.
-
-
-
-It is available from http://www.penguin.cz/~niki/tdasm/.
-
-----
-!!3.5.4. Free Pascal
-
-Free Pascal
-has an internal 32-bit assembler (based on NASM tables)
-and a switchable output that allows:
-
-
-
-
-
-*
-
-Binary (ELF and coff when crosscompiled .o) output
-
-
-*
-*
-
-NASM
-
-
-*
-*
-
-MASM
-
-
-*
-*
-
-TASM
-
-
-*
-*
-
-AS (aout,coff, elf32)
-
-
-*
-
-
-
-The MASM and TASM output are not as good debugged as the other two,
-but can be handy sometimes.
-
-
-
-The assembler's look and feel are based on Turbo Pascal's internal BASM,
-and the IDE supports similar highlighting, and FPC can fully integrate
-with gcc (on C level, not C++).
-
-
-
-Using a dummy RTL, one can even generate pure assembler programs.
-
-----
-!!3.5.5. Win32Forth assembler
-
-Win32Forth is a ''free'' 32-bit ANS FORTH system
-that successfully runs under Win32s, Win95, Win/NT.
-It includes a free 32-bit assembler (either prefix or postfix syntax)
-integrated into the reflective FORTH language.
-Macro processing is done with
-the full power of the reflective language FORTH;
-however, the only supported input and output contexts is Win32For itself
-(no dumping of .obj file,
-but you could add that feature yourself, of course).
-Find it at
-ftp://ftp.forth.org/pub/Forth/Compilers/native/windows/Win32For/.
-
-----
-!!3.5.6. Terse
-
-Terse
-is a programming tool that provides ''THE'' most compact
-assembler syntax for the x86 family!
-However, it is evil proprietary software.
-It is said that there was a project for a free clone somewhere,
-that was abandoned after worthless pretenses that the syntax
-would be owned by the original author.
-Thus, if you're looking for
-a nifty programming project related to assembly hacking,
-I invite you to develop a terse-syntax frontend to NASM,
-if you like that syntax.
-
-
-
-As an interesting historic remark, on
-comp.compilers,
-
-
-
-
-
-1999/07/11 19:36:51, the moderator wrote:
-
-"There's no reason that assemblers have to have awful syntax. About
-30 years ago I used Niklaus Wirth's PL360, which was basically a S/360
-assembler with Algol syntax and a a little syntactic sugar like while
-loops that turned into the obvious branches. It really was an
-assembler, e.g., you had to write out your expressions with explicit
-assignments of values to registers, but it was nice. Wirth used it to
-write Algol W, a small fast Algol subset, which was a predecessor to
-Pascal. As is so often the case, Algol W was a significant
-improvement over many of its successors. -John"
-
-
-
-----
-!!3.5.7. HLA
-
-HLA is a
-''H''igh
-''L''evel
-''A''ssembly language.
-It uses a high level language like syntax
-(similar to Pascal, C/C++, and other HLLs) for variable declarations,
-procedure declarations, and procedure calls. It uses a modified
-assembly language syntax for the standard machine instructions.
-It also provides several high level language style control structures
-(if, while, repeat..until, etc.) that help you write much more readable code.
-
-
-
-HLA is free, but runs only under Win32.
-You need MASM and a 32-bit version of MS-link,
-because HLA produces MASM code and uses MASM for final
-assembling and linking. However it comes with
-__m2t__ (MASM to TASM)
-post-processor program that converts the HLA MASM output to a form
-that will compile under TASM. Unfortunately, NASM is not supported.
-
-----
-!!3.5.8. TALC
-
-TALC
-is another free MASM/Win32 based compiler
-(however it supports ELF output, does it?).
-
-
-
-TAL stands for
-''T''yped
-''A''ssembly
-''L''anguage.
-It extends traditional untyped assembly languages with typing annotations,
-memory management primitives, and a sound set of typing rules, to guarantee
-the memory safety, control flow safety,and type safety of TAL programs.
-Moreover, the typing constructs are expressive enough to encode
-most source language programming features including records and structures,
-arrays, higher-order and polymorphic functions, exceptions, abstract data types,
-subtyping, and modules. Just as importantly,
-TAL is flexible enough to admit many low-level compiler optimizations.
-Consequently, TAL is an ideal target platform for type-directed compilers
-that want to produce verifiably safe code
-for use in secure mobile code applications
-or extensible operating system kernels.
-
-----
-!!3.5.9. Non-free and/or Non-32bit x86 assemblers
-
-You may find more about them,
-together with the basics of x86 assembly programming, in the
-Raymond Moon's x86 assembly FAQ.
-
-
-
-Note that all DOS-based assemblers should work inside the Linux DOS Emulator,
-as well as other similar emulators, so that if you already own one,
-you can still use it inside a real OS.
-Recent DOS-based assemblers also support COFF and/or other object file formats
-that are supported by the GNU BFD library,
-so that you can use them together with your free 32-bit tools,
-perhaps using GNU objcopy (part of the binutils) as a conversion filter.
-
-----
-!!!Chapter 4. Metaprogramming
-
-Assembly programming is a bore,
-but for critical parts of programs.
-
-
-
-You should use the appropriate tool for the right task,
-so don't choose assembly when it does not fit;
-C, OCaml, perl, Scheme, might be a better choice
-in the most cases.
-
-
-
-However, there are cases when these tools do not give
-fine enough control on the machine, and assembly is useful or needed.
-In these cases you'll appreciate a system of macroprocessing and
-metaprogramming that allows recurring patterns to be factored
-each into one indefinitely reusable definition, which allows
-safer programming, automatic propagation of pattern modification, etc.
-Plain assembler often is not enough,
-even when one is doing only small routines to link with C.
-
-----
-!!!4.1. External filters
-
-Whatever is the macro support from your assembler,
-or whatever language you use (even C!),
-if the language is not expressive enough to you,
-you can have files passed through an external filter
-with a Makefile rule like that:
-
-
-
-
-%.s: %.S other_dependencies
-$(FILTER) $(FILTER_OPTIONS) ` $` b $@
-
-----
-!!4.1.1. CPP
-
-CPP is truly not very expressive, but it's enough for easy things,
-it's standard, and called transparently by GCC.
-
-
-
-As an example of its limitations, you can't declare objects so that
-destructors are automatically called at the end of the declaring block;
-you don't have diversions or scoping, etc.
-
-
-
-CPP comes with any C compiler.
-However, considering how mediocre it is,
-stay away from it if by chance you can make it without C.
-
-----
-!!4.1.2. M4
-
-M4 gives you the full power of macroprocessing,
-with a Turing equivalent language, recursion, regular expressions, etc.
-You can do with it everything that CPP cannot.
-
-
-
-See
-macro4th (this4th) or
-the Tunes ...25 sources
-as examples of advanced macroprogramming using m4.
-
-
-
-However, its disfunctional quoting and unquoting semantics force you to use
-explicit continuation-passing tail-recursive macro style if
-you want to do ''advanced'' macro programming
-(which is remindful of TeX -- BTW, has anyone tried to use TeX as
-a macroprocessor for anything else than typesetting ?).
-This is NOT worse than CPP that does not allow quoting and recursion anyway.
-
-
-
-The right version of M4 to get is GNU m4 1.4
-(or later if exists),
-which has the most features and the least bugs or limitations of all.
-m4 is designed to be slow for anything but the simplest uses,
-which might still be ok for most assembly programming
-(you are not writing million-lines assembly programs, are you?).
-
-----
-!!4.1.3. Macroprocessing with your own filter
-
-You can write your own simple macro-expansion filter
-with the usual tools: perl, awk, sed, etc.
-It can be made rather quickly, and you control everything.
-But, of course, power in macroprocessing implies "the hard way".
-
-----
-!!!4.2. Metaprogramming
-
-Instead of using an external filter that expands macros,
-one way to do things is to write programs that write part
-or all of other programs.
-
-
-
-For instance, you could use a program outputting source code
-
-
-
-
-
-*
-
-to generate sine/cosine/whatever lookup tables,
-
-
-*
-*
-
-to extract a source-form representation of a binary file,
-
-
-*
-*
-
-to compile your bitmaps into fast display routines,
-
-
-*
-*
-
-to extract documentation, initialization/finalization code,
-description tables, as well as normal code from the same source files,
-
-
-*
-*
-
-to have customized assembly code, generated from a perl/shell/scheme script
-that does arbitrary processing,
-
-
-*
-*
-
-to propagate data defined at one point only
-into several cross-referencing tables and code chunks.
-
-
-*
-*
-
-etc.
-
-
-*
-
-
-
-Think about it!
-
-----
-!!4.2.1. Backends from compilers
-
-Compilers like GCC, SML/NJ, Objective CAML, MIT-Scheme, CMUCL, etc,
-do have their own generic assembler backend,
-which you might choose to use,
-if you intend to generate code semi-automatically
-from the according languages,
-or from a language you hack:
-rather than write great assembly code,
-you may instead modify a compiler so that it dumps great assembly code!
-
-----
-!!4.2.2. The New-Jersey Machine-Code Toolkit
-
-There is a project, using the programming language Icon
-(with an experimental ML version),
-to build a basis for producing assembly-manipulating code.
-See around
-http://www.eecs.harvard.edu/~nr/toolkit/
-
-----
-!!4.2.3. TUNES
-
-The TUNES Project
-for a Free Reflective Computing System
-is developing its own assembler
-as an extension to the Scheme language,
-as part of its development process.
-It doesn't run at all yet, though help is welcome.
-
-
-
-The assembler manipulates abstract syntax trees,
-so it could equally serve as the basis for a assembly syntax translator,
-a disassembler, a common assembler/compiler back-end, etc.
-Also, the full power of a real language, Scheme,
-make it unchallenged as for macroprocessing/metaprogramming.
-
-----
-!!!Chapter 5. Calling conventions
-!!!5.1. Linux
-!!5.1.1. Linking to GCC
-
-This is the preferred way if you are developing mixed C-asm project.
-Check GCC docs and examples from Linux kernel .S files
-that go through gas
-(not those that go through as86).
-
-
-
-32-bit arguments are pushed down stack in reverse syntactic order
-(hence accessed/popped in the right order),
-above the 32-bit near return address.
-%ebp,
-%esi,
-%edi,
-%ebx
-are callee-saved, other registers are caller-saved;
-%eax is to hold the result, or
-%edx:%eax for 64-bit results.
-
-
-
-FP stack: I'm not sure, but I think result is in
-st(), whole stack caller-saved.
-
-
-
-Note that GCC has options to modify the calling conventions
-by reserving registers, having arguments in registers,
-not assuming the FPU, etc. Check the i386 .info pages.
-
-
-
-Beware that you must then declare the cdecl or
-regparm()
-attribute for a function that will follow standard GCC calling conventions.
-See C Extensions::Extended Asm:: section
-from the GCC info pages.
-See also how Linux defines its asmlinkage macro...
-
-----
-!!5.1.2. ELF vs a.out problems
-
-Some C compilers prepend an underscore before every symbol,
-while others do not.
-
-
-
-Particularly, Linux a.out GCC does such prepending,
-while Linux ELF GCC does not.
-
-
-
-If you need to cope with both behaviors at once,
-see how existing packages do.
-For instance, get an old Linux source tree,
-the Elk, qthreads, or OCaml...
-
-
-
-You can also override the implicit C-basm renaming
-by inserting statements like
-
- void foo asm("bar") (void);
-to be sure that the C function foo()
-will be called really bar in assembly.
-
-
-
-Note that the __objcopy__ utility from the binutils package
-should allow you to transform your a.out objects into ELF objects,
-and perhaps the contrary too, in some cases.
-More generally, it will do lots of file format conversions.
-
-----
-!!5.1.3. Direct Linux syscalls
-
-Often you will be told that using
-C library (libc)
-is the only way, and direct system calls are bad.
-This is true. To some extent.
-In general, you must know that libc is not sacred,
-and in ''most'' cases it only does some checks,
-then calls kernel, and then sets errno.
-You can easily do this in your program as well (if you need to),
-and your program will be dozen times smaller, and this will result
-in improved performance as well, just because you're not using
-shared libraries (static binaries are faster).
-Using or not using libc in assembly programming
-is more a question of taste/belief than something practical.
-Remember, Linux is aiming to be POSIX compliant,
-so does libc.
-This means that syntax of almost all
-libc "system calls"
-exactly matches syntax of real kernel system calls (and vice versa).
-Besides,
-GNU libc(glibc)
-becomes slower and slower from version to version,
-and eats more and more memory; and so,
-cases of using direct system calls become quite usual.
-But.. main drawback of throwing libc away
-is that possibly you will need to implement several
-libc specific functions (that are not just syscall wrappers)
-on your own (printf() and Co.)..
-and you are ready for that, aren't you? :)
-
-
-
-Here is summary of direct system calls pros and cons.
-
-
-
-Pros:
-
-
-
-
-
-*
-
-the smallest possible size; squeezing the last byte out of the system
-
-
-*
-*
-
-the highest possible speed; squeezing cycles out of your favorite benchmark
-
-
-*
-*
-
-full control: you can adapt your program/library
-to your specific language or memory requirements or whatever
-
-
-*
-*
-
-no pollution by libc cruft
-
-
-*
-*
-
-no pollution by C calling conventions
-(if you're developing your own language or environment)
-
-
-*
-*
-
-static binaries make you independent from libc upgrades or crashes,
-or from dangling #! path to an interpreter
-(and are faster)
-
-
-*
-*
-
-just for the fun out of it
-(don't you get a kick out of assembly programming?)
-
-
-*
-
-
-
-Cons:
-
-
-
-
-
-*
-
-If any other program on your computer uses the libc,
-then duplicating the libc code will actually
-wastes memory, not saves it.
-
-
-*
-*
-
-Services redundantly implemented in many static binaries
-are a waste of memory.
-But you can make your libc replacement a shared library.
-
-
-*
-*
-
-Size is much better saved by having some kind
-of bytecode, wordcode, or structure interpreter
-than by writing everything in assembly.
-(the interpreter itself could be written either in C or assembly.)
-The best way to keep multiple binaries small is
-to not have multiple binaries, but instead
-to have an interpreter process files with
-#! prefix.
-This is how OCaml works when used in wordcode mode
-(as opposed to optimized native code mode),
-and it is compatible with using the libc.
-This is also how Tom Christiansen's
-Perl !PowerTools
-reimplementation of unix utilities works.
-Finally, one last way to keep things small,
-that doesn't depend on an external file with a hardcoded path,
-be it library or interpreter,
-is to have only one binary,
-and have multiply-named hard or soft links to it:
-the same binary will provide everything you need in an optimal space,
-with no redundancy of subroutines or useless binary headers;
-it will dispatch its specific behavior
-according to its ''argv[[]'';
-in case it isn't called with a recognized name,
-it might default to a shell,
-and be possibly thus also usable as an interpreter!
-
-
-*
-*
-
-You cannot benefit from the many functionalities that libc provides
-besides mere linux syscalls:
-that is, functionality described in section 3 of the manual pages,
-as opposed to section 2,
-such as malloc, threads, locale, password,
-high-level network management, etc.
-
-
-*
-*
-
-Therefore, you might have to reimplement large parts of libc, from
-printf() to
-malloc() and
-gethostbyname.
-It's redundant with the libc effort,
-and can be ''quite'' boring sometimes.
-Note that some people have already reimplemented "light"
-replacements for parts of the libc -- check them out!
-(Redhat's minilibc,
-Rick Hohensee's libsys,
-Felix von Leitner's dietlibc,
-Christian Fowelin's libASM,
-asmutils
-project is working on pure assembly libc)
-
-
-*
-*
-
-Static libraries prevent you to benefit from libc upgrades as well as from
-libc add-ons such as the zlibc package,
-that does on-the-fly transparent decompression
-of gzip-compressed files.
-
-
-*
-*
-
-The few instructions added by the libc can be
-a ''ridiculously'' small speed overhead
-as compared to the cost of a system call.
-If speed is a concern, your main problem is in
-your usage of system calls, not in their wrapper's implementation.
-
-
-*
-*
-
-Using the standard assembly API for system calls is much slower
-than using the libc API when running in micro-kernel versions
-of Linux such as L4Linux,
-that have their own faster calling convention,
-and pay high convention-translation overhead
-when using the standard one
-(L4Linux comes with libc recompiled with their syscall API;
-of course, you could recompile your code with their API, too).
-
-
-*
-*
-
-See previous discussion for general speed optimization issue.
-
-
-*
-*
-
-If syscalls are too slow to you,
-you might want to hack the kernel sources (in C)
-instead of staying in userland.
-
-
-*
-
-
-
-If you've pondered the above pros and cons,
-and still want to use direct syscalls,
-then here is some advice.
-
-
-
-
-
-
-
-
-*
-
-You can easily define your system calling functions
-in a portable way in C (as opposed to unportable using assembly),
-by including asm/unistd.h,
-and using provided macros.
-
-
-*
-*
-
-Since you're trying to replace it,
-go get the sources for the libc, and grok them.
-(And if you think you can do better,
-then send feedback to the authors!)
-
-
-*
-*
-
-As an example of pure assembly code that does everything you want,
-examine Linux assembly resources.
-
-
-*
-
-
-
-Basically, you issue an int 0x80, with the
-__NR_syscallname number
-(from asm/unistd.h) in eax,
-and parameters (up to six) in
-ebx,
-ecx,
-edx,
-esi,
-edi,
-ebp respectively.
-
-
-
-Result is returned in eax,
-with a negative result being an error,
-whose opposite is what libc would put into errno.
-The user-stack is not touched,
-so you needn't have a valid one when doing a syscall.
-
-
-
-
-
-
-
-
-
-Passing sixth parameter in ebp
-appeared in Linux 2.4, previous Linux versions understand
-only 5 parameters in registers.
-
-
-
-Linux Kernel Internals,
-and especially
-How System Calls Are Implemented on i386 Architecture?
-chapter will give you more robust overview.
-
-
-
-As for the invocation arguments passed to a process upon startup,
-the general principle is that the stack
-originally contains the number of arguments ''argc'',
-then the list of pointers that constitute ''*argv'',
-then a null-terminated sequence of null-terminated
-variable=value strings for the
-''environ''ment.
-For more details,
-do examine Linux assembly resources,
-read the sources of C startup code from your libc
-(crt0.S or crt1.S),
-or those from the Linux kernel
-(exec.c and binfmt_*.c
-in linux/fs/).
-
-----
-!!5.1.4. Hardware I/O under Linux
-
-If you want to perform direct port I/O under Linux,
-either it's something very simple that does not need OS arbitration,
-and you should see the IO-Port-Programming mini-HOWTO;
-or it needs a kernel device driver, and you should try to learn more about
-kernel hacking, device driver development, kernel modules, etc,
-for which there are other excellent HOWTOs and documents from the LDP.
-
-
-
-Particularly, if what you want is Graphics programming,
-then do join one of the
-GGI or
-XFree86 projects.
-
-
-
-Some people have even done better,
-writing small and robust XFree86 drivers
-in an interpreted domain-specific language,
-GAL,
-and achieving the efficiency of hand C-written drivers
-through partial evaluation (drivers not only not in asm, but not even in C!).
-The problem is that the partial evaluator they used
-to achieve efficiency is not free software.
-Any taker for a replacement?
-
-
-
-Anyway, in all these cases, you'll be better when using GCC inline assembly
-with the macros from linux/asm/*.h
-than writing full assembly source files.
-
-----
-!!5.1.5. Accessing 16-bit drivers from Linux/i386
-
-Such thing is theoretically possible
-(proof: see how DOSEMU
-can selectively grant hardware port access to programs),
-and I've heard rumors that someone somewhere did actually do it
-(in the PCI driver? Some VESA access stuff? ISA PnP? dunno).
-If you have some more precise information on that,
-you'll be most welcome.
-Anyway, good places to look for more information are the Linux kernel sources,
-DOSEMU sources (and other programs in the
-DOSEMU repository),
-and sources for various low-level programs under Linux...
-(perhaps GGI if it supports VESA).
-
-
-
-Basically, you must either use 16-bit protected mode or vm86 mode.
-
-
-
-The first is simpler to setup, but only works with well-behaved code
-that won't do any kind of segment arithmetics
-or absolute segment addressing (particularly addressing segment ),
-unless by chance it happens that all segments used can be setup in advance
-in the LDT.
-
-
-
-The later allows for more "compatibility" with vanilla 16-bit environments,
-but requires more complicated handling.
-
-
-
-In both cases, before you can jump to 16-bit code,
-you must
-
-
-
-
-
-*
-
-mmap any absolute address used in the 16-bit code
-(such as ROM, video buffers, DMA targets, and memory-mapped I/O)
-from /dev/mem to your process' address space,
-
-
-*
-*
-
-setup the LDT and/or vm86 mode monitor.
-
-
-*
-*
-
-grab proper I/O permissions from the kernel (see the above section)
-
-
-*
-
-
-
-Again, carefully read the source for the stuff contributed
-to the DOSEMU project,
-particularly these mini-emulators for running ELKS
-and/or simple .COM programs under Linux/i386.
-
-----
-!!!5.2. DOS and Windows
-
-Most DOS extenders come with some interface to DOS services.
-Read their docs about that,
-but often, they just simulate int 0x21 and such,
-so you do "as if" you are in real mode
-(I doubt they have more than stubs
-and extend things to work with 32-bit operands;
-they most likely will just reflect the interrupt
-into the real-mode or vm86 handler).
-
-
-
-Docs about DPMI (and much more) can be found on
-ftp://x2ftp.oulu.fi/pub/msdos/programming/
-(again, the original x2ftp site is closing (no more?), so use a
-mirror site).
-
-
-
-DJGPP comes with its own (limited)
-glibc derivative/subset/replacement, too.
-
-
-
-It is possible to cross-compile from Linux to DOS,
-see the devel/msdos/ directory
-of your local FTP mirror for metalab.unc.edu;
-Also see the MOSS DOS-extender from the
-Flux project
-from the university of Utah.
-
-
-
-Other documents and FAQs are more DOS-centered;
-we do not recommend DOS development.
-
-
-
-__Windows and Co. __This document is not about Windows programming,
-you can find lots of documents about it everywhere..
-The thing you should know is that
-Cygnus Solutions
-developed the
-cygwin32.dll library,
-for GNU programs to run on Win32 platform; thus, you can use GCC, GAS,
-all the GNU tools, and many other Unix applications.
-
-----
-!!!5.3. Your own OS
-
-Control is what attracts many OS developers to assembly,
-often is what leads to or stems from assembly hacking.
-Note that any system that allows self-development
-could be qualified an "OS",
-though it can run "on the top" of an underlying system
-(much like Linux over Mach or !OpenGenera over Unix).
-
-
-
-Hence, for easier debugging purpose,
-you might like to develop your "OS" first as a process running
-on top of Linux (despite the slowness), then use the
-Flux OS kit
-(which grants use of Linux and BSD drivers in your own OS)
-to make it stand-alone.
-When your OS is stable, it is time to write your own
-hardware drivers if you really love that.
-
-
-
-This HOWTO will not cover topics such as
-bootloader code,
-getting into 32-bit mode,
-handling Interrupts,
-the basics about Intel protected mode or V86/R86 braindeadness,
-defining your object format
-and calling conventions.
-
-
-
-The main place where to find reliable information about that all,
-is source code of existing OSes and bootloaders.
-Lots of pointers are on the following webpage:
-http://www.tunes.org/Review/OSes.html
-
-----
-!!!Chapter 6. Quick start
-!!!6.1. Introduction
-
-Finally, if you still want to try this crazy idea and write something in
-assembly (if you've reached this section -- you're real assembly fan),
-here's what you need to start.
-
-
-
-As you've read before, you can write for Linux in different ways;
-I'll show how to use ''direct'' kernel calls,
-since this is the fastest way to call kernel service;
-our code is not linked to any library, does not use ELF interpreter,
-it communicates with kernel directly.
-
-
-
-I will show the same sample program in two assemblers,
-__nasm__ and __gas__,
-thus showing Intel and AT8T syntax.
-
-
-
-You may also want to read Introduction to UNIX assembly programming tutorial,
-it contains sample code for other UNIX-like OSes.
-
-----
-!!6.1.1. Tools you need
-
-First of all you need assembler (compiler) --
-__nasm__ or __gas__.
-
-
-
-Second, you need a linker -- __ld__,
-since assembler produces only object code. Almost all distributions have
-gas and ld,
-in the binutils package.
-
-
-
-As for nasm,
-you may have to download and install binary packages for Linux and docs
-from the nasm site;
-note that several distributions (Stampede, Debian, !SuSe, Mandrake)
-already have nasm, check first.
-
-
-
-If you're going to dig in, you should also install include files for your OS,
-and if possible, kernel source.
-
-----
-!!!6.2. Hello, world!
-!!6.2.1. Program layout
-
-Linux is 32-bit, runs in protected mode, has flat memory model,
-and uses the ELF format for binaries.
-
-
-
-A program can be divided into sections:
-.text for your code (read-only),
-.data for your data (read-write),
-.bss for uninitialized data (read-write);
-there can actually be a few other standard sections,
-as well as some user-defined sections,
-but there's rare need to use them and they are out of our interest here.
-A program must have at least .text section.
-
-
-
-Now we will write our first program. Here is sample code:
-
-----
-!!6.2.2. NASM (hello.asm)
-
-
-section .data ;section declaration
-msg db "Hello, world!",0xa ;our dear string
-len equ $ - msg ;length of our dear string
-section .text ;section declaration
-;we must export the entry point to the ELF linker or
-global _start ;loader. They conventionally recognize _start as their
-;entry point. Use ld -e foo to override the default.
-_start:
-;write our string to stdout
-mov edx,len ;third argument: message length
-mov ecx,msg ;second argument: pointer to message to write
-mov ebx,1 ;first argument: file handle (stdout)
-mov eax,4 ;system call number (sys_write)
-int 0x80 ;call kernel
-;and exit
-mov ebx,0 ;first syscall argument: exit code
-mov eax,1 ;system call number (sys_exit)
-int 0x80 ;call kernel
-
-----
-!!6.2.3. GAS (hello.S)
-
-
-.data # section declaration
-msg:
-.string "Hello, world!\n" # our dear string
-len = . - msg # length of our dear string
-.text # section declaration
-# we must export the entry point to the ELF linker or
-.global _start # loader. They conventionally recognize _start as their
-# entry point. Use ld -e foo to override the default.
-_start:
-# write our string to stdout
-movl $len,%edx # third argument: message length
-movl $msg,%ecx # second argument: pointer to message to write
-movl $1,%ebx # first argument: file handle (stdout)
-movl $4,%eax # system call number (sys_write)
-int $0x80 # call kernel
-# and exit
-movl $,%ebx # first argument: exit code
-movl $1,%eax # system call number (sys_exit)
-int $0x80 # call kernel
-
-----
-!!!6.3. Building an executable
-!!6.3.1. Producing object code
-
-First step of building an executable is compiling (or assembling)
-object file from the source:
-
-
-
-For nasm example:
-
-
-
-
-$ nasm -f elf hello.asm
-
-
-
-For gas example:
-
-
-
-
-$ as -o hello.o hello.S
-
-
-
-This makes hello.o object file.
-
-----
-!!6.3.2. Producing executable
-
-Second step is producing executable file itself
-from the object file by invoking linker:
-
-
-
-
-$ ld -s -o hello hello.o
-
-
-
-This will finally build hello executable.
-
-
-
-Hey, try to run it... Works? That's it. Pretty simple.
-
-----
-!!!Chapter 7. Resources__7.1. Pointers__
-
-Your main resource for Linux/UNIX assembly programming material is:
-
-
-
-http://linuxassembly.org/resources.html
-
-
-
-Do visit it, and get plenty of pointers to assembly projects,
-tools, tutorials, documentation, guides, etc,
-concerning different UNIX operating systems and CPUs.
-Because it evolves quickly, I will no longer duplicate it here.
-
-
-
-If you are new to assembly in general, here are few starting pointers:
-
-
-
-
-
-
-*
-
-The Art Of Assembly
-
-
-*
-*
-
-x86 assembly FAQ
-
-
-*
-*
-
-ftp.luth.se
-mirrors the hornet and x2ftp former archives of msdos assembly coding stuff
-
-
-*
-*
-
-!CoreWars,
-a fun way to learn assembly in general
-
-
-*
-*
-
-Usenet:
-comp.lang.asm.x86;
-alt.lang.asm
-
-
-*
-
-----__7.2. Mailing list__
-
-If you're are interested in Linux/UNIX assembly programming
-(or have questions, or are just curious)
-I especially invite you to join Linux assembly programming mailing list.
-
-
-
-This is an open discussion of assembly programming under Linux, *BSD, BeOS,
-or any other UNIX/POSIX like OS; also it is not limited to x86 assembly
-(Alpha, Sparc, PPC and other hackers are welcome too!).
-
-
-
-Mailing list address is `linux-assembly@vger.kernel.orgb.
-
-
-
-To subscribe send a messgage to `majordomo@vger.kernel.orgb
-with the following line in the body of the message:
-
-subscribe linux-assembly
-
-
-
-Detailed information and list archives are available at
-http://linuxassembly.org/list.html.
-
-----
-!!!Chapter 8. Frequently Asked Questions
-
-Here are frequently asked questions (with answers)
-about Linux assembly programming.
-Some of the questions (and the answers) were taken from the
-the linux-assembly mailing list.
-
-; 8.1. How do I do graphics programming in Linux?; 8.2. How do I debug pure assembly code under Linux?; 8.3. Any other useful debugging tools?; 8.4. How do I access BIOS functions from Linux (BSD, BeOS, etc)?; 8.5. Is it possible to write kernel modules in assembly?; 8.6. How do I allocate memory dynamically?; 8.7. I can't understand how to use select system call!
-
-__8.1. __How do I do graphics programming in Linux?
-
-
-
-__ __An answer from Paul Furber:
-
-
-
-
-Ok you have a number of options to graphics in Linux. Which one you use
-depends on what you want to do. There isn't one Web site with all the
-information but here are some tips:
-SVGALib: This is a C library for console SVGA access.
-Pros: very easy to learn, good coding examples, not all that different
-from equivalent gfx libraries for DOS, all the effects you know from DOS
-can be converted with little difficulty.
-Cons: programs need superuser rights to run since they write directly to
-the hardware, doesn't work with all chipsets, can't run under X-Windows.
-Search for svgalib-1.4.x on http://ftp.is.co.za
-Framebuffer: do it yourself graphics at SVGA res
-Pros: fast, linear mapped video access, ASM can be used if you want :)
-Cons: has to be compiled into the kernel, chipset-specific issues, must
-switch out of X to run, relies on good knowledge of linux system calls
-and kernel, tough to debug
-Examples: asmutils (http://www.linuxassembly.org) and the leaves example
-and my own site for some framebuffer code and tips in asm
-(http://ma.verick.co.za/linux4k/)
-Xlib: the application and development libraries for XFree86.
-Pros: Complete control over your X application
-Cons: Difficult to learn, horrible to work with and requires quite a bit
-of knowledge as to how X works at the low level.
-Not recommended but if you're really masochistic go for it. All the
-include and lib files are probably installed already so you have what
-you need.
-Low-level APIs: include PTC, SDL, GGI and Clanlib
-Pros: very flexible, run under X or the console, generally abstract away
-the video hardware a little so you can draw to a linear surface, lots of
-good coding examples, can link to other APIs like OpenGL and sound libs,
-Windows DirectX versions for free
-Cons: Not as fast as doing it yourself, often in development so versions
-can (and do) change frequently.
-Examples: PTC and GGI have excellent demos, SDL is used in sdlQuake,
-Myth II, Civ CTP and Clanlib has been used for games as well.
-High-level APIs: OpenGL - any others?
-Pros: clean api, tons of functionality and examples, industry standard
-so you can learn from SGI demos for example
-Cons: hardware acceleration is normally a must, some quirks between
-versions and platforms
-Examples: loads - check out www.mesa3d.org under the links section.
-To get going try looking at the svgalib examples and also install SDL
-and get it working. After that, the sky's the limit.
-
-
-
-__8.2. __How do I debug pure assembly code under Linux?
-
-
-
-__ __There's an early version of the
-Assembly Language Debugger,
-which is designed to work with assembly code,
-and is portable enough to run on Linux and *BSD.
-It is already functional and should be the right choice, check it out!
-
-
-
-You can also try __gdb__ ;).
-Although it is source-level debugger, it can be used to debug
-pure assembly code, and with some trickery you can make
-__gdb__ to do what you need
-(unfortunately, nasm '-g' switch does not generate
-proper debug info for gdb; this is nasm bug, I think).
-Here's an answer from Dmitry Bakhvalov:
-
-
-
-
-Personally, I use gdb for debugging asmutils. Try this:
-1) Use the following stuff to compile:
-$ nasm -f elf -g smth.asm
-$ ld -o smth smth.o
-2) Fire up gdb:
-$ gdb smth
-3) In gdb:
-(gdb) disassemble _start
-Place a breakpoint at _start+1 (If placed at _start the breakpoint
-wouldnt work, dunno why)
-(gdb) b *0x8048075
-To step thru the code I use the following macro:
-(gdb)define n
-bni
-bprintf "eax=%x ebx=%x ...etc...",$eax,$ebx,...etc...
-bdisassemble $pc $pc+15
-bend
-Then start the program with r command and debug with n.
-Hope this helps.
-
-
-
-An additional note from ???:
-
-
-
-
- I have such a macro in my .gdbinit for quite some time now, and it
-for sure makes life easier. A small difference : I use "x /8i $pc",
-which guarantee a fixed number of disassembled instructions. Then,
-with a well chosen size for my xterm, gdb output looks like it is
-refreshed, and not scrolling.
-
-
-
-If you want to set breakpoints across your code, you can just use
-int 3 instruction as breakpoint
-(instead of entering address manually in __gdb__).
-
-
-
-If you're using gas, you should consult
-gas and gdb related
-tutorials.
-
-
-
-__8.3. __Any other useful debugging tools?
-
-
-
-__ __Definitely __strace__ can help a lot
-(__ktrace__ and __kdump__
-on FreeBSD),
-it is used to trace system calls and signals.
-Read its manual page (__man strace__) and
-__strace --help__ output for details.
-
-
-
-__8.4. __How do I access BIOS functions from Linux (BSD, BeOS, etc)?
-
-
-
-__ __Short answer is -- noway. This is protected mode, use OS services instead.
-Again, you can't use int 0x10,
-int 0x13, etc.
-Fortunately almost everything can be implemented
-by means of system calls or library functions.
-In the worst case you may go through direct port access,
-or make a kernel patch to implement needed functionality,
-or use LRMI library to access BIOS functions.
-
-
-
-__8.5. __Is it possible to write kernel modules in assembly?
-
-
-
-__ __Yes, indeed it is. While in general it is not a good idea
-(it hardly will speedup anything), there may be a need of such wizardy.
-The process of writing a module itself is not that hard --
-a module must have some predefined global function,
-it may also need to call some external functions from the kernel.
-Examine kernel source code (that can be built as module) for details.
-
-
-
-Meanwhile, here's an example of a minimum dumb kernel module
-(module.asm)
-(source is based on example by mammon_ from APJ #8):
-
-
-
-
-section .text
-global init_module
-global cleanup_module
-global kernel_version
-extern printk
-init_module:
-push dword str1
-call printk
-pop eax
-xor eax,eax
-ret
-cleanup_module:
-push dword str2
-call printk
-pop eax
-ret
-str1 db "init_module done",0xa,
-str2 db "cleanup_module done",0xa,
-kernel_version db "2.2.18",
-
-
-
-The only thing this example does is reporting its actions.
-Modify kernel_version to match yours, and build module with:
-
-
-
-
-$ nasm -f elf -o module.m module.asm
-
-
-
-
-$ ld -r -o module.o module.m
-
-
-
-Now you can play with it using __insmod/rmmod/lsmod__
-(root privilidged are required); a lot of fun, huh?
-
-
-
-__8.6. __How do I allocate memory dynamically?
-
-
-
-__ __A laconic answer from H-Peter Recktenwald:
-
-
-
-
- ebx := 0 (in fact, any value below .bss seems to do)
-sys_brk
-eax := current top (of .bss section)
-ebx := [[ current top ` ebx ` (esp - 16K) ]
-sys_brk
-eax := new top of .bss
-
-
-
-__ __An extensive answer from Tiago Gasiba:
-
-
-
-
-section .bss
-var1 resb 1
-section .text
-;
-;allocate memory
-;
-%define LIMIT 0x4000000 ; about 100Megs
-mov ebx,0 ; get bottom of data segment
-call sys_brk
-cmp eax,-1 ; ok?
-je erro1
-add eax,LIMIT ; allocate +LIMIT memory
-mov ebx,eax
-call sys_brk
-cmp eax,-1 ; ok?
-je erro1
-cmp eax,var1+1 ; has the data segment grown?
-je erro1
-;
-;use allocated memory
-;
-; now eax contains bottom of
-; data segment
-mov ebx,eax ; save bottom
-mov eax,var1 ; eax=beginning of data segment
-repeat:
-mov word [[eax],1 ; fill up with 1's
-inc eax
-cmp ebx,eax ; current pos = bottom?
-jne repeat
-;
-;free memory
-;
-mov ebx,var1 ; deallocate memory
-call sys_brk ; by forcing its beginning=var1
-cmp eax,-1 ; ok?
-je erro2
-
-
-
-__8.7. __I can't understand how to use select system call!
-
-
-
-__ __An answer from Patrick Mochel:
-
-
-
-
-When you call sys_open, you get back a file descriptor, which is simply an
-index into a table of all the open file descriptors that your process has.
-stdin, stdout, and stderr are always , 1, and 2, respectively, because
-that is the order in which they are always open for your process from there.
-Also, notice that the first file descriptor that you open yourself (w/o first
-closing any of those magic three descriptors) is always 3, and they increment
-from there.
-Understanding the index scheme will explain what select does. When you
-call select, you are saying that you are waiting certain file descriptors
-to read from, certain ones to write from, and certain ones to watch from
-exceptions from. Your process can have up to 1024 file descriptors open,
-so an fd_set is just a bit mask describing which file descriptors are valid
-for each operation. Make sense?
-Since each fd that you have open is just an index, and it only needs to be
-on or off for each fd_set, you need only 1024 bits for an fd_set structure.
-1024 / 32 = 32 longs needed to represent the structure.
-Now, for the loose example.
-Suppose you want to read from a file descriptor (w/o timeout).
-- Allocate the equivalent to an fd_set.
-.data
-my_fds: times 32 dd
-- open the file descriptor that you want to read from.
-- set that bit in the fd_set structure.
-First, you need to figure out which of the 32 dwords the bit is in.
-Then, use bts to set the bit in that dword. bts will do a modulo 32
-when setting the bit. That's why you need to first figure out which
-dword to start with.
-mov edx,
-mov ebx, 32
-div ebx
-lea ebx, my_fds
-bts ebx[
[eax * 4
], edx
-- repeat the last step for any file descriptors you want to read from.
-- repeat the entire exercise for either of the other two fd_sets if you want action from them.
-That leaves two other parts of the equation - the n paramter and the timeout
-parameter. I'll leave the timeout parameter as an exercise for the reader
-(yes, I'm lazy), but I'll briefly talk about the n parameter.
-It is the value of the largest file descriptor you are selecting from (from
-any of the fd_sets), plus one. Why plus one? Well, because it's easy to
-determine a mask from that value. Suppose that there is data available on
-x file descriptors, but the highest one you care about is (n - 1). Since
-an fd_set is just a bitmask, the kernel needs some efficient way for
-determining whether to return or not from select. So, it masks off the bits
-that you care about, checks if anything is available from the bits that are
-still set, and returns if there is (pause as I rummage through kernel source).
-Well, it's not as easy as I fantasized it would be. To see how the kernel
-determines that mask, look in fs/select.c in the kernel source tree.
-Anyway, you need to know that number, and the easiest way to do it is to save
-the value of the last file descriptor open somewhere so you don't lose it.
-Ok, that's what I know. A warning about the code above (as always) is that
-it is not tested. I think it should work, but if it doesn't let me know.
-But, if it starts a global nuclear meltdown, don't call me. ;-)
-
-
-
-''That's all for now, folks''.
-
-----
-!!!Appendix A. History
-
-Each version includes a few fixes and minor corrections,
-that need not to be repeatedly mentioned every time.
-
-
-
-
-__Revision History__Revision .6e12 Jan 2002Revised by: konstAdded URL describing GAS Intel syntax;
-Added OSIMPA(former SHASM);
-Added YASM;
-FAQ update.Revision .6d18 Mar 2001Revised by: konstAdded Free Pascal;
-new NASM URL againRevision .6c15 Feb 2001Revised by: konstAdded SHASM;
-new answer in FAQ, new NASM URL, new mailing list addressRevision .6b21 Jan 2001Revised by: konstnew questions in FAQ, corrected few URLsRevision .6a10 Dec 2000Revised by: konstRemade section on AS86 (thanks to Holluby Istvan for pointing out
-obsolete information).
-Fixed several URLs that can be incorrectly rendered from sgml to html.Revision .611 Nov 2000Revised by: konstHOWTO is completely rewritten using !DocBook DTD.
-Layout is totally rearranged;
-too much changes to list them
here.Revision .5n07 Nov 2000Revised by: konstAdded question regarding kernel modules to FAQ,
-fixed NASM URLs, GAS has Intel syntax tooRevision .5m22 Oct 2000Revised by: konstLinux 2.4 system calls can have 6 args,
-Added ALD note to FAQ,
-fixed mailing list subscribe addressRevision .5l23 Aug 2000Revised by: konstAdded TDASM, updates on NASMRevision .5k11 Jul 2000Revised by: konstFew additions to FAQRevision .5j14 Jun 2000Revised by: konstComplete rearrangement of Introduction and Resources sections.
-FAQ added to Resources, misc cleanups and additions.Revision .5i04 May 2000Revised by: konstAdded HLA, TALC;
-rearrangements in Resources, Quick Start Assemblers sections. Few new pointers.Revision .5h09 Apr 2000Revised by: konstfinally managed to state LDP license on document,
-new resources added, misc fixesRevision .5g26 Mar 2000Revised by: konstnew resources on different CPUsRevision .5f02 Mar 2000Revised by: konstnew resources, misc correctionsRevision .5e10 Feb 2000Revised by: konstURL updates, changes in GAS exampleRevision .5d01 Feb 2000Revised by: konstResources (former "Pointers") section completely redone,
-various URL updates.Revision .5c05 Dec 1999Revised by: konstNew pointers, updates and some rearrangements.
-Rewrite of sgml source.Revision .5b19 Sep 1999Revised by: konstDiscussion about libc or not libc continues.
-New web pointers and and overall updates.Revision .5a01 Aug 1999Revised by: konstQuick Start section rearranged, added GAS example.
-Several new web pointers.Revision .501 Aug 1999Revised by: konstfareGAS has 16-bit mode.
-New maintainer (at last): Konstantin Boldyshev.
-Discussion about libc or not libc.
-Added Quick Start section with examples of assembly code.Revision .4q22 Jun 1999Revised by: fareprocess argument passing (argc, argv, environ) in assembly.
-This is yet another
-"last release by Fare before new maintainer takes over".
-Nobody knows who might be the new maintainer.Revision .4p06 Jun 1999Revised by: fareclean up and updatesRevision .4o01 Dec 1998Revised by: fareRevision .4m23 Mar 1998Revised by: farecorrections about gcc invocationRevision .4l16 Nov 1997Revised by: farerelease for LSL 6th editionRevision .4k19 Oct 1997Revised by: fareRevision .4j07 Sep 1997Revised by: fareRevision .4i17 Jul 1997Revised by: fareinfo on 16-bit mode access from !LinuxRevision .4h19 Jun 1997Revised by: farestill more on "how not to use assembly";
-updates on NASM, GAS.Revision .4g30 Mar 1997Revised by: fareRevision .4f20 Mar 1997Revised by: fareRevision .4e13 Mar 1997Revised by: fareRelease for !DrLinuxRevision .4d28 Feb 1997Revised by: fareVapor announce of a new Assembly-HOWTO maintainerRevision .4c09 Feb 1997Revised by: fareAdded section Do you need assembly?.Revision .4b03 Feb 1997Revised by: fareNASM moved: now is before AS86Revision .4a20 Jan 1997Revised by: fareCREDITS section addedRevision .420 Jan 1997Revised by: farefirst release of the HOWTO as suchRevision .4pre113 Jan 1997Revised by: faretext mini-HOWTO transformed into a full linuxdoc-sgml HOWTO,
-to see what the SGML tools are likeRevision .3l11 Jan 1997Revised by: fareRevision .3k19 Dec 1996Revised by: fareWhat? I had forgotten to point to terse???Revision .3j24 Nov 1996Revised by: farepoint to French translated versionRevision .3i16 Nov 1996Revised by: fareNASM is getting pretty slickRevision .3h06 Nov 1996Revised by: faremore about cross-compiling -- See on sunsite: devel/msdos/Revision .3g02 Nov 1996Revised by: fareCreated the History. Added pointers in cross-compiling section.
-Added section about I/O programming under Linux (particularly video).Revision .3f17 Oct 1996Revised by: fareRevision .3c15 Jun 1996Revised by: fareRevision .204 May 1996Revised by: fareRevision .123 Apr 1996Revised by: fareFrancois-Rene "Fare" Rideau creates and publishes the first mini-HOWTO,
-because "I'm sick of answering ever the same questions
-on comp.lang.asm.x86"
-
-----
-!!!Appendix B. Acknowledgements
-
-I would like to thank all the people who have contributed ideas,
-answers, remarks, and moral support, and additionally
-the following persons, by order of appearance:
-
-
-
-
-
-*
-
-Linus Torvalds
-for Linux
-
-
-*
-*
-
-
-Bruce Evans
-for bcc from which as86 is extracted
-
-
-*
-*
-
-Simon Tatham and
-Julian Hall
-for NASM
-
-
-*
-*
-
-Greg Hankins and now
-Tim Bynum
-for maintaining HOWTOs
-
-
-*
-*
-
-Raymond Moon
-for his FAQ
-
-
-*
-*
-
-Eric Dumas
-for his translation of the mini-HOWTO into French
-(sad thing for the original author to be French and write in English)
-
-
-*
-*
-
-Paul Anderson and
-Rahim Azizarab
-for helping me, if not for taking over the HOWTO
-
-
-*
-*
-
-Marc Lehman
-for his insight on GCC invocation
-
-
-*
-*
-
-Abhijit Menon-Sen
-for helping me figure out the argument passing convention
-
-
-*
-
-----
-!!!Appendix C. Endorsements
-
-This version of the document is endorsed by
-Konstantin Boldyshev.
-
-
-
-Modifications (including translations) must remove this appendix
-according to the license agreement.
-
-
-
-$Id: Assembly-HOWTO.sgml,v 1.26 2002/01/12 10:11:15 konst Exp $
-
-----
-!!!Appendix D. GNU Free Documentation License
-
-
-
-GNU Free Documentation License
-Version 1.1, March 2000
-
- Copyright (C) 2000 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-
-
-
-
-
-
-
-
-; . PREAMBLE:
-
-The purpose of this License is to make a manual, textbook,
-or other written document "free" in the sense of freedom: to
-assure everyone the effective freedom to copy and redistribute it,
-with or without modifying it, either commercially or
-noncommercially. Secondarily, this License preserves for the
-author and publisher a way to get credit for their work, while not
-being considered responsible for modifications made by
-others.
-
-
-
-This License is a kind of "copyleft", which means that
-derivative works of the document must themselves be free in the
-same sense. It complements the GNU General Public License, which
-is a copyleft license designed for free software.
-
-
-
-We have designed this License in order to use it for manuals
-for free software, because free software needs free documentation:
-a free program should come with manuals providing the same
-freedoms that the software does. But this License is not limited
-to software manuals; it can be used for any textual work,
-regardless of subject matter or whether it is published as a
-printed book. We recommend this License principally for works
-whose purpose is instruction or reference.
-
-; 1. APPLICABILITY AND DEFINITIONS:
-
-This License applies to any manual or other work that
-contains a notice placed by the copyright holder saying it can be
-distributed under the terms of this License. The "Document",
-below, refers to any such manual or work. Any member of the
-public is a licensee, and is addressed as "you".
-
-
-
-A "Modified Version" of the Document means any work
-containing the Document or a portion of it, either copied
-verbatim, or with modifications and/or translated into another
-language.
-
-
-
-A "Secondary Section" is a named appendix or a front-matter
-section of the Document that deals exclusively with the
-relationship of the publishers or authors of the Document to the
-Document's overall subject (or to related matters) and contains
-nothing that could fall directly within that overall subject.
-(For example, if the Document is in part a textbook of
-mathematics, a Secondary Section may not explain any mathematics.)
-The relationship could be a matter of historical connection with
-the subject or with related matters, or of legal, commercial,
-philosophical, ethical or political position regarding
-them.
-
-
-
-The "Invariant Sections" are certain Secondary Sections
-whose titles are designated, as being those of Invariant Sections,
-in the notice that says that the Document is released under this
-License.
-
-
-
-The "Cover Texts" are certain short passages of text that
-are listed, as Front-Cover Texts or Back-Cover Texts, in the
-notice that says that the Document is released under this
-License.
-
-
-
-A "Transparent" copy of the Document means a
-machine-readable copy, represented in a format whose specification
-is available to the general public, whose contents can be viewed
-and edited directly and straightforwardly with generic text
-editors or (for images composed of pixels) generic paint programs
-or (for drawings) some widely available drawing editor, and that
-is suitable for input to text formatters or for automatic
-translation to a variety of formats suitable for input to text
-formatters. A copy made in an otherwise Transparent file format
-whose markup has been designed to thwart or discourage subsequent
-modification by readers is not Transparent. A copy that is not
-"Transparent" is called "Opaque".
-
-
-
-Examples of suitable formats for Transparent copies include
-plain ASCII without markup, Texinfo input format, LaTeX input
-format, SGML or XML using a publicly available DTD, and
-standard-conforming simple HTML designed for human modification.
-Opaque formats include !PostScript, PDF, proprietary formats that
-can be read and edited only by proprietary word processors, SGML
-or XML for which the DTD and/or processing tools are not generally
-available, and the machine-generated HTML produced by some word
-processors for output purposes only.
-
-
-
-The "Title Page" means, for a printed book, the title page
-itself, plus such following pages as are needed to hold, legibly,
-the material this License requires to appear in the title page.
-For works in formats which do not have any title page as such,
-"Title Page" means the text near the most prominent appearance of
-the work's title, preceding the beginning of the body of the
-text.
-
-; 2. VERBATIM COPYING:
-
-You may copy and distribute the Document in any medium,
-either commercially or noncommercially, provided that this
-License, the copyright notices, and the license notice saying this
-License applies to the Document are reproduced in all copies, and
-that you add no other conditions whatsoever to those of this
-License. You may not use technical measures to obstruct or
-control the reading or further copying of the copies you make or
-distribute. However, you may accept compensation in exchange for
-copies. If you distribute a large enough number of copies you
-must also follow the conditions in section 3.
-
-
-
-You may also lend copies, under the same conditions stated
-above, and you may publicly display copies.
-
-; 3. COPYING IN QUANTITY:
-
-If you publish printed copies of the Document numbering more
-than 100, and the Document's license notice requires Cover Texts,
-you must enclose the copies in covers that carry, clearly and
-legibly, all these Cover Texts: Front-Cover Texts on the front
-cover, and Back-Cover Texts on the back cover. Both covers must
-also clearly and legibly identify you as the publisher of these
-copies. The front cover must present the full title with all
-words of the title equally prominent and visible. You may add
-other material on the covers in addition. Copying with changes
-limited to the covers, as long as they preserve the title of the
-Document and satisfy these conditions, can be treated as verbatim
-copying in other respects.
-
-
-
-If the required texts for either cover are too voluminous to
-fit legibly, you should put the first ones listed (as many as fit
-reasonably) on the actual cover, and continue the rest onto
-adjacent pages.
-
-
-
-If you publish or distribute Opaque copies of the Document
-numbering more than 100, you must either include a
-machine-readable Transparent copy along with each Opaque copy, or
-state in or with each Opaque copy a publicly-accessible
-computer-network location containing a complete Transparent copy
-of the Document, free of added material, which the general
-network-using public has access to download anonymously at no
-charge using public-standard network protocols. If you use the
-latter option, you must take reasonably prudent steps, when you
-begin distribution of Opaque copies in quantity, to ensure that
-this Transparent copy will remain thus accessible at the stated
-location until at least one year after the last time you
-distribute an Opaque copy (directly or through your agents or
-retailers) of that edition to the public.
-
-
-
-It is requested, but not required, that you contact the
-authors of the Document well before redistributing any large
-number of copies, to give them a chance to provide you with an
-updated version of the Document.
-
-; 4. MODIFICATIONS:
-
-You may copy and distribute a Modified Version of the
-Document under the conditions of sections 2 and 3 above, provided
-that you release the Modified Version under precisely this
-License, with the Modified Version filling the role of the
-Document, thus licensing distribution and modification of the
-Modified Version to whoever possesses a copy of it. In addition,
-you must do these things in the Modified Version:
-
-
-
-
-
-
-#
-
-Use in the Title Page
-(and on the covers, if any) a title distinct from that of the
-Document, and from those of previous versions (which should, if
-there were any, be listed in the History section of the
-Document). You may use the same title as a previous version if
-the original publisher of that version gives permission.
-
-
-#
-#
-
-List on the Title Page,
-as authors, one or more persons or entities responsible for
-authorship of the modifications in the Modified Version,
-together with at least five of the principal authors of the
-Document (all of its principal authors, if it has less than
-five).
-
-
-#
-#
-
-State on the Title page
-the name of the publisher of the Modified Version, as the
-publisher.
-
-
-#
-#
-
-Preserve all the
-copyright notices of the Document.
-
-
-#
-#
-
-Add an appropriate
-copyright notice for your modifications adjacent to the other
-copyright notices.
-
-
-#
-#
-
-Include, immediately
-after the copyright notices, a license notice giving the public
-permission to use the Modified Version under the terms of this
-License, in the form shown in the Addendum below.
-
-
-#
-#
-
-Preserve in that license
-notice the full lists of Invariant Sections and required Cover
-Texts given in the Document's license notice.
-
-
-#
-#
-
-Include an unaltered
-copy of this License.
-
-
-#
-#
-
-Preserve the section
-entitled "History", and its title, and add to it an item stating
-at least the title, year, new authors, and publisher of the
-Modified Version as given on the Title Page. If there is no
-section entitled "History" in the Document, create one stating
-the title, year, authors, and publisher of the Document as given
-on its Title Page, then add an item describing the Modified
-Version as stated in the previous sentence.
-
-
-#
-#
-
-Preserve the network
-location, if any, given in the Document for public access to a
-Transparent copy of the Document, and likewise the network
-locations given in the Document for previous versions it was
-based on. These may be placed in the "History" section. You
-may omit a network location for a work that was published at
-least four years before the Document itself, or if the original
-publisher of the version it refers to gives permission.
-
-
-#
-#
-
-In any section entitled
-"Acknowledgements" or "Dedications", preserve the section's
-title, and preserve in the section all the substance and tone of
-each of the contributor acknowledgements and/or dedications
-given therein.
-
-
-#
-#
-
-Preserve all the
-Invariant Sections of the Document, unaltered in their text and
-in their titles. Section numbers or the equivalent are not
-considered part of the section titles.
-
-
-#
-#
-
-Delete any section
-entitled "Endorsements". Such a section may not be included in
-the Modified Version.
-
-
-#
-#
-
-Do not retitle any
-existing section as "Endorsements" or to conflict in title with
-any Invariant Section.
-
-
-#
-
-If the Modified Version includes new front-matter sections
-or appendices that qualify as Secondary Sections and contain no
-material copied from the Document, you may at your option
-designate some or all of these sections as invariant. To do this,
-add their titles to the list of Invariant Sections in the Modified
-Version's license notice. These titles must be distinct from any
-other section titles.
-
-
-
-You may add a section entitled "Endorsements", provided it
-contains nothing but endorsements of your Modified Version by
-various parties--for example, statements of peer review or that
-the text has been approved by an organization as the authoritative
-definition of a standard.
-
-
-
-You may add a passage of up to five words as a Front-Cover
-Text, and a passage of up to 25 words as a Back-Cover Text, to the
-end of the list of Cover Texts in the Modified Version. Only one
-passage of Front-Cover Text and one of Back-Cover Text may be
-added by (or through arrangements made by) any one entity. If the
-Document already includes a cover text for the same cover,
-previously added by you or by arrangement made by the same entity
-you are acting on behalf of, you may not add another; but you may
-replace the old one, on explicit permission from the previous
-publisher that added the old one.
-
-
-
-The author(s) and publisher(s) of the Document do not by
-this License give permission to use their names for publicity for
-or to assert or imply endorsement of any Modified Version.
-
-; 5. COMBINING DOCUMENTS:
-
-You may combine the Document with other documents released
-under this License, under the terms defined in section 4 above for
-modified versions, provided that you include in the combination
-all of the Invariant Sections of all of the original documents,
-unmodified, and list them all as Invariant Sections of your
-combined work in its license notice.
-
-
-
-The combined work need only contain one copy of this
-License, and multiple identical Invariant Sections may be replaced
-with a single copy. If there are multiple Invariant Sections with
-the same name but different contents, make the title of each such
-section unique by adding at the end of it, in parentheses, the
-name of the original author or publisher of that section if known,
-or else a unique number. Make the same adjustment to the section
-titles in the list of Invariant Sections in the license notice of
-the combined work.
-
-
-
-In the combination, you must combine any sections entitled
-"History" in the various original documents, forming one section
-entitled "History"; likewise combine any sections entitled
-"Acknowledgements", and any sections entitled "Dedications". You
-must delete all sections entitled "Endorsements."
-
-; 6. COLLECTIONS OF DOCUMENTS:
-
-You may make a collection consisting of the Document and
-other documents released under this License, and replace the
-individual copies of this License in the various documents with a
-single copy that is included in the collection, provided that you
-follow the rules of this License for verbatim copying of each of
-the documents in all other respects.
-
-
-
-You may extract a single document from such a collection,
-and distribute it individually under this License, provided you
-insert a copy of this License into the extracted document, and
-follow this License in all other respects regarding verbatim
-copying of that document.
-
-; 7. AGGREGATION WITH INDEPENDENT WORKS:
-
-A compilation of the Document or its derivatives with other
-separate and independent documents or works, in or on a volume of
-a storage or distribution medium, does not as a whole count as a
-Modified Version of the Document, provided no compilation
-copyright is claimed for the compilation. Such a compilation is
-called an "aggregate", and this License does not apply to the
-other self-contained works thus compiled with the Document, on
-account of their being thus compiled, if they are not themselves
-derivative works of the Document.
-
-
-
-If the Cover Text requirement of section 3 is applicable to
-these copies of the Document, then if the Document is less than
-one quarter of the entire aggregate, the Document's Cover Texts
-may be placed on covers that surround only the Document within the
-aggregate. Otherwise they must appear on covers around the whole
-aggregate.
-
-; 8. TRANSLATION:
-
-Translation is considered a kind of modification, so you may
-distribute translations of the Document under the terms of section
-4. Replacing Invariant Sections with translations requires
-special permission from their copyright holders, but you may
-include translations of some or all Invariant Sections in addition
-to the original versions of these Invariant Sections. You may
-include a translation of this License provided that you also
-include the original English version of this License. In case of
-a disagreement between the translation and the original English
-version of this License, the original English version will
-prevail.
-
-; 9. TERMINATION:
-
-You may not copy, modify, sublicense, or distribute the
-Document except as expressly provided for under this License. Any
-other attempt to copy, modify, sublicense or distribute the
-Document is void, and will automatically terminate your rights
-under this License. However, parties who have received copies, or
-rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full
-compliance.
-
-; 10. FUTURE REVISIONS OF THIS LICENSE:
-
-The Free Software Foundation may publish new, revised
-versions of the GNU Free Documentation License from time to time.
-Such new versions will be similar in spirit to the present
-version, but may differ in detail to address new problems or
-concerns. See http://www.gnu.org/copyleft/.
-
-
-
-Each version of the License is given a distinguishing
-version number. If the Document specifies that a particular
-numbered version of this License "or any later version" applies to
-it, you have the option of following the terms and conditions
-either of that specified version or of any later version that has
-been published (not as a draft) by the Free Software Foundation.
-If the Document does not specify a version number of this License,
-you may choose any version ever published (not as a draft) by the
-Free Software Foundation.
-
-; How to use this License for your documents:
-
-To use this License in a document you have written, include
-a copy of the License in the document and put the following
-copyright and license notices just after the title page:
-
-
-
-
-
- Copyright (c) YEAR YOUR NAME.
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.1
- or any later version published by the Free Software Foundation;
- with the Invariant Sections being LIST THEIR TITLES, with the
- Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
- A copy of the license is included in the section entitled "GNU
- Free Documentation License".
-
-
-
-
-
-If you have no Invariant Sections, write "with no Invariant
-Sections" instead of saying which ones are invariant. If you have
-no Front-Cover Texts, write "no Front-Cover Texts" instead of
-"Front-Cover Texts being LIST"; likewise for Back-Cover
-Texts.
-
-
-
-If your document contains nontrivial examples of program
-code, we recommend releasing these examples in parallel under your
-choice of free software license, such as the GNU General Public
-License, to permit their use in free software
.
+Describe
[HowToAssemblyHOWTO
] here.