Assembler Tutorial part #1 of #9:
ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
º Adam's Assembler Tutorial 1.0 ÇÄ¿
º º ³
º PART I º ³
ÈÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Version : 1.2
Date : 16-02-1996
Contact : This email address is being protected from spambots. You need JavaScript enabled to view it.
http://www.faroc.com.au/~blackcat
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
What is Assembler?
--------------------
Assembler has got to be one of my favourite languages to work with. Not that
it's an easy language at first, but when you become familiar with it, you'll
realise just how logical it is.
Assembler is a low-level language which you can use to give you programs added
speed on slow tasks. Basically it consists of statements which represent
machine language instructions, and as it's nearly machine code, it's fast.
In the early days before the 8086 came about, yes, there were humans on the
Earth back then, :), programming was not an easy task. When the first
computers were developed, programming had to be done in machine code which was
_not_ an easy task, and so Assembler was born.
Why use it?
-------------
As I said before, Assembler is fast. It also allows you to speak to the
machine at hardware level, and gives you much greater control and flexibility
over the PC. One of the other advantages of Assembler is that it allows you
to impress your friends by entering pages of seemingly incomprehensible code.
Watch them gather round you and be impressed/laugh at your nerdiness? :)
How did this tutorial come about?
-----------------------------------
Well, I had a couple of friends who wanted to learn Assembler to speed up
their Pascal programs, so I gave them some Assembler Tutorials I had. While
these tutorials had all the information you'd ever need, they were not written
for the novice to easily understand, so I decided to write my own.
If you're using this tutorial and find it useful and informative, then please
mail me. I appreciate feedback.
LESSON 1 - Registers
----------------------
When you're working with Assembler, you'll have to use registers. You can
think of these as variables already defined for you. The most common are
listed below:
þ AX - the accumulator. Comprises AH and AL, the high and low bytes
of AX. Commonly used in mathematical and I/O operations.
þ BX - the base. Comprises BH and BL. Commonly used as a base or
pointer register.
þ CX - the counter. Comprises CH and CL. Used often in loops.
þ DX - the displacement, similar to the base register. Comprises DH and
DL. I think you're getting the pattern now.
These registers are defined as general purpose registers as we can really
store anything we want in them. They are also 16-bit registers, meaning that
we can store a positive integer from 0 to 65535, or a negative integer from
-32768 to 32768.
Incidently, the matter of the high and low byte of these resgisters has caused
quite a bit of confusion in the past, so I'll try to give it some explaination
here. AX has a range of 0 to FFFFh. This means that you have a range of
0 to FFh for AH and AL. (If you're a little concerned with the hex, don't
worry. Next tutorial will cover it.)
Now if we were to store 0A4Ch in AX, AH will contain 0Ah, and AL will contain
4Ch. Get the idea? This is a pretty important concept, and I'll cover it in
more depth next tute.
The segment registers: - ta da!
These are some other registers which we will not cover for the first few
tutorials, but will look at in greater depth later. They are immensely handy,
but can also be dangerous.
þ CS - the code segment. The block of memory where the code is stored.
DON'T fool around with this one unless you know what you are doing.
þ DS - the data segment. The area in memory where the data is stored.
During block operations when vast blocks of data are moved, this is
the segment which the CPU commonly refers to.
þ ES - the extra segment. Just another data segment, but this one is
commonly used when accessing the video.
þ SS - no, not the German army. This is the stack segment, in which the
CPU stores return addresses from subroutines. Take care with this
one. :)
Some others you will commonly use are:
þ SI - the source index. Often used in conjuction with block move
instructions. This is a pointer within a segment, usually DS, that
is read from by the CPU.
þ DI - the destination index. Again, you'll use it a lot. Another pointer
within a segment, often ES, that is written to by the CPU.
þ BP - the base pointer, used in conjunction with the stack segment. We
won't be using it a lot.
þ SP - the stack pointer, commonly used with the stack segment. DON'T fool
around with this one at all. :|
By now you should understand what registers are. There are other registers
too, and things known as flags, but we will not go into these as yet.
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
THINGS TO DO:
1) Learn the various registers off by heart.
2) Get a calculator that supports hexadecimal - damn handy, or a least an
ASCII chart. That covers 0 - 255, or 0h to FFh.
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
LESSON 2 - The 8086 instruction set:
--------------------------------------
Okay, so you've learnt about registers, but how do you use them, and how do
you code in Assembler? Well, first you'll need some instructions. The
following instructions can be used on all CPU's from the 8086 up.
þ MOV , - MOVE. This instruction allows you to MOVE a value
into a location in memory.
EG: MOV AX, 13h
This would move 13h (19 decimal) into the AX
regsister. So if AX had previously held 0, it
would now hold 13h.
THIS ONLY MOVES THE VALUE INTO THE REGISTER, IT
DOES NOT DO ANYTHING.
EG: (In Pascal) AX := $13;
þ INT - INTERRUPT. This instruction generates an interupt.
You can think of this as a bit like a procedure.
EG: INT 10h
Would generate interrupt 10h (16 decimal). Now
what this would do depends on the contents of the
AH register, among other things. For instance,
if AX = 13h and interrupt 10h was generated, the
video would be placed into 320x200x256 mode.
More accurately:
AH would equal 00 - set mode subfunction, and
AL would equal 13h - 320x200x256 graphics mode.
However, if AH = 2h, and interrupt 16h was
generated, this would instruct the CPU to check if
a keypress was waiting in the keyboard buffer.
If AH = 2h, and BH = 0h and interrupt 10h was
generated, then the CPU would move the cursor to
the X location in DL and the Y location in DH.
DO NOT WORRY ABOUT THIS FOR NOW, WE WILL COVER IT
IN GREATER DETAIL LATER.
þ ADD - ADD. This instruction adds a number to the value
stored in dest.
EG: MOV AX, 0h ; AX now equals 0h
ADD AX, 5h ; AX now equals 5h
ADD AX, 10h ; AX now equals 15h
Pretty simple, huh?
þ SUB - SUBTRACT. I think you can guess what this does.
EG: MOV AX, 13h ; AX now equals 13h (19 dec)
SUB AX, 5h ; AX now equals 0Eh (14 dec)
þ DEC - DECREMENTS something.
EG: MOV AX, 13h ; AX now equals 13h
DEC AX ; AX now equals 12h
þ INC - INCREMENTS something.
EG: MOV AX, 13h ; Take a guess
INC AX ; AX = AX + 1
þ JMP - JUMPS to a location.
EG: JMP 020Ah ; Jump to the instruction at 020Ah
JMP @MyLabel ; Jump to @MyLabel.
DON'T WORRY IF THIS IS A LITTLE CONFUSING - IT GETS
WORSE! THERE ARE 28 DIFFERENT JUMP INSTRUCTIONS TO
LEARN, MAYBE MORE. WE'LL COVER THEM LATER.
þ CALL - CALLS a subfunction.
EG: Procedure MyProc;
Begin { MyProc }
{ ... }
End; { MyProc }
Begin { Main }
Asm
CALL MyProc ; Guess what this does!
End;
End.
OR: CALL F6E0h ; Call subfunction at F6E0h
þ LOOP