DPRG List  

DPRG: Assembler (was Real good riddle.)

Subject: DPRG: Assembler (was Real good riddle.)
From: David Beckham dbeckham at bectec.com
Date: Sun Jul 27 00:53:49 CDT 1997

Kipton Moravec wrote:
> droid at bellatlantic.net wrote:
> >
> > [SNIP]
> >
> > The thing is...I don't know a thing about the assembler. I have seen some
> > example codes and to tell you the truth,,,this thing looks like
> > someone designed it while drinking the rest of his cappucino late at
> > night. I know that the PBasic wil compile the code for me but I can't run
> > away from it. I mean it will get me sooner or later. I can program in
> > other languages tough :
> > CBM Basic
> > Apple II Applesoft Basic
> > Qbasic
> > Boland C
> > Borland Turbo C++ (v 3.0 for DOS)
> > Borland Turbo Pascal 7.0(for DOS)
> >
> > All of these programming languages do make sense, maybe that's becasue
> > they are sort of human soun'a'like. Well, in the assembler it looks
> > rather differnt, you have all these registers, accumulators, and whole
> > lot of other stuff.
> >
> My first language was FORTRAN IV (1974), then COBOL (1975), then PL1
> (1978), then IBM 360 Assembler (1979). (Damn, am I old or what!) COBOL
> is more readable
> In C:
> PAY = Hourly_Rate * Hours_Worked;
> Multiply Hourly_Rate by Hours_Worked giving PAY;
> But I digress....
> Going from those languages to assembler is much more difficult than
> going from C to assembler. Why? Because C was designed to map nearly 1
> to 1 with PDP-8 Assembler.  Why is C the only language with ++ or --?
> (Postincrement, preincrement, postdecrement, predecrement) because the
> assembler had an increment (INC) and decrement (DEC) command, and since
> the value was in a register already, you might as well take advantage of
> it.
> For example, assume you had a line of C
> ANS = A + B++;
> In C it is pretty simple. You are telling the computer to go out and get
> the values from the memory locations designated A and B, add the values,
> put the answer in the memory location ANS, increment the value of B and
> store it back in memory (so it will be incremented next time you get
> it). In assembler, each step is it's own command.
>      LD      R0, A   ; Take the value in memory location A
>                      ; and put it in register 0 (R0)
>      LD      R1, B   ; Take the value in memory location B
>                      ; and put it in register 1 (R1)
>      ADD     R0, R1  ; Add the values of register 0, and
>                      ; register 1, and put the results in
>                      ; register 0.  (This wipes out the copy of
>                      ; A that was in the register)
>      STO     ANS,R0  ; Take the contents of register 0 and store it
>                      ; in the memory location ANS.
>      INC     R1      ; Add 1 to the value in R1.
>      STO     B, R1   ; Store the contents of register 1 in
>                      ; the memory location B
> This is pretty simple if the ADD is an integer add, and A and B are the
> same precision as the register, and the add does not overflow a
> register.  <grin>.  The compiler worries about all of that for you, when
> it makes the conversion from C to assembler.
> Depending on the project, and what I am trying to accomplish, sometimes,
> I prefer assembler!  If the project is small, and speed is important or
> I am manipulating hardware, I usually prefer assembler. If I have to
> worry about writing to the screen, and deal with user input I will NOT
> use assembler. Assembler should be used if you want to take advantage of
> the special features of the processor or controller.  If you want to be
> generic, then use a higher level language.
> Usually in robotics, we want to wring every bit of power out of our
> processor, and we are manipulating the robot hardware.  In 8051
> Assembler, I can set or clear a bit (or change one output wire.)
>      SET P0.1
> This takes the line number 1 on port 0 and raises it to a High or logic
> level 1.  I can not do that in C. In C I have to work with the whole
> byte.
>      P0value = P0value || 0b00000010;
>      OUTB(P0,P0value);
> That translates to
>      LD R0,P0value  ;Load the values from the memory location P0value
>      OR  R0,0b00000010 ; Perform a Logical Or operation on
>                       ; R0 and the immediate binary value, and
>                       ; put the results in R0.
>      STO P0value, RO  ; store the value in the memory mapped location.
> By using assembler, in this case I am 3x faster.  I have been told, that
> by using a highly optimized compiler, you can get about 1.1x slower in a
> high level language than by writing in assembler.  Unfortunately, we can
> not afford highly optimized compilers, so assembler is usually closer to
> twice as fast, and sometimes can be as much as 10x faster, in special
> cases.
> >
> > Since I want to, well I should say I HAVE to learn the assembler, I
> > believe that PIC chip should not be TOO complicated and I hope that it
> > will allow me to learn a WHOLE lot about the guts of teh whole
> > chip(Someone told me that to be efficient or even programm at all in the
> > assembler you HAVE to know the guts of a chip...kind of makes sense to
> > me... :(   )
> >
> Yup, You need to learn the "guts of the chip".  Fortunately, the guts in
> these types of processors are not very complicated.  It is very easy to
> understand microcontroller guts because they are simple. You should pick
> it up pretty fast.
> >
> > [snip bunch of stuff about books]
> >
> As far as I am concerned, you can't have too many books. (Until you run
> out of book shelves.) :) I have 5 books on the 8051 processor.  Some
> books explain different parts of the processor better.  If I am working
> on the serial port, I go to the book on the shelf that explains the
> serial port the best.  They all talk about the serial port, but one may
> give better examples, which makes me go faster.
> >
> > And another Q.
> >
> > I know that Borland C and C++ (for DOS) have something called IDE
> > compiler..if I'm not mistaken that means that the whole thing is
> > integrated in single editor. Every assembler I have seen on the WWW is
> > old style ...which means the you write your programm with the DOS EDIT
> > and then compile it back in DOS and all...is there an assembler for the
> > microcontrollers which would look similar to the C or C++ (not commands
> > of course, DUHHHH, the feel and integration where you can write your
> > program in the on window then press button and thing compiles it)
> >
> In general, NO.  At, least not for what we can afford.  I do not know
> about the PIC, but in general, the reason the Borland has the IDE is
> because you are running on the same computer you are editing and
> compiling on.  Your PC does not have a PIC in it. If you spend your
> bucks, and get an in-circuit emulater, then you have a chance to get an
> integrated environment.  Expect to spend $1000 to $5000 for the whole
> package, in-circuit emulator, integrated C, Assembler, and editor.
> The rest of us get evaluation boards, edit the program, compile it, link
> it, download it into the evaluation board, and run it, and see what
> happens.  Once it works, we load the program into an EPROM.
> Hope this helps you understand, better.
> Regards,
> Kip

Hi Kip,

Well, it helped ME understand it better!  Thanks, and we should consider
adding this to the FAQ that Jim's going to put together soon <wicked

More of this kind of material will make the hardware/software/robotics
"newbie's" life a lot more fun.  Figuring these things out can be a lot
of fun, and making the LED blink or the motor spin under software
control that you wrote your very own self is a great little thrill, but
reducing the "frustration quotient" is usually a very desireable end!

Thanks again,
- -- 
	David Beckham
	Home of ARBE-ONE the "Model T" of Mobile Bases.
	Now offering TCOMP tiny computers by Ray Butts,
	(ARBE-ONE's inventor).


More information about the DPRG mailing list