Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 15 Jun 1996 07:45:09 +0200 (MET DST)
From:      grog@lemis.de (Greg Lehey)
To:        randyd@nconnect.net (Randy DuCharme)
Cc:        questions@freebsd.org
Subject:   Re: Assembler programming
Message-ID:  <199606150545.HAA13124@allegro.lemis.de>
In-Reply-To: <31C18946.2807@nconnect.net> from "Randy DuCharme" at Jun 14, 96 10:46:14 am

next in thread | previous in thread | raw e-mail | index | archive | help
Randy DuCharme writes:
>
> Greetings,
>      This may be another dumb question, but can one do 'pure' assembly
> language programming under FreeBSD?

Yes.

> If so, how?

With some difficulty.  The assembler is called as, and is a standard
part of the system.  It's used by the compiler, for example, which
outputs assembler code.  Unfortunately, the code is not compatible
with Intel mnemonics and syntax.  Here's an example:

+ To see how this all works, let's take the following small program and look at
+ different aspects of what the compiler and assembler do with it in the next few
+ sections:
+ 
+ char global_text [] = "This is global text in the data area";
+ void inc (int *x, int *y)
+ {
+   if (*x)
+     (*x)++;
+   else
+     (*y)++;
+   puts (global_text);         /* this is an external function */
+   puts ("That's all, folks");
+   }
+ 
+ We compile this program on a BSD/OS machine using gcc version 2.5.8, with
+ maximum optimization and debugging symbols:
+ 
+ $ gcc -O2 -g -S winc.c
+ 
+ The -S flag tells the compiler control program to stop after
+ running the compiler.  It stores the assembly output in winc.s, which
+ looks like this:
+ 
+         .file   "winc.c"
+ gcc2_compiled.:
+ ___gnu_compiled_c:
+ .stabs "/usr/lemis/book/porting/grot/",100,0,0,Ltext0 name of the source directory
+ .stabs "winc.c",100,0,0,Ltext0  name of the source file
+ .text                           select text section
+ Ltext0:                         internal label: start of text
+ .stabs "int:t1=r1;-2147483648;2147483647;",128,0,0,0
+ .stabs "char:t2=r2;0;127;",128,0,0,0
+ ...  a whole lot of standard debugging output omitted
+ .stabs "void:t19=19",128,0,0,0
+ .globl _global_text             specify an externally defined symbol
+ .data                           select data section
+ .stabs "global_text:G20=ar1;0;36;2",32,0,1,0  debug info for global symbol
+ _global_text:                   variable label
+         .ascii "This is global text in the data area\0" and text
+ .text                           select text section
+ LC0:
+         .ascii "That's all, folks\0"
+         .align 2                start on a 16 bit boundary
+ .globl _inc                     define the function inc to be external
+ _inc:                           start of function inc
+         .stabd 68,0,3           debug information: start of line 3
+         pushl %ebp
+         movl %esp,%ebp
+         movl 8(%ebp),%eax
+         movl 12(%ebp),%edx
+         .stabd 68,0,4           debug information: start of line 4
+ LBB2:
+         cmpl $0,(%eax)
+         je L2
+         .stabd 68,0,5           debug information: start of line 5
+         incl (%eax)
+         jmp L3
+         .align 2,0x90
+ L2:
+         .stabd 68,0,7           debug information: start of line 7
+         incl (%edx)
+ L3:
+         .stabd 68,0,8           debug information: start of line 8
+         pushl $_global_text
+         call _puts
+         .stabd 68,0,9           debug information: start of line 9
+         pushl $LC0
+         call _puts
+         .stabd 68,0,10          debug information: start of line 10
+ LBE2:
+         leave
+         ret
+ .stabs "inc:F19",36,0,3,_inc    debug information for inc
+ .stabs "x:p21=*1",160,0,2,8     debug information for x
+ .stabs "y:p21",160,0,2,1        debug information for y
+ .stabs "x:r21",64,0,2,0
+ .stabs "y:r21",64,0,2,2
+ .stabn 192,0,0,LBB2
+ .stabn 224,0,0,LBE2


> In DOS / WINNT I used MASM 6.11.

Completely different, I'm afraid.

> Any good books on this subject?

Nothing really, I suppose.  My "Porting UNIX Software" (O'Reilly) has
a number of examples, but it's not an introduction.  The gas (GNU as)
documentation explains a little bit, but it's not an introduction
either.

> Any recommendations on GOOD reading on the GCC compiler & libraries?

Mike Loukides and Andy Oram (O'Reilly) are writing a book on using GNU
software.  I don't know when it'll appear, but it should be Real Soon
Now.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199606150545.HAA13124>