HLA v2.6 for FreeBSD is now available

2009-11-08 Thread Randall Hyde
Hi All,
HLA v2.6 for FreeBSD is now available from the HLA download site on Webster:
http://homepage.mac.com/randyhyde/webster.cs.ucr.edu/HighLevelAsm/dnld.html

v2.6 includes full PE/COFF native code generation for Win32, ELF native code 
generation for Linux and FreeBSD, and Mach-O native code generation for Mac OS 
X.  v2.6 also implements a new overloads declaration for high-level-like 
procedure, method, and iterator calls.  This is above and beyond the usual set 
of defect corrections.

HLA is a high-level 32-bit x86 assembler that supports the 32-bit 80x86 
instruction set as well as adding a set of high-level-like language features. 
More information on HLA is available at http://webster.cs.ucr.edu.
Cheers,
Randy Hyde
___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org


chdir/rmdir

2008-04-19 Thread Randall Hyde
Hi,
I recently made a couple of calls like the following

// currently in /x/y/z

chdir( /x/y );
rmdir( /x/y/z );

When I did at gwd call, it returned /x/y/z along with ENOTDIR.
Is this a known issue?

I'm making low-level (assembly) calls via int 0x80 to do the above (not C 
stdlib), though I can't imagine that's causing the problem (then again, I've 
written broken code before :-(, this wouldn't be the first time I've messed up, 
though I have studied the code very closely and the same function calls work 
fine in other contexts).

Thanks for any input,
Randy Hyde
P.S. I noticed that the man pages said something about using open on . and 
fchdir to more robustly switch back to some previous directory; this is what 
has me wondering if there is a problem with executing statements like the above.


___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to [EMAIL PROTECTED]


Re: HLA v1.100 is now available for FreeBSD

2008-01-28 Thread Randall Hyde


This looks like it might be interesting.

Two comments:
1) Is there a FreeBSD port available?


I assume you mean the PORTS distribution format. The answer is no, not yet. 
Someday I'll take the time to figure out how to do this (and RPMs or comparable 
things under Linux). In the meantime, all it really takes to install the guy is 
to unzip/tar it and set a couple of environment variables up. No big deal for 
most BSD/Linux users.  OTOH, I do realize the benefit of having an installation 
program, so it's on the list of things to do.

If there is an easy way to automate this in a make file (which I use to build 
by releases with), I'd be more than happy to include it when I release the next 
version; assuming someone is nice enough to show me how to do it.



2) Do you have any plans to target anything other than 80x86?  HLA looks
   like it would be very handy as a development tool for embedded micros
   (PIC, Atmel etc).


Long ago (pre-x86 Macintoshes) I was considering the PowerPC. That's history 
today, however. The ARM looks like fun, but

The big goal I have right now is to get back to work on HLA v2.0 and get that 
generating code. For example, the port to the (x86) Macintosh has to wait for 
HLA v2.0 and getting a Mac OS X port operational is my next big task after HLA 
v2.0.

Then, of course, the next most important thing is a port to the x86-64 
(actually, HLA v2.0 contains the facilities for this, they just have to be 
activated).  Then I can start looking at other processors.


OTOH, the HLA compile-time language (i.e., macro language) is sufficiently 
powerful that you can actually *write* assemblers for other CPUs with the CTL.  
It would be slow compiling such programs, but it's certainly possible.

And if you *really* want to move ahead with different CPUs today (I emphasize 
*you*, not *me*), I have posted the existing code for the HLA v2.0 compiler on 
Webster (http://webster.cs.ucr.edu/AsmTools/HLA/hla2/0_hla2.html). Currently, 
handling almost all of the declarations is complete (no machine instructions 
yet). So it's in the perfect state to modify for a different CPU.
Cheers,
Randy Hyde


___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to [EMAIL PROTECTED]


HLA v1.100 is now available for FreeBSD

2008-01-25 Thread Randall Hyde
Hi All,

I am pleased to announce that HLA v1.100 and the HLA standard library (v3.0) 
are now running natively under FreeBSD.  For those who are unfamiliar with the 
product, HLA is a High Level Assembler for the 80x86. It allows you to write 
portable 80x86 code that runs under Windows, Linux, or FreeBSD with nothing 
more than a recompile.

The product is available at the following URL

http://webster.cs.ucr.edu/AsmTools/HLA/dnld.html

HLA v1.100 is a major release of the HLA system.
In addition to a few defect corrections, this release
contains several major changes:

1) The system now ships, standard, 
with the HLA stdlib v3.0 library code. This new
library is a big improvement over the v1.x stdlib
code shipped with earlier (e.g., HLA v1.99) versions
of the assembler.

2) HLA v1.100 (and the stdlib v3.0) now supports the
FreeBSD operating system. Programs written for Windows
and Linux can be ported to FreeBSD with nothing more
than a recompile.

3) The standard example code has been modified to compile
with, and use, the HLA stdlib v3.0.

4) The Art of Assembly examples have been modified to
compile and run with the new stdlib (note that the
frozen version of HLA, HLA v1.99, still provides links
to the original AoA example code that uses stdlib v1.x,
as shipped with HLA v1.99).

5) The stdlib documentation has been updated to reflect
the use of the new library.

-- -- 
HLA, the High-Level Assembler, is a powerful macro 
assembly language development system that runs under 
Windows, Linux, and FreeBSD operating systems. Carefully- 
written applications are portable between the operating 
systems with nothing more than a recompile of the source 
file. 

From a features point of view, HLA is one of the most 
powerful assemblers ever written. It's macro and 
compile-time language facilities far exceed those found 
in other assemblers. 

HLA was specifically designed to make learning and writing 
assembly language as easy as possible. HLA is fully supported 
by tons of documentation, example code, and other things 
that beginning and advanced programmers will find useful. 

The 32-bit edition of The Art of Assembly Language 
(No Starch Press) teaches introductory assembly language 
programming using HLA and is one of the most often-cited 
textbooks on the subject. You can read The Art of Assembly 
on-line at http://webster.cs.ucr.edu/AoA/ index.html. 
The HLA system also includes the HLA Standard Library, 
a collection of hundreds of ready to use library routines that 
simplify assembly language programming and provide (among 
other things) a usable interface to the underlying operating system. 

Full source code to the Standard Library is available.
Most of the code of the HLA system is public domain 
and you may freely use that code as you please. 


___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to [EMAIL PROTECTED]


Re: Some FreeBSD performance Issues

2007-11-12 Thread Randall Hyde



 Hello Randy,

 First, let me out myself as a fan of yours. It was your book that got me
 started on ASM and taught me a lot about computers and logic, plus it
 provided some entertainment and mental sustenance in pretty boring
 times, so thanks!

 Now, as for your problem: I think I have to agree with the others in
 this thread when they say that the problem likely isn't in FreeBSD. The
 following C program, which uses the read(2) call to read socket.h
 byte-by-byte, runs quickly (0.05 secs on my 2.1GHz system, measured with
 time(1)):


 code snipped


 This should be quite equivalent to your second and third code fragment;
 it does one read system call per byte, no buffering involved. This leads
 me to believe that the slowdown occurs in your fileio.read wrapper, or
 maybe in the process setup/teardown process.

Actually, I'd already gone that route. Looking at the wrong copy of read.c
(in the libstd directory) is what had me convinced of the buffering issue.

However, the code you posted is still going through libc, so I'm not ready
to trust that.
However, I just used the syscall system call to make the same INT $80 calls
from C that I'm making from the assembly code and that seems to work okay.

I've disassembled the code for both programs (my assembly code and the C
code that's making direct system calls) and for the life of me, I can't
(yet) see any reason why the C code would run two orders of magnitude
faster. I guess I'm going to have to look at the start-up code used by the C
run-time system and see if it is doing something funny.

Note to others: still haven't done ktrace, through looking at the object
code for the two programs it's hard to believe that there would be extra
system calls taking place or anything like that. If I had to guess at this
point, I'd say that my calls are blocking a lot longer than the C program's.
My user and system times are low, but real time is very high.  Still haven't
done ktrace. I'll try that when I get back into town later this week.

Cheers,
Randy Hyde

___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to [EMAIL PROTECTED]


Re: Some FreeBSD performance Issues

2007-11-11 Thread Randall Hyde
Hi All,

Well, I've done some sleuthing and discovered some issues.

First, the dd command produced approximately the same results everyone
else was getting. So I rewrote a version of my test code in C using the
stdlib read call and it had really great performance. Not understanding
why C's code was so much faster, I dug into the source code and discovered
that open/read/write/etc. use *buffered* I/O (which explains why dd
performs so well).

At this point I'm not sure why FreeBSD's API call is so slow (btw, it's not
the system call that's responsible, if I make several additional API calls
on each read, e.g., doing lseeks, this has only a marginal impact on
performance). But it's pretty clear that if I expect reasonable performance
in my own library I'm going to have to do the same thing that glib does and
switch over to buffered I/O.  Pain in the butt, but there's nothing else to
do at this point.
Cheers,
Randy Hyde

___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to [EMAIL PROTECTED]


Re: Some FreeBSD performance Issues

2007-11-09 Thread Randall Hyde


 You should also carefully do an strace or similar on
 Windows and Linux as well.  You may find that you're
 doing a system call per byte on FreeBSD but not on
 those other systems.

Certainly this might be possible under Windows, as I have no idea what
happens once I link in one of the various kernel.dll modules. Under Linux,
however, I am directly issuing the INT($80) instruction, so one system call
per byte is being made.

To answer a different question in the thread, I'm pretty sure I'm making
only one FreeBSD call per byte, at least in one of the cases I posted.
You'll note that one of the test examples made a call to bsd.read( fd,
buffer, 1 );. That's just a function I wrote that rearranges parameters and
sets up the stack, executes an INT( $80 ) instruction, cleans up the stack,
and returns to the user. In a different test example I *was* making a couple
of calls, (specifically to lseek to check to see if I'd reached EOF), but
the performance difference was minimal (i.e., the time was being spent in
the read call). I have to run off for an appt right now, but I'll try the
dd command later today and see what that reports.

I wonder if I'm only getting one character output per time slice, or
something like that?
Cheers,
Randy Hyde

___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to [EMAIL PROTECTED]


Some FreeBSD performance Issues

2007-11-08 Thread Randall Hyde
Hi All,

I recently ported my HLA (High Level Assembler) compiler to FreeBSD and,
along with it, the HLA Standard Library. I have a performance-related
question concerning file I/O.

It appears that character-at-a-time file I/O is *exceptionally* slow. Yes, I
realize that when processing large files I really ought to be doing
block/buffered I/O to get the best performance, but for certain library
routines I've written it's been far more convenient to do
character-at-a-time I/O rather than deal with all the buffering issues.  In
the past, while slower, this character-at-a-time paradigm has provided
reasonable, though not stellar, performance under Windows and Linux.
However, with the port to FreeBSD I'm seeing a three-orders-of-magnitude
performance loss.  Here's my little test program:

program t;
#include( stdlib.hhf )
//#include( bsd.hhf )

static
f   :dword;
buffer  :char[64*1024];

begin t;

fileio.open( socket.h, fileio.r );
mov( eax, f );
#if( false )

// Windows: 0.25 seconds
// BSD: 5.2 seconds

while( !fileio.eof( f )) do

fileio.getc( f );
//stdout.put( (type char al ));

endwhile;

#elseif( false )

// Windows: 0.0 seconds (below 1ms threshold)
// BSD: 5.2 seconds

forever

fileio.read( f, buffer, 1 );
breakif( eax  1 );
//stdout.putc( buffer[0] );

endfor;

#elseif( false )

// BSD: 5.1 seconds

forever

bsd.read( f, buffer, 1 );
breakif( @c );
breakif( eax  1 );
//stdout.putc( buffer[0] );

endfor;

#else

// BSD: 0.016 seconds

bsd.read( f, buffer, 64*1024 );
//stdout.write( buffer, eax );

#endif

fileio.close( f );

end t;

(I selectively set one of the conditionals to true to run a different test;
yeah, this is HLA assembly code, but I suspect that most people who can read
C can *mostly* figure out what's going on here).

The fileio.open call is basically a bsd.open( socket.h, bsd.O_RDONLY );
API call.  The socket.h file is about 19K long (it's from the FreeBSD
include file set). In particular, I would draw your attention to the first
two tests that do character-at-a-time I/O. The difference in performance
between Windows and FreeBSD is dramatic (note: Linux numbers are comparable
to Windows). Just to make sure that the library code wasn't doing something
incredibly stupid, the third test makes a direct FreeBSD API call to read
the data a byte at a time -- the results are comparable to the first two
tests. Finally, I read the whole file at once, just to make sure the problem
was character-at-a-time I/O (which obviously is the problem).  Naturally, at
one point I'd uncommented all the output statements to verify that I was
reading the entire file -- no problem there.

Is this really the performance I can expect from FreeBSD when doing
character I/O this way? Is is there some tuning parameter I can set to
change internal buffering or something?  From this numbers, if I had to
guess, I'd suspect that FreeBSD was re-reading the entire 4K (or whatever)
block from the file cache everytime I read a single character. Can anyone
explain what's going on here?  I'm loathe to change my fileio module to add
buffering as that will create some subtle semantic differences that could
break existing code (I do have an object-oriented file I/O class that I'm
going to use to implement buffered I/O, I would prefer to leave the fileio
module unbuffered, if possible).

And a more general question: if this is the way FreeBSD works, should
something be done about it?
Thanks,
Randy Hyde

___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to [EMAIL PROTECTED]


Re: getc in BSD (was FLEX issues)

2006-07-05 Thread Randall Hyde


-Original Message-
From: Steve Kargl [EMAIL PROTECTED]
Sent: Jul 4, 2006 11:40 AM
To: Randall Hyde [EMAIL PROTECTED]
Cc: freebsd-hackers@freebsd.org
Subject: Re: getc in BSD (was FLEX issues)

On Mon, Jul 03, 2006 at 11:34:41AM -0700, Randall Hyde wrote:
 
 The error reported is syntax error before numeric constant.
 This kind of gives me the impression that getc is defined a bit
 differently under FreeBSD than other environments?  Any ideas?

As others have stated, getc() is implemented via a macro,
which may depend on other macros.  In reading the flex 
NEWS file, I ran across the -Cr option.  I added this 
option to your flex command, and the hla.flx file is 
processed and produces a compilable lex.yy.c.

-- 
Steve

Yeah, getc was the problem. I modified flex (via one the various macros it 
defines) to emit fgetc rather than getc and the problem went away.  I'll have 
to try the -Cr option and see what happens there.
Cheers,
Randy Hyde


___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to [EMAIL PROTECTED]


getc in BSD (was FLEX issues)

2006-07-03 Thread Randall Hyde
Well, having a little bit of time to play around with the issues I'm having
with Flex under GCC, I've determined that the problem occurs in the
following code fragment:

  for
  (
   n = 0;
n  num_to_read
 (
 c =
  getcError occurs on this line
  (
   yyin
  )
)
 !=
  (EOF) 
1
c != 'n';
   ++n
  )


The error reported is syntax error before numeric constant.
This kind of gives me the impression that getc is defined a bit
differently under FreeBSD than other environments?  Any ideas?
Cheers,
Randy Hyde

___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to [EMAIL PROTECTED]


Re: contiguous memory allocation problem

2006-07-02 Thread Randall Hyde


- Original Message - 
From: Peter Jeremy [EMAIL PROTECTED]
To: Randall Hyde [EMAIL PROTECTED]
Sent: Saturday, July 01, 2006 11:10 PM
Subject: Re: FLEX, was Re: Return value of malloc(0)

The following compiles without error:
%{
typedef int YYSTYPE;
typedef int YYLTYPE;

/*
** Allow for a recursive version of Bison parser.
*/
#undef YY_DECL
#define YY_DECL int yylex( YYSTYPE *yylval, YYLTYPE *yylloc)
%}

%%
. ECHO;
%%

I'll accept that you are having a problem getting HLA to build.  No-one
else is reporting problems.  If you want assistance from other people
then you are going to need to help by either providing a test case to
reproduce the failure you are seeing or you are going to need to provide
the pre-processed context where the error occurs.



Uh, is the above *not* the test case you are asking for?
Does this particular code snippet compile for you? If so, then I've
definitely got some configuration problems with GCC on my machine.

BTW, if I haven't made myself clear, the problem with the code above is a
GCC error, not a FLEX error. That is, FLEX happily produces the yy.lex.c
output file, GCC under FreeBSD rejects the source code it produces. Yet that
*same exact* source code compiles just fine under Linux with GCC, Windows
with Borland C++, and Windows with VC++.

Creating a recursive lexer is a documented feature of FLEX. Indeed, I used
the example present in the FLEX documentation to pull this off. And I've
been using this code for about eight years on Windows and about four years
on Linux.  Perhaps FreeBSD types have never tried to create a recursive
parser/lexer and haven't had to deal with this issue, but as you can see
from the code snippet above, this really has nothing to do with HLA, per se,
other than the fact that it uses a recursive lexer/parser.

And the fact remains, the code compiles just fine under Windows and Linux.
The compilation uses a documented feature of FLEX. There *is* a problem with
the implementation of GCC under FreeBSD (or header files under FreeBSD).
It's not specific to HLA. And I can't imagine how to give you a better test
case than the code above.
Cheers,
Randy Hyde

___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to [EMAIL PROTECTED]


Re: FLEX, was Re: Return value of malloc(0)

2006-06-29 Thread Randall Hyde


-Original Message-

How about feeding the C source through the preprocessor, stripping out
the #line directives, compiling it and posting the exact gcc error and
source context.

Okay, I'll try that when I get home. But I was kind of under the impression 
that *GCC* runs the preprocessor on the input, during compilation :-).


It may be a gcc bug, it may be a HLA bug or it could be an interaction
between the FreeBSD headers and HLA.

None of the code listed has *anything* to do with the HLA.FLX source (and 
certainly nothing to do with the rest of the HLA source code). It is quite 
possible that some FreeBSD headers conflict with this section of the FLEX 
output (remember, this is *canned* output code from FLEX, this is not generated 
in response to any FLEX input code).  That's why my original question was so 
generic and not specific -- this would appear to be a generic problem with 
using FLEX output under BSD and I thought a quick question would affirm/deny 
that thought.
Cheers,
Randy Hyde



___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to [EMAIL PROTECTED]


Re: FLEX, was Re: Return value of malloc(0)

2006-06-29 Thread Randall Hyde


-Original Message-
From: Thomas David Rivers [EMAIL PROTECTED]
Sent: Jun 29, 2006 3:17 AM
To: freebsd-hackers@freebsd.org, [EMAIL PROTECTED]
Subject: Re: FLEX, was Re: Return value of malloc(0)

Randall Hyde [EMAIL PROTECTED]
 
 BTW, if anyone is intrested in the full FLEX source, it's part of the HLA
 (High Level Assembler) source package found here:
 
 
 http://webster.cs.ucr.edu/AsmTools/HLA/HLAv1.84/hlasrc.zip
 

Just wondering if those guys knew that IBM calls their mainframe assembler
the High Level Assembler, which they abbreviate HLASM.

These guys would be just me, and I'm quite aware of HLASM. Of course, the term 
High Level Assembler predated IBM's HLASM by many years (indeed, the phrase 
was used a bit in the late 1960s, see Salomon's book for details).  


This isn't an x86 assembler like HLA - it's a z/Architecture 
(mainframe) assembler, very different beast indeed.

Yes, their concept of High Level meant fancy macro facilities. Not back for a 
1980's-era assembler.


But - they may want to pick a new name, lest they incur the wrath
of IBM's lawyers.   I think IBM took that name in the 80s.

Again, the generic term High Level Assembler predated HLASM, and HLA and HLASM 
are two different things. Further, there was an HLA for the Amiga some time 
back. Again, it's not like this term is terribly original.  And I seriously 
doubt if IBM really cares at this point.



Also - it seems that 'webster.cs.ucr.edu' has gone missing
from DNS somehow; so I wasn't able to look at the source, although
I was able to look at the web pages thanks to Yahoo's cache.

Hmmm...
Webster is a relatively famous site, so that's unusual.
Cheers,
Randy Hyde

___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to [EMAIL PROTECTED]


Re: Return value of malloc(0)

2006-06-28 Thread Randall Hyde
Hi All,
I'm trying to port my compiler from Linux to freeBSD. It looked like a
simple job up to the point I ran my flex code through FLEX on freeBSD. When
GCC processes lex.yy.c I get a complaint about an illegal numeric constant
in yy_get_next_buffer, which is all FLEX generated (or prewritten) code. The
thing compiler just fine under Linux. Any ideas?
Cheers,
Randy Hyde

___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to [EMAIL PROTECTED]


FLEX, was Re: Return value of malloc(0)

2006-06-28 Thread Randall Hyde
 

 Without seeing the code or the actual error message, I'm
 guessing the answer is 42.  Perhaps, some detail might
 be appropriate.

I seriously doubt seeing the code  will do much good.
Here's the offending line:

  YY_INPUT( (yy_current_buffer-yy_ch_buf[number_to_move]),
   yy_n_chars, num_to_read );


This is from
static int yy_get_next_buffer()

Which is part of the canned code that comes with FLEX.
Compiles just fine under Linux. Linux has a slightly newer version of GCC,
but I've been compiling this code on Windows (Borland and VC++) as well as
Linux for years without a problem (i.e., older versions of GCC).

BTW, if anyone is intrested in the full FLEX source, it's part of the HLA
(High Level Assembler) source package found here:


http://webster.cs.ucr.edu/AsmTools/HLA/HLAv1.84/hlasrc.zip

I compiled the FLEX code with the command line:

flex -8 -i hla.flx

This works fine, then I compile the GCC output with

gcc -DfreeBSD -c -o lex.yy.o lex.yy.c

and it stops with syntax error before numeric constant.

As this code is in part of the FLEX-supplied C code, I would think that this
problem would be independent of my particular flex code. BTW, I've tried
using both the FLEX I use on Linux under BSD as well as the BSD-supplied
version. I've even taken the FLEX output from freeBSD and compiled it under
Linux (it compiles successfully.

I'm using GCC 3.3.5 under Linux, 3.4.4 under BSD. Any known problems with
3.4.4 that would cause this?

cheers,
Randy Hyde

___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to [EMAIL PROTECTED]